Vim 学习笔记 No.3

多文件管理

打开文件

1 使用edit命令打开文件

使用:edit {path}打开文件,{path}可为绝对路径或相对路径。

在{path}部分中,可以使用***通配符替代部分文件或目录名。***都指代 0 个或多个字符,但**在替代目录时,可递归地进入子目录,也即可指代多级目录(见:h wildcard:h starstar-wildcard)。

输入:edit %:p<TAB>可将%:p替换为当前缓冲区文件的路径,而输入:edit %:p:h<TAB>替换得到的路径不包含文件名。此时可使用相对路径打开缓冲区文件相同目录下的文件。 书上介绍的命令统统没有:p部分,得到的结果全是./形式的,即相对目录

将如下行加入 vimrc 文件中,可将%%自动替换为当前目录(不仅适用于 edit):

cnoremap <expr> %% getcmdtype() == ':' ? expand('%:p:h').'/' : '%%'

事实上,个人觉得有比书上介绍的这个方法更好的办法。在 vimrc 中加入这一行:

" 打开文件时切换到文件目录
autocmd BufEnter * silent! lcd %:p:h

这样可以直接将活动路径切换至缓冲区文件所在目录。不过书中所介绍的方法可能有不同的应用场景,故还应了解。

:edit!命令还有放弃未保存修改的作用。

2 使用 find 命令打开文件

find命令会在 path 变量储存的路径中查找文件并打开。同样支持 \<TAB> 键。

使用echo &path查看当前的 path 变量值。使用set path+={path}将{path}加入 path 变量。

可能这个技巧在大工程文件里比较好用吧,暂时没发现其他用处。

3 使用 netrw 文件管理系统

首先确保 vimrc 中有如下行:

filetype plugin on

如果使用了 Vundle,可以发现 vimrc 中应该已经有了filetype plugin indent on,删去 indent 即可。

同样使用edit {path}命令,不过这里{path}应当使用目录而不是文件名。这时便可使用 netrw 打开文件管理窗口。如果要当前目录打开,则可使用简写:e.:E,这两个命令分别在工作目录和活动缓冲区所在目录打开文件。

打开 netrw 后,j k 选择文件,使用 \<CR> 打开文件或目录,使用、<C-^>(非常不方便地要同时按三个键)在最近打开的目录和最近打开的文件之间切换。

用起来感觉这个文件管理系统有点像 Linux 下的 vifm 和 Windows 下 TC 配合上 vimd,不过用来代替文件管理器可能显得有些功能不足。其主要运用场景是通过网络读写文件,暂时不清楚,就当了解吧。

管理文件

1 缓存区列表

:ls显示缓存区列表中的文件。:bnext:bprev在列表中移动,:bfirst:blast跳至开头和结尾,使用:buffer {num}打开编号为{num}的缓冲区,编号在:ls中查看。也可以用:buffer {name}直接按名称打开缓冲区。

推荐 vim 插件 unimpaired.vim 调整映射项,如将[b]b设置为bnextbprev。使用 Vundle 添加插件的方法百度可得。

使用bdelete {num}或简写为bd {num}根据编号删除某个缓冲区,甚至可以用N,Mbd删除编号区间的缓冲区。

2 参数列表

:args显示参数列表,:args {arglist}更新参数列表(原有参数列表将被抛弃)。

怎么理解参数列表呢?我们已经知道,缓冲区列表中储存的是所有打开的缓冲区,而参数列表储存的是打开的文件。使用:bnext等命令可在缓冲区列表中跳转,而使用:next等命令可在参数列表中跳转。或者说,如果你明智地使用了 unimpaired.vim 插件,那么可以按[b[a等进行跳转。

3 隐藏缓冲区

理论上一个文件修改后,若是退出或切换到其他缓冲区,vim 应该会提示文件未保存。若是切换到另一个缓冲区,可以使用:bnext!这样的命令强制切换,此时原缓冲区成为隐藏缓冲区。退出时,若有隐藏缓冲区,vim 会提示有未保存缓冲区,并打开一个。使用:w保存修改,使用:e!摒弃修改。

隐藏缓冲区的内容是针对:argdo而特别说明的。:argdo命令中可能会修改多个缓冲区,如果启用hidden选项的话,缓冲区会默认隐藏,这样就可以在退出 vim 时统一检查文件修改是否正常,并选择是否保存。

4 将工作区切分为窗口

\<C-w>s 水平切分窗口,\<C-w>v 垂直切分窗口,这时新窗口会显示与原窗口相同的内容。可以使用:sp {file}:vs {file}水平、垂直切分窗口,并在新窗口中打开文件{file}。

在窗口间移动:\<C-w>hjkl 上下左右移动,\<C-w>w 或、<C-w>\<C-w>

关闭窗口:\<C-w>c 关闭当前窗口,\<C-w>o 仅保留当前窗口。

重排窗口:\<C-w>= 使所有窗口等宽,{num}\<C-w>\_{num}\<C-w>| 将窗口高度和宽度设为{num}列,省略{num}时最大化。

5 标签页

tabe[dit] {filename}打开标签页,省略{filename}则标签页包含空缓冲区。tabc[lose]关闭当前标签页,tabo[nly]仅保留当前标签页。

\<C-w>T 将当前窗口移至新标签页。

{num}gt 移动到编号为{num}的标签页,gt 切换到下一标签页。对应的 Ex 命令为:tabn[ext] {N}:tabn[ext]gT 移动至上一个标签页,对应的 Ex 命令为:tabp[reviews]

tabmove {N}将标签页移动到第{N}的位置上,{N}省略则移动至结尾。

tandf

Tsinghua University, Department of Automation
One thing at a time. One thing done well.