如果你用过现在流行的编辑器,你可能对窗口和选项卡很熟悉。VIM在这两个显示要素的基础上再多了一个buffers。在这一章节里,我希望解释一下什么是buffers,窗口,选项卡,然后说明一下他们在VIM里的运行原理。
在你开始之前,确保你在vimrc里有设置set hidden
。如果没有,每当你换buffers的时候,要是没有保存文件,VIM会逼着你去保存(当你想要快点切换时候就不会希望VIM来阻止你)。我还没有说到vimrc,如果你没有vimrc就创建一个。它通常放在根目录,叫.vimrc
,我的放在~/.vimrc
。你不知道你的vimrc放在哪就用:h vimrc
。打开它,然后加上
set hidden
保存它,然后重新引用(在vimrc里命令行运行:source %
)。
什么是buffers?
buffer是在内存里的一片空间,你写和编辑文本都是在那里完成的。当你在VIM里打开一个文件的时候,数据就加载到了buffer里。当你打开三个文件,你的内存空间里就开辟了三个buffer。
有两个空白文件file1.js
和file2.js
(最好自己动手 在vim里创建一下)。在终端里运行
vim file1.js
你看到的是file1.js
的buffer。当你打开一个新文件的时候,VIM会创建一个新的buffer。
退出VIM,然后我们打开两个文件
vim file1.js file2.js
这个界面显示的是file1.js
的buffer,但实际上它生成了两个buffer。输入指令:buffers
可以看所有的buffer(你也可以用:ls
和:files
)。你会看见file1.js
和file2.js
。执行vim file1 file2 file 3 ... filen
会创建n个buffer。每当你打开一个新文件,VIM会为这个文件创建一个新的buffer。
有多种方法可以切换buffer
:bnext
切换到下一个buffer:bprevious
切换到前一个buffer:buffer
+ filename ,用<tab>
可以让VIM补全文件名。:buffer
+ n,n是一个数字,它会让你切换到第n的buffer。Ctrl-o
往前跳,Ctrl-i
向后跳。buffer对象没有什么特别的方法,这些只能让他们在不同的buffer之间切换,我会在第五章详细讲解一下"Jump"Ctrl-^
会让你返回上一个编辑的buffer每当VIM创建一个buffer,它就会保存在你的buffers list里,想要删除它,就要用:bdelete
指令,它允许后面跟个数字表示删除第几个buffer 也可以用<tab>
去自动填充文件名。
我在学习buffers部分的时候,感觉最难的部分是想象buffer是如何工作的,因为我已经习惯了主流的文本编译器的多窗口风格。如果把它想象成一副扑克牌会好理解一点,如果我有两个buffer,那我的牌组里就有两张牌,最顶端的牌就是当前我看到的卡片,我同时也知道它下面还有牌。当我看见file1.js
时就可以类比成看到了file1.js
放在了牌的顶端,我看不到其他的buffer。
如果你没有用过VIM,这是一个全新的概念,花点时间去理解它。
顺带一提,如果打开了多个buffer,如果你想把它们全部关闭,可以
:qall
如果你不想保存修改,全部关闭
:qall!
如果你想保存然后全部关闭
:wqall
窗口(window)是buffer的一种呈现方式。如果你从主流的编辑器里转过来,你可能会熟悉这个概念,大多文本编辑器都支持多窗口。在VIM里,你也可以用多窗口。
让我们再一次从终端里打开file1.js
vim file1.js
我之前说过你看到的是file1.js
的buffer,虽然那句话没啥问题,但还是不够完整,你看到的是通过window呈现的file1.js
的buffer。
先别急着退出VIM,运行
:split file2.js
现在你看到了两个窗口,最上面的窗口是file2.js
。
如果你想要在窗口间切换,用下面这些指令
Ctrl-w H "移动到左边的窗口
Ctrl-w J "移动到下面的窗口
Ctrl-w K "移动到上面的窗口
Ctrl-w L "移动到右边的窗口
现在运行
:vsplit file3.js
你会看到三个窗口显示着三个buffer,一个窗口显示file3.js
,其他两个显示file1,js
和file2.js
。
你同样可以有多个窗口显示同一个buffer,当你在左上的窗口输入
buffer file2.js
现在两个窗口同时显示着file2.js
,如果你开始在窗口上打字,你会发现两个窗口同时发生改变,另一个窗口是实时变化的。
当你想要关闭当前窗口时,你可以按Ctrl-w C
或者输入:quit
,当你关闭一个窗口的时候,那个buffer是不会被关闭的,不信的话用buffers
来确认一下。
下面是一些在普通模式下非常有用的命令
Ctrl-w V "打开一个新的竖向分屏窗口
Ctrl-w S "打开一个新的横向分屏窗口
Ctrl-w C "关闭一个窗口
Ctrl-w O "只留当前停留的窗口,其他全部关掉
下面是一些有用的命令行指令
:vsplit filename "在横向分屏窗口打开一个文件
:split filename "在竖向分屏窗口打开一个文件
:new filename "创造一个新窗口(貌似是默认竖向
标签(tab)是窗口的集合,想象成是一堆窗口的布局。在大多数的现代文本编辑器和浏览器里,标签给人的印象是一个文件或者页面,当你关闭它的时候,文件和页面也就消失了。而在VIM里,标签并不意味着打开一个文件,关闭标签的时候也并不是关闭一个文件,你只是关闭了那个窗口布局,这些文件的数据都存放在内存中的buffer。buffer始终都在那。
让我们来操作一下VIM的标签,打开file1.js
vim file1.js
然后在新的标签里打开file2.js
:tabnew file2.js
你同样可以按<tab>
让VIM自动补完文件名(不是双关语233)。
下面是一些有用的标签移动命令
:tabnnew file.txt "在一个新的标签里打开file.txt
:tabclose "关闭当前的标签
:tabnext "进入下一个标签
:tabprevious/:tabprev "进入前一个标签
:tablast "进入最后一个标签
:tabfirst "进入第一个标签
你同样可以用gt
命令进入下一个标签,你也可以用gT
进入下一个标签,你也可以加上计数,比如你可以用3gt
进入第三个标签。
多个标签页的好处是你可以在不同的标签里拥有不同的窗口排列,如果你想要在第一个标签里有三个垂直分布的窗口,然后在第二个标签里混合水平和垂直分布,用Tabs是你最好的选择。
如果你想从终端里启动VIM时直接打开多个标签,可以
vim -p file1.js file2.js file3.js
窜梭在不同的窗口间如同在一个二维平面移动,你可以用Ctrl-w H/J/K/L
来左下上右移动。
在buffer间移动如同穿越了Z轴,想象你的buffer文件穿在一条Z轴上,你可以用:bnext
和:bprev
在Z轴之间移动。你可以跳到用:buffer filename/buffernumber
跳到Z轴上的任意位置。
你就可以同时使用window移动和tab移动来实现三维移动。
你学了buffers、windows、tabs的用法和大致原理之后,现在你就可以理解它们并用在你的实际应用中。
所有人都有自己的编辑风格,下面拿我的风格来做介绍。
我的编辑风格可能和你的不同,那很正常。亲自去体验来找到最适合你的编辑风格和流派。