Vim netrw 插件实际上显示目录文件的内容吗?

Vim netrw 插件实际上显示目录文件的内容吗?

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调用远程系统。您可以在vimrcSSH 和 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.vims: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)。

相关内容