Vim - 回顾编辑
Vim - 再探编辑功能
Section titled “Vim - 再探编辑功能”除了基本的文本插入和移动,Vim 还提供了丰富的编辑功能集。本节将重新探讨并扩展核心编辑概念:
- 理解 buffers:Vim 中文件的内存表示
- 用于数据恢复的 swap 文件
- 高效地剪切、复制和粘贴文本
- 撤销和重做更改
Buffers(缓冲区)
Section titled “Buffers(缓冲区)”Vim 中的 buffer(缓冲区)是一个临时的内存区域,用于在你编辑文件时保存文件内容。当你打开一个文件(例如 vim myfile.txt)时,Vim 会将文件内容从磁盘读入一个 buffer 中。你所有的更改都将应用于这个 buffer。磁盘上的原始文件在你明确保存 buffer 之前不会被修改(例如使用 :w 命令)。
Vim 可以同时管理多个 buffer,允许你在单个 Vim 会话中处理多个文件。你可以使用 :ls 命令列出所有打开的 buffer,并使用 :bnext(或 :bn)、:bprevious(或 :bp)或 :buffer <name/number> 等命令在它们之间切换。
Swap 文件
Section titled “Swap 文件”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’ 粘贴)进行更复杂的操作。
撤销(Undo)
Section titled “撤销(Undo)”Vim 允许你撤销对 buffer 所做的更改。
u:撤销最后一次更改。重复按u会按顺序撤销之前的更改。<count>u:撤销最近<count>次更改。例如,5u撤销最近五次更改。U(大写):撤销当前行上的所有近期更改,将其恢复到你开始编辑该行(在当前编辑会话中)之前的状态。这与u不同,u是逐个撤销所有行上的更改。
Vim 维护了一个 undo tree(撤销树),允许更复杂的撤销/重做场景,而不仅仅是简单的线性历史。更多详情请参阅 :help undo-branches。
重做(Redo)
Section titled “重做(Redo)”重做(Redo)会撤销撤销命令的效果。
Ctrl + r:重做最后一次撤销的更改。重复按下它会重做后续被撤销的更改。:<count>redo:重做<count>次更改。例如,:3redo重做三次被撤销的更改。