Skip to content

Vim - 回顾编辑

除了基本的文本插入和移动,Vim 还提供了丰富的编辑功能集。本节将重新探讨并扩展核心编辑概念:

  • 理解 buffers:Vim 中文件的内存表示
  • 用于数据恢复的 swap 文件
  • 高效地剪切、复制和粘贴文本
  • 撤销和重做更改

Vim 中的 buffer(缓冲区)是一个临时的内存区域,用于在你编辑文件时保存文件内容。当你打开一个文件(例如 vim myfile.txt)时,Vim 会将文件内容从磁盘读入一个 buffer 中。你所有的更改都将应用于这个 buffer。磁盘上的原始文件在你明确保存 buffer 之前不会被修改(例如使用 :w 命令)。

Vim 可以同时管理多个 buffer,允许你在单个 Vim 会话中处理多个文件。你可以使用 :ls 命令列出所有打开的 buffer,并使用 :bnext(或 :bn)、:bprevious(或 :bp)或 :buffer <name/number> 等命令在它们之间切换。

Vim 会为你正在编辑的每个 buffer 创建一个 swap 文件(通常带有 .swp 扩展名)。这个 swap 文件会定期存储 buffer 中未保存的更改。它的主要用途是数据恢复:如果 Vim 或你的系统崩溃,当你下次尝试编辑原始文件时,通常可以从 swap 文件中恢复大部分未保存的工作。

如果你尝试打开的文件已存在 swap 文件,Vim 会发出警告。这可能表明该文件正在被其他 Vim 会话编辑,或之前发生了崩溃。你可以使用以下命令查找当前 buffer 的 swap 文件的名称和位置:

:swapname

对于名为 message.txt 的文件,Vim 可能会在同一目录或配置的中心 swap 目录中创建一个类似 .message.txt.swp 的 swap 文件。当你正常保存并关闭 buffer 时,这些文件会自动删除。

Yanking(复制)、Deleting(删除)和 Putting(粘贴)文本

Section titled “Yanking(复制)、Deleting(删除)和 Putting(粘贴)文本”

Vim 提供了强大的命令来执行 yanking(复制)、deleting(删除,删除的文本会存储在寄存器中,因此也相当于 ‘剪切’)和 putting(粘贴)操作。这些操作通常涉及一个操作符(例如 y 用于 yank,d 用于 delete),后跟一个移动命令或文本对象。

常用命令(在 Normal 模式下使用):

命令描述
x删除光标下的字符(相当于剪切)
X删除光标前的字符(相当于剪切)
dw删除(剪切)从光标到下一个单词开头的内容
db删除(剪切)从光标到当前/上一个单词开头的内容
D删除(剪切)从光标到行尾的内容
dd删除(剪切)当前整行
yw复制(yank)从光标到下一个单词开头的内容
yb复制(yank)从光标到当前/上一个单词开头的内容
Y or yy复制(yank)当前整行(yy 更明确;Y 通常行为类似 y$)
p在光标后,或如果复制/删除的是整行,则在当前行下方,粘贴(put)最后删除或复制的文本
P在光标前,或在当前行上方,粘贴(put)

这些命令可以在前面加上数字计数,以对多个对象进行操作。例如:

  • 3dw:删除(剪切)3个单词。
  • 5dd:删除(剪切)5行。
  • 2yy:复制(yank)2行。

通过 d、x、X 和 y 操作的文本会存储在 registers(寄存器)中。默认的无名寄存器会在每次剪切或复制时被覆盖。你可以使用命名寄存器(例如 "ayy 复制到寄存器 ‘a’,"ap 从寄存器 ‘a’ 粘贴)进行更复杂的操作。

Vim 允许你撤销对 buffer 所做的更改。

  • u:撤销最后一次更改。重复按 u 会按顺序撤销之前的更改。
  • <count>u:撤销最近 <count> 次更改。例如,5u 撤销最近五次更改。
  • U(大写):撤销当前行上的所有近期更改,将其恢复到你开始编辑该行(在当前编辑会话中)之前的状态。这与 u 不同,u 是逐个撤销所有行上的更改。

Vim 维护了一个 undo tree(撤销树),允许更复杂的撤销/重做场景,而不仅仅是简单的线性历史。更多详情请参阅 :help undo-branches。

重做(Redo)会撤销撤销命令的效果。

  • Ctrl + r:重做最后一次撤销的更改。重复按下它会重做后续被撤销的更改。
  • :<count>redo:重做 <count> 次更改。例如,:3redo 重做三次被撤销的更改。