diff --git "a/docs/Vim/Vim\347\274\226\350\276\221\345\231\250.md" "b/docs/Vim/Vim\347\274\226\350\276\221\345\231\250.md" index 0f31939..86712c3 100644 --- "a/docs/Vim/Vim\347\274\226\350\276\221\345\231\250.md" +++ "b/docs/Vim/Vim\347\274\226\350\276\221\345\231\250.md" @@ -112,3 +112,103 @@ - `dtc`:删除当前光标到下一个 c 字符之间的内容 (不包含 c) - `p`:在光标之后黏贴 - `P`:在光标之前黏贴 + +## 宏 + +### 录制和回放命令:Vim 宏 + +在所有见过的 Vim 的功能中,宏应该是能给人最多的满足感的。 + +大家应该都知道 `.` 命令会重复上述更改。但是,如果想要重复任何事情,比如一系列的多个变化和动作,就可以使用宏,有三个步骤: + +1. `q{register}` 命令将击键记录到寄存器中命名为 `{register}`。寄存器名称必须介于 `a` 和 `z` 的字母。 + +2. 键入命令。 + +3. 最后键入 `q` 就是完成录制。 + +现在,你就可以通过键入命令 `@{register}` 来执行宏。 + +可以看一个例子。你有一个如下所示的文件名列表: + +```c +stdio.h +fcntl.h +unistd.h +stdlib.h +``` + +但是你希望它看起来像这样: + +```c +#include "stdio.h" +#include "fcntl.h" +#include "unistd.h" +#include "stdlib.h" +``` + +很简单,只需要输入以下命令: + +1. `qa`: 开始在寄存器 `a` 中录制宏。 + +2. `^`: 移动到行的开头。 + +3. `i#include "`: 在行首插入字符串 `#include "`。 + +4. `$`: 移动到行的末尾。 + +5. `a"`: 将双引号附加到行尾。 + +6. `j`: 转到下一行。 + +7. `q`: 停止录制宏。 + +现在你的寄存器中有一个宏,这个时候就可以通过键入 `@a` 命令三次来运行它了。`@a` 命令前可以有一个计数,因此在这种情况下,可以键入 `3@a`。 + +如果已经执行了 `@a` 一次操作,则可以使用 `@@` 再次运行该宏,这样打字就方便多了,如果现在使用 `@b` 执行寄存器 b,则下一个 `@@` 将使用寄存器 b。 + +顺便说一句,宏是可以递归的,你可以将宏放到宏里边,即使它是同一个宏。 + +### 宏和寄存器 + +或许你已经注意到了,寄存器既用于宏,也用于 yank 和 delete 命令。这有一些优点。 + +假设你在寄存器 `n` 中记录了几个命令。然后当你执行 `@n` 命令的时候,你会注意到你做错了某些事情,你可以再次尝试录制,但或许你会犯其他的错误,相反,你可以以下技巧: + +- `G`: 转到文件末尾。 + +- `o`: 创建一个空行。 + +- `"np`: 从寄存器 `n` 中拿出文本,并放置到当前行中,现在你可以在文件中看到以文本方式键入的命令了。 + +- `{edits}`: 更改错误的命令,这就像编辑文本一样。 + +- `0`: 转到行的开头。 + +- `"ny$`: 将更正的命令拉入寄存器 `n` 中。 + +- `dd`: 删除暂存线。 + +现在,你可以使用 `@n` 执行更正的命令。 + +这个技巧是 Unix 和 Vim 哲学的一个很好的例子:如果你知道如何修改文本,叠加一切都是由文本构成的,那么你可以做任何事情。 + +### 附加到 register + +到目前为止,我们使用小写字母作为寄存器名称。若要追加到寄存器,可以使用大写字母。 + +假设你在寄存器 `c` 中录制了一个宏。它工作正常,但你想添加对单词的搜索。这可以通过 `qC` 来完成,它附加到寄存器 `c` 中:`qC/wordq`。 + +这同样适用于宏,复制和删除命令,例如:`"AY` 将复制一行并将其附加到寄存器 `a` 中。 + +### 保存宏 `let` 命令 + +有两种方法可以保存宏供以后使用。 + +默认情况下,最简单的方法是 Vim 会自动保存你的寄存器,并在启动时恢复它们。(VSCode 不支持)。 + +第二种方法(特别是如果你认为你可能会意外覆盖它)是在你的 `.vimrc` 文件中使用命令 `:let`,例如:`let @a='0fa'`。 + +> 请记住,如果你的宏包含回车符或其他一些特殊字符,则需要在命令中 `:let` 显式编写它,例如 ``。但是具体请查阅编辑器和操作系统的文档,因为特殊字符很棘手。 + +JetBrains 支持 `:let` 命令,但是 VSCode 不支持 `:let` 命令。