Skip to content

Commit

Permalink
feat: vim marco
Browse files Browse the repository at this point in the history
  • Loading branch information
LauGaHo committed Feb 15, 2024
1 parent 6e8df7a commit 473b045
Showing 1 changed file with 100 additions and 0 deletions.
100 changes: 100 additions & 0 deletions docs/Vim/Vim编辑器.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 "<ESC>`: 在行首插入字符串 `#include "`

4. `$`: 移动到行的末尾。

5. `a"<ESC>`: 将双引号附加到行尾。

6. `j`: 转到下一行。

7. `q`: 停止录制宏。

现在你的寄存器中有一个宏,这个时候就可以通过键入 `@a` 命令三次来运行它了。`@a` 命令前可以有一个计数,因此在这种情况下,可以键入 `3@a`

如果已经执行了 `@a` 一次操作,则可以使用 `@@` 再次运行该宏,这样打字就方便多了,如果现在使用 `@b` 执行寄存器 b,则下一个 `@@` 将使用寄存器 b。

顺便说一句,宏是可以递归的,你可以将宏放到宏里边,即使它是同一个宏。

### 宏和寄存器

或许你已经注意到了,寄存器既用于宏,也用于 yank 和 delete 命令。这有一些优点。

假设你在寄存器 `n` 中记录了几个命令。然后当你执行 `@n` 命令的时候,你会注意到你做错了某些事情,你可以再次尝试录制,但或许你会犯其他的错误,相反,你可以以下技巧:

- `G`: 转到文件末尾。

- `o<ESC>`: 创建一个空行。

- `"np`: 从寄存器 `n` 中拿出文本,并放置到当前行中,现在你可以在文件中看到以文本方式键入的命令了。

- `{edits}`: 更改错误的命令,这就像编辑文本一样。

- `0`: 转到行的开头。

- `"ny$`: 将更正的命令拉入寄存器 `n` 中。

- `dd`: 删除暂存线。

现在,你可以使用 `@n` 执行更正的命令。

这个技巧是 Unix 和 Vim 哲学的一个很好的例子:如果你知道如何修改文本,叠加一切都是由文本构成的,那么你可以做任何事情。

### 附加到 register

到目前为止,我们使用小写字母作为寄存器名称。若要追加到寄存器,可以使用大写字母。

假设你在寄存器 `c` 中录制了一个宏。它工作正常,但你想添加对单词的搜索。这可以通过 `qC` 来完成,它附加到寄存器 `c` 中:`qC/word<ENTER>q`

这同样适用于宏,复制和删除命令,例如:`"AY` 将复制一行并将其附加到寄存器 `a` 中。

### 保存宏 `let` 命令

有两种方法可以保存宏供以后使用。

默认情况下,最简单的方法是 Vim 会自动保存你的寄存器,并在启动时恢复它们。(VSCode 不支持)。

第二种方法(特别是如果你认为你可能会意外覆盖它)是在你的 `.vimrc` 文件中使用命令 `:let`,例如:`let @a='0fa'`

> 请记住,如果你的宏包含回车符或其他一些特殊字符,则需要在命令中 `:let` 显式编写它,例如 `<ENTER>`。但是具体请查阅编辑器和操作系统的文档,因为特殊字符很棘手。
JetBrains 支持 `:let` 命令,但是 VSCode 不支持 `:let` 命令。

0 comments on commit 473b045

Please sign in to comment.