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
).