据我了解,在Linux目录中大多数是普通文件,带有一些特殊处理(例如“rm”文件没问题;“rm”目录会抱怨w/o -r)。
当我执行以下 bash 命令时:
mkdir foo; touch foo/f1.txt; touch foo/f2.txt; vim foo
Vim 将 foo 目录文件的内容显示为:
" ============================================================================
" 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
我的问题是:
1) 为什么在这个例子的上下文中使用netrw? 根据http://www.vim.org/scripts/script.php?script_id=1075、netrw“支持跨网络读写文件”。这只是 vim 用于统一本地/网络目录访问的组件吗?
2)为什么需要netrw? 由于目录“大部分”是普通文件,难道它们不能作为普通文件打开而无需任何中间层吗?又名为什么所有的花哨?
答案1
在历史上Unix系统中,目录被实现为普通文件,并具有特殊模式表明它们是目录。在许多现代文件系统和操作系统上,情况已不再如此。当涉及到磁盘结构时,目录可能会也可能不会表示为类似文件的存储 blob,具体取决于文件系统。当涉及到操作系统接口时,有单独的系统调用来访问目录和常规文件:opendir
,readdir
,rewinddir
,closedir
对应于open
,read
,rewind
,close
分别。
读取目录的软件必须使用特定于目录的接口。当您在 Vim 中打开目录时,它不会像加载文件那样加载其内容。 Vim 对目录没有任何本机处理:如果您vim --noplugin
在目录上运行,Vim 会抱怨"foo" is a directory
并且不会出于同样的原因保存缓冲区。
netrw 的主要目标是访问远程文件(通过各种网络协议)。由于您无法轻松地在包含这些远程文件的目录中运行诸如ls
和 之类的命令cp
,因此 netrw 包含浏览目录并操作它们的代码 - 它既是文件管理器,又是远程文件浏览器。这些文件管理器功能在本地和远程都有意义,因此 netrw 将自身注册为本地目录以及远程文件和目录的处理程序。
答案2
无法访问原始目录数据。不允许写访问,因为这可能导致文件系统不一致。不提供读取访问权限,因为格式取决于文件系统。 (因此,最好强制执行某种程度的抽象)另请参阅:Unix 文件系统中的目录是如何实现的?
在unix上,vim
将使用opendir
, readdir
,closedir
接口(参见手册页)来一一读取目录条目,而无法访问原始数据。我想Netrw
这只是这个接口的更高层次的抽象,它扩展到各种“非 UNIX”文件系统。