O plugin Vim netrw realmente exibe o conteúdo do arquivo de diretório?

1
O

netrw plugin em Vim permite ver arquivos de diretório. Exemplo de fluxo aqui eu inicio Vim com vim . :

" ============================================================================
" Netrw Directory Listing                                        (netrw v155)
"   /root/vim/code/files
"   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:special
" ==============================================================================
../                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
./
letters/
mvc/
.chapters
a.txt
b.txt
mvc_paths.vim

É realmente possível que Vim veja o conteúdo dos arquivos de diretório? Por exemplo, cat . , less . , hexdump . , etc, todos falham com a mensagem de erro . is a directory . Ou o netrw plugin simplesmente lista o conteúdo do diretório e, assim, dá a impressão de que o arquivo de diretório atual está aberto?

    
por Martin 06.08.2016 / 13:48

1 resposta

1

Ler um diretório realmente não acontece como um arquivo. Isso acontece com a chamada do sistema readdr . Veja man 2 readdir para a implementação antiga como uma chamada de sistema pura e man 3 readdir para o wrapper (por favor, não use a implementação antiga).

No entanto, o netrw do Vim não executa nada parecido. Ele simplesmente chama ls ou executa globbing (leia abaixo para entender quando ele faz um e quando o outro) e analisa a saída disso.

Configurando netrw você tem opções de como ele chama ls em sistemas remotos . Você pode definir o comando de listagem no seu vimrc para conexões SSH e FTP da seguinte forma (esses são os padrões):

let g:netrw_list_cmd = 'ssh HOSTNAME ls -Fa'
let g:netrw_ftp_list_cmd = 'ls -lF'

(Você pode até definir isso para algo diferente de ls para sistemas FTP que não têm ls , sim, existem alguns, raros, que não têm isso.)

Para listagens locais netrw executa globbing e chama getftype() para decorar o arquivo ( / para diretórios, @ para links, etc.). Em autoload/netrw.vim no procedimento s:LocalListing() , o seguinte é executado:

let dirname    = b:netrw_curdir
let dirnamelen = strlen(b:netrw_curdir)
let filelist   = s:NetrwGlob(dirname,"*",0)  " here is the globbing of '*'
let filelist   = filelist + s:NetrwGlob(dirname,".*",0)  " and here '.*'

Em seguida, getftype() é chamado em todos os arquivos em filelist .

Em suma, netrw confia no fato de que o Vim tem a função glob() e o Vim, por sua vez, executa uma chamada glob ( man 3 glob ).

    
por 06.08.2016 / 18:17

Tags