VIM 界面显示介绍

2020-04-12 vim

在 VIM 中,与显示相关的内容包括了 Tab、Window、Buffer 三种,很多的功能可以用不同的机制实现,不过很容易引起混淆,这里简单介绍 VIM 设计的基本概念,并简单介绍最佳实践。

简介

现在很多的 IDE 使用 Tab 来标识当前正在编辑的多个不同文件,甚至包括了常见的浏览器,但在 Vim 中的 Tab 被称为 Layout 或者 Workspace 应该更合理一些,如下先简要介绍其基本概念。

  • Buffer 缓存,实际就是一块保存正在编辑文件的内存区域,包括了已经修改的、未修改的文件。
  • Window 窗口,也称为 Viewport,用来显示缓存,相同的文件可以在多个窗口中打开,可以水平、垂直分割。
  • Tab 标签,用来维护当前的视图,可包含多个窗口,当还不想关闭当前文件,但又需要打开另外一个项目的时候很有用。

简单来说,Windows 是作为显示 Buffer 的窗口,一个 Buffer 空间的内容可以在不同的 Windows 中显示。

缓冲区 Buffer

缓冲区就是一块保存正在编辑文件的内存区域,可通过 :h buffer 查看帮助,实际上直接打开文件就算是打开了一个缓冲区。

:e <path/to/file>            → 打开一个文件,保存到缓冲区列表,e是edit缩写
:badd <path/to/file>         → 添加到缓冲区列表中
:saveas <path/to/file>       → 另存为 <path/to/file>
:wq                          → 存盘并退出
:x                           → 表示仅在需要时保存
ZZ                           → 不需要输入冒号并回车
:q!                          → 退出不保存
:qa!                         → 强行退出所有的正在编辑的文件,就算别的文件有更改

:[buffers|ls]                → 列出当前编辑中所有的缓冲区状态
:buffer number|filename      → 切换缓冲区,可通过缓冲区的序号或者打开文件的名字选择缓冲区
:sbuffer number|filename     → 水平分割窗口
:ball                        → 为每个缓冲区打开一个窗口,默认按顺序水平切分
:bnext :bprevious            → 调转到下/上一个缓冲区,简写为:bn/:bp,:n 调转到下个文件
:blast :bfirst               → 调转到最后/第一个缓冲区
:bd(elete) number|filename   → 删除缓冲区
:3 bdelete :1,3 bdelete      → 删除或者指定范围的缓冲区

查看缓冲区时,在这个状态列表中,前面的数字是缓冲区的数字标记,第二个标记就是缓冲区当前的状态,紧接着是与缓冲区所关联的文件名。有如下几种状态:

  • - 非活动的缓冲区。
  • a 激活缓冲区。
  • h 隐藏的缓冲区。
  • % 当前的缓冲区。
  • # 交换缓冲区。
  • = 只读缓冲区。
  • + 已经更改的缓冲区。

在删除缓冲区时,如果缓冲区被改动过,那么该命令将失败,除非使用 ! 选项。如果使用了带 ! 选项的 :bdelete! filename 命令,那么在缓冲区中的所有改动都会被放弃。

Windows

还包括了 loclistquickfix 两个特殊的显示,也算是窗口吧,两者都可以用来显示一些编译报错、查找等信息,然后,通过显示的文件、行号等信息可以完成自动跳转。

其中 loclist 每个窗口会包含一个,而 quickfix 是全局所有的,例如编译信息是项目所有的,最好在 quickfix 中显示,而 grep 可以是查找某个文件的内容,所以,最好是在 loclist 中显示。

如下是常用的命令,其中 cXXX 是操作 quickfix 的,而 lXXX 用来操作 loclist 窗口。

copen          lopen            打开
cclose         lclose           关闭
cnext          lnext            跳转到下一个
cprev          lprev            跳转到上一个
cc             ll               打开当前信息所在文件
cfile <file>   lfile <file>     指定某个文件打开

其中的 cfile 可以先将编译、查询信息保存到某个文件中,然后再通过该命令打开相应文件。另外,有些命令是可以直接配合使用的,例如 :lvimgrep /pattern/ % 可以直接搜索当前文件。

常用命令

Tab 操作

可以通过 :help tabpage 查看帮助。

:tabnew file :tabe file      → 新建或打开某一文件并开启新标签页
:tab split                   → 用标签页打开当前编辑的文件
:tabf filename_re            → 基于正则表达式递归遍历当前工作目录查找名称匹配的文件并为其建立新标签页

:tabs                        → 显示已打开标签页的列表,&lt;指示当前页,+显示修改未保存
:tabc    :tabnew             → 关闭当前标签页等价与:q,新建
:tabn    :tabp               → 移动到下/上一个标签页
:tablast :tabfirst           → 移动到最后/第一个标签页
gt                           → 切换到下一个Tab
gT                           → 反向切换

:tabmove 0                   → 将当前tab移动到第一个位置,位置编号从0开始
:tabdo %s/aaa/bbb/g          → 在每个打开的Tab上执行操作

:tab help tabpage            → 使用Tab而非Windows打开帮助窗口
:help setting-guitablabel    → 自己配置tab标题

:tabr 跳转第一个标签页 gvim 提供了 remote-tab 的功能。

在标签栏中,各标签页的默认名称是对应文件所在路径全称的简写,如 /usr/share/doc/test.txt 文件所对应的标签页名默认是 /u/s/d/test.txt,这样的标签页名看上去有些诡异。可以在配置文件中添加如下内容,在标签页栏中去除当前所编辑文件的路径信息,只保留文件名。