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设置为bnext和bprev。使用 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}省略则移动至结尾。