感谢[idear][idear]网友的支持,现在把"Vim多文件编辑"的最后一篇文章更新上来了!本文介绍Vim下缓冲区(Buffer)的使用, 至于标签页(tab)窗口(window)可以移步另外两篇文章: Vim 多文件编辑:标签页Vim 多文件编辑:窗口

引用Vim官方解释,缓冲区是一个文件的内容占用的那部分Vim内存:

A buffer is an area of Vim's memory used to hold text read from a file. In addition, an empty buffer with no associated file can be created to allow the entry of text. –vim.wikia

先来回顾一下Tab,Window,Buffer的关系吧!

tabs windows buffers

基于缓冲区的多文件编辑是Vim最为推荐的做法,Vim维护着你在当前打开的这些Buffer里的所有跳转, Ctrl+oCtrl+i可以遍历这些光标位置(参考:在Vim中进行快速光标移动)。 但一个窗口内只有一个Buffer是处于可见状态的,所以Buffer的用法最不直观。

学习Vim就要克服那些不直观的操作!因为Vim本身就是基于CLI的,而我们相信CLI就是效率。本文便来总结一下Buffer相关的命令与操作。

打开与关闭

不带任何参数打开多个文件便可以把它们都放入缓冲区(Buffer):

vim a.txt b.txt

当你使用:q关闭文件时?是否看到过1 more file to edit的警告?那就是缓冲区中的文件。

进入Vim后,通过:e[dit]命令即可打开某个文件到缓冲区。还记得吗?使用:new可以打开一个新窗口。 关闭一个文件可以用:q,移出缓冲区用:bd[elete](占用缓冲区的文件对你毫无影响,多数情况下不需要这样做)。

如果Buffer未保存:bd会失败,如果强制删除可以:bd!

缓冲区跳转

缓冲区之间跳转最常用的方式便是 Ctrl+^(不需要按下Shift)来切换当前缓冲区和上一个缓冲区。 另外,还提供了很多跳转命令:

:ls, :buffers       列出所有缓冲区
:bn[ext]            下一个缓冲区
:bp[revious]        上一个缓冲区
:b {number, expression}     跳转到指定缓冲区

:b接受缓冲区编号,或者部分文件名。例如:

  • :b2将会跳转到编号为2的缓冲区,如果你正在用:ls列出缓冲区,这时只需要输入编号回车即可。
  • :b exa将会跳转到最匹配exa的文件名,比如example.html模糊匹配打开文件正是Vim缓冲区的强大之处

分屏

Vim 多文件编辑:窗口中已经介绍了Vim中分割屏幕的操作。 其实分屏时还可以指定一个Buffer在新的Window中打开。

:sb 3               分屏并打开编号为3的Buffer
:vertical sb 3      同上,垂直分屏
:vertical rightbelow sfind file.txt

注意sfind可以打开在Vim PATH中的任何文件。这当然需要我们设置PATH,一个通用的做法是在~/.vimrc中添加:

" 将当前工作路径设为Vim PATH
set path=$PWD/**

利用通配符进行缓冲区跳转

这是缓冲区最强大的功能之一。我们可以使用通配符来指定要跳转到的缓冲区文件名。 在此之前,我们启动wildmenu并设置匹配后文件选择模式为fullwildchar为选择下一个备选文件的快捷键, 而wildcharm用于宏定义中(语义同wildchar),比如后面的noremap

set wildmenu wildmode=full 
set wildchar=<Tab> wildcharm=<C-Z>

比如现在按下打开这些文件:

vehicle.c vehicle.h car.c car.h jet.c jet.h jetcar.c jetcar.h

然后按下:b <Tab>便可看到Vim提供的备选文件列表了, 按下<Tab>选择下一个,按下回车打开当前文件。

:b <Tab>       " 显示所有Buffer中的文件
:b car<Tab>    " 显示 car.c car.h
:b *car<Tab>   " 显示 car.c jetcar.c car.h jetcar.h
:b .h<Tab>     " 显示 vehicle.h car.h jet.h jetcar.h
:b .c<Tab>     " 显示 vehicle.c car.c jet.c jetcar.c
:b ar.c<Tab>   " 显示 car.c jetcar.c
:b j*c<Tab>    " 显示 jet.c jetcar.c jetcar.h

我们可以为:b <Tab>设置一个快捷键<c-n>,这时便用到上文中设置的wildcharm了:

noremap <c-n> :b <c-z>

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/11/17/vim-buffer.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。