Usando o vim para visualizar o conteúdo de um arquivo de diretório

5

Pelo que entendi, em diretórios Linux são principalmente arquivos normais w / alguns tratamento especial (por exemplo, 'rm' um arquivo é ok; 'rm' um dir vai reclamar sem / r).

Quando executo os seguintes comandos bash:

mkdir foo; touch foo/f1.txt; touch foo/f2.txt; vim foo

O Vim mostra o conteúdo do arquivo de diretório foo como:

" ============================================================================
" Netrw Directory Listing                                        (netrw v136)
"   /home/capdigi/foo
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
" ============================================================================
../
f1.txt
f2.txt

Minhas perguntas são:

1) Por que o netrw é usado no contexto deste exemplo? De acordo com o link , o netrw "suporta a leitura e gravação de arquivos em redes". Este é apenas o componente que o vim usa para acesso uniforme ao diretório local / rede?

2) Por que o netrw é necessário? Como os diretórios são "principalmente" arquivos normais, eles não podem ser abertos como um arquivo normal sem nenhuma camada intermediária? Aka porque toda a fantasia?

    
por capdigi 13.08.2011 / 22:59

2 respostas

9

No sistema histórico Unix , os diretórios foram implementados como arquivos normais com um modo especial indicando que eles eram diretórios. Isso não é mais verdade em muitos sistemas de arquivos e sistemas operacionais modernos. Quando se trata das estruturas em disco, um diretório pode ou não ser representado como um blob de armazenamento semelhante a um arquivo, dependendo do sistema de arquivos. Quando se trata das interfaces do sistema operacional, existem chamadas de sistema separadas para acessar diretórios e arquivos regulares: opendir , readdir , rewinddir , closedir correspondendo a open , read , rewind , close respectivamente.

O software que lê um diretório deve usar as interfaces específicas do diretório. Quando você abre um diretório no Vim, ele não carrega seu conteúdo, como faria em um arquivo. O Vim não tem nenhuma manipulação nativa para diretórios: se você executar vim --noplugin em um diretório, o Vim reclamará que "foo" is a directory e não salvará o buffer pelo mesmo motivo.

O principal objetivo do netrw é acessar arquivos remotos (através de uma variedade de protocolos de rede). Como você não pode facilmente executar comandos como ls e cp nos diretórios que contêm esses arquivos remotos, o netrw inclui código para procurar diretórios e manipulá-los - é um gerenciador de arquivos e também um navegador de arquivos remoto. Essas capacidades de gerenciador de arquivos fazem sentido tanto local quanto remotamente, de modo que o netrw se registra como um manipulador para diretórios locais, além de arquivos e diretórios remotos.

    
por 13.08.2011 / 23:47
0

O acesso aos dados do diretório bruto não é possível. O acesso de gravação não é permitido porque isso pode levar a inconsistências no sistema de arquivos. O acesso de leitura não é fornecido porque o formato depende do sistema de arquivos. (Então, é melhor forçar algum nível de abstração) Veja também: Como os diretórios são implementados em sistemas de arquivos Unix?

No unix, vim usará a interface opendir , readdir , closedir (consulte manpages) para ler as entradas de diretório uma por uma, sem poder acessar os dados brutos. Eu acho que Netrw é apenas uma abstração de nível mais alto para esta interface, que se estende a vários sistemas de arquivos 'não-unix'.

    
por 13.08.2011 / 23:42