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