Vim 的缓冲区与多文件编辑

下图中包含了 Vim 中的 buffer、窗口、标签的关系。初学者会对这三个概念容易混淆。下面几节内容我们会依次为大家讲解。本节我们会首先讲解下 buffer(缓冲区)的概念。

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 ——官网

这里引用的是官网一段对于 Vim 缓冲区的解释。说白了,buffer 就是 Vim 开辟的一块内存,用于存放从文件中读取的文本内容。

1. 缓冲区

我们在编辑文件时候,本质上其实是文件在内存的映像。就是我们说的缓冲区。而文件是需要存储在磁盘上的。所以我们编辑完文件后通过 :w 写入磁盘后才叫文件。

buffer 有三种状态:

  • active: 这种状态buffer 显示在当前窗口。
  • hidden: 这种状态buffer是隐藏不显示的。
  • inactive: 这种状态buffer 既不显示也不包含任何东西。

1.1 缓冲区列表

我们可以同时"编辑多个文件(缓冲区)",我们可以在这些缓冲区中切换使用。

我们可以通过三种命令展示缓冲区列表:

  • :files
  • :buffers
  • :ls
:buffers                                                                                                               
  1 %a   "main.tf"                      line 1
  2      "jmx_exporter.json"            line 0
  3      "bind_exporter.json"           line 0
:ls                                                                                                                    
  1 %a   "main.tf"                      line 1
  2      "jmx_exporter.json"            line 0
  3      "bind_exporter.json"           line 0
:files                                                                                                                 
  1 %a   "main.tf"                      line 1
  2      "jmx_exporter.json"            line 0
  3      "bind_exporter.json"           line 0

这里可以看到三个命令结果都一样的。我们具体看下结果展示各个部分的意思。

第一列 第二列 第三列 第四列
缓冲区序列号 指示状态 文件名 光标位置

这里有点难理解的是指示状态:

  • - 只读缓冲区
  • a 活动缓冲区,当前显示在屏幕上的
  • h 隐藏缓冲区
  • % 当前的缓冲区
  • # 交换缓冲区
  • + 已经更改的缓冲区

1.2 缓冲区列表操作

指令 含义
:bp[revious] 上一个缓冲区
:bn[ext] 下一个缓冲区
:bf[irst] 到第一个缓冲区
:bl[ast] 到最后一个缓冲区
:buffer Nubmer/File_name 指定缓冲区
:ball 编辑所有缓冲区
:badd add.txt 增加一个缓冲区
:bdelete add.txt 删除一个缓冲区
:bufdo %s/pattern/replace/ge | update 多buffer查找替换

下面我会依次演示上面的操作:

1.2.1 移动操作

我们先来看下缓冲区如何进行移动操作:

1.2.2 增删操作

这里我们演示一下如何增加或删除一个缓冲区:

2. 小结

以上就是 Vim buffer 内容讲解。这个会和之后的标签概念相似。可以简单理解为 buffer 主内(内部表示),标签主外(外部窗口布局展示)。初学者会容易混淆具体会在后面标签部分讲解。