Vim学习笔记
- 系列笔记链接
- Ch02 Buffers, Windows, Tabs
- Buffers
- 什么是buffer
- 查看所有buffer
- buffer之间的切换
- 删除buffer
- 退出所有窗口
- Windows
- 窗口的创建
- 窗口切换快捷键
- 其他快捷键
- Tabs
- 什么是tab
- tab相关命令
- window和buffer结合的3D移动
- 小结
系列笔记链接
Ch00,Ch01
Ch02 Buffers, Windows, Tabs
在.vimrc
配置文件中加入set hidden
,可以隐藏一些提示信息,比如切换不同的缓存区buffer时,未保存当前缓存区的内容,Vim会提示先保存文件。隐藏提示信息可以使切换操作更流畅。
Buffers
什么是buffer
缓存区buffer是一个内置的内存空间,可以在其中写入和编辑文本。Vim中每打开一个新文件,其数据都会关联到一个独立的buffer。
比如通过Vim打开file1.txt,此时Vim关联的就是file1.txt的buffer:
vim file1.txt
同时打开多个文件时,Vim也会为这些文件创建独立的buffer,默认展示的是第一个文件的buffer:
vim file1.txt file2.txt
查看所有buffer
在命令行模式下输入:buffers
(或:ls
、:files
),Vim窗口底端会列出当前打开的所有buffer。
buffer之间的切换
:buffers
输出结果中,每一行第一列标识了每个buffer的编号(按文件打开的顺序,从1开始计数),第二列表示buffer的状态,%a
表示Vim当前所处的buffer,第三列就是每个buffer对应的文件,最后一列是每个buffer中光标所处的位置(行)。
通过:buffer+n
的方式可以切换到第n个buffer,比如:buffer2
可以切换到file2.txt的buffer。
其他buffer切换命令:
:bnext # 转到下一个buffer,或者快捷键Ctrl + I
:bprevious # 转到上一个buffer,或者快捷键Ctrl + O
:buffer + 文件名 # 转到指定文件的buffer
此外,Ctrl + ^
可以切换到前一次编辑的buffer中。
删除buffer
删除指定的buffer的两种方式(命令行模式下):
:delete n # 根据编号删除
:delete filename # 根据文件名删除
退出所有窗口
同时打开多个buffer时,可以通过以下指令退出所有buffer(命令行模式下):
:qall # 直接退出所有buffer
:qall! # 感叹号强制退出所有buffer
:wqall # 先保存再退出所有buffer
Windows
窗口的创建
窗口window是展示缓存区buffer内容的媒介,可以类比于普通编辑器的窗口。Vim中也可以同时打开多个窗口,包括对同一个buffer打开多个窗口,以及不同的buffer用不同的窗口打开。
结合buffer和window两个概念,当我们用Vim打开一个文件时,比如vim file1.txt
,打开的是file1.txt的buffer,通过一个窗口查看、编辑这个buffer;在file1.txt的基础上,运行:split file2.txt
,会在file1的窗口之上打开一个新的窗口,显示file2的buffer,这样就用不同的窗口打开了不同的buffer。
:split
是将窗口纵向排列,而:vsplit
则是将多个窗口横向排列,比如在两个窗口的基础上继续执行:vsplit file3.txt
,就会得到第3个窗口:
执行vsplit前处于file1的窗口中,vsplit会在当前窗口的左侧打开新的窗口。
窗口切换快捷键
Ctrl + W + H # 将光标移动到左侧的窗口
Ctrl + W + J # 下
Ctrl + W + K # 上
Ctrl + W + L # 右
PS:说实话这个不是很好操作,初学不好记的同时,手指灵活度还差点,只能说熟能生巧,但我现在不熟,并且是差点玩坏键盘的程度…
其他快捷键
Ctrl + W + V # 打开一个新的垂直窗口
Ctrl + W + S # 打开一个新的水平窗口
Ctrl + W + C # 关闭一个窗口(当前)
Ctrl + W + O # 除了当前窗口,关闭其他所有窗口
实际操作时:
Ctrl + W + V
无法指定打开的窗口对应哪个buffer,会直接为当前光标所处buffer打开一个新的垂直窗口;
Ctrl + W + S
有个bug,这样操作之后容易锁定终端的操作,这之后无论按什么都没有反应,我还不知道做错了什么,只能强制杀死该进程;
尝试Ctrl + W + C
时同样出现终端“死机”的状态,于是开始想是不是模式切换的问题,这几个快捷键操作的实际效果还有待探索(结合window帮助文档:h window
)
- 还有待探索的window快捷键操作
对比起来,在命令行模式下直接输入指令更直观可控,但教程中明确的指令只有split、vsplit和new(:qa
退出所有窗口),不如快捷键丰富。
Tabs
什么是tab
熟悉Linux环境和终端命令,对Tab应该不陌生,常用Tab键进行文件名、路径补全,Vim中也可以在输入命令时使用Tab补全文件名。但这里说的Tabs,指窗口的集合(a collection of windows),类似浏览器新开一个标签页,称之为tab。在Vim中,通过:tabnew xxx
打开一个tab,tab的形式也和浏览器标签页类似,好比不创建新的终端窗口,而是在同一个终端窗口中新开了一个Vim终端。window让我们在同一个Vim终端中打开不同的文件,每个tab之下可以有不同的window布局。
tab相关命令
在命令行模式下:
:tabnew file.txt # 打开一个新的tab
:tabclose #关闭当前tab
:tabnext # 打开下一个tab,或使用快捷键gt(注意不是命令行输入)
:tabprevious # 打开前一个tab,或使用快捷键gT
:tablast # 打开最后一个tab
:tabfirst # 打开第一个tab
PS:其实只有快捷键gt已经足够在不同的tab之间切换,因为在最后一个tab执行gt
之后会到第一个tab,很难想象怎么打出gT
的快捷键?
在启动Vim时同时打开多个tab(-p
参数):
vim -p file1 file2 file3
同样可以通过qa
直接退出所有tab。
window和buffer结合的3D移动
我们可以在一个终端(可以理解为一个tab)中打开多个window,每个window又可以包含多个buffer,窗口之间的切换可以类比于在一个X-Y平面中上下左右移动,而同一个窗口中不同buffer的切换可以类比于在Z轴上移动,因此结合使用window和buffer时,就好像在一个3D空间移动。
小结
作者介绍了他对Vim中这几个概念的用法:一般来说,在同一个窗口中打开多个buffer(对应不同的文件),可以方便进行文件切换;打开多个窗口则是为了便于查看/对比等操作,而tab则是为了区分不同的并行任务。