netrw
插件Vim
允许人们查看目录文件。我在这里举个Vim
例子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
真的可以Vim
看到目录文件的内容吗?例如cat .
、less .
、hexdump .
等都失败并显示. is a directory
错误消息。或者netrw
插件是否只是列出目录的内容,从而给人一种实际目录文件已打开的印象?
答案1
读取目录实际上并不是作为文件进行的。它发生在readdr
系统调用中。请参阅man 2 readdir
作为纯系统调用的旧实现和man 3 readdir
包装器(请不要使用旧实现)。
然而,Vimnetrw
不会执行类似的操作。它只是调用ls
或执行通配符(请阅读下文以了解何时执行其中一项以及何时执行另一项)并解析其输出。
配置netrw
您可以选择如何ls
调用远程系统。您可以在vimrc
SSH 和 FTP 连接中设置列出命令,如下所示(这些是默认设置):
let g:netrw_list_cmd = 'ssh HOSTNAME ls -Fa'
let g:netrw_ftp_list_cmd = 'ls -lF'
ls
(您甚至可以将其设置为与没有 FTP 系统不同的值ls
,是的,有一些罕见的系统没有它。)
为了本地列表 netrw
执行通配符,然后调用getftype()
来装饰文件(/
对于目录、@
链接等)。在autoload/netrw.vim
该s:LocalListing()
过程中执行以下操作:
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 `.*`
然后getftype()
对 in 中的每个文件进行调用filelist
。
总而言之,netrw
依赖于 Vim 具有该glob()
功能,Vim 依次执行glob
调用 ( man 3 glob
)。