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>hj
kl 上下左右移动,\<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}省略则移动至结尾。