---
sidebar_position: 1
tags: [Programming, Vim]
---

# Normal

## Redo

- `.` **微型宏**, 重复上一次(插入命令 至 `<Esc>`)录制动作
- `;`: 重复 `t`/`T`/`f`/`F`
- `:&`: 重复 `:substitute`
- `@`:

| 命令          | 作用                 |
| :------------ | :------------------- |
| `@{register}` | 重复寄存器中的宏命令 |
| `@:`          | 重复任意 Ex 命令     |
| `@@`          | 重复@命令            |

## Undo

| 目的                     | 操作                    | 重复 | 回退 |
| :----------------------- | :---------------------- | :--- | :--- |
| 做出一个修改             | `{edit}`                | `.`  | `u`  |
| 在行内查找下一指定字符   | `f{char}/t{char}`       | `;`  | `,`  |
| 在行内查找上一指定字符   | `F{char}/T{char}`       | `;`  | `,`  |
| 在文档中查找下一处匹配项 | `/pattern<CR>`          | `n`  | `N`  |
| 在文档中查找上一处匹配项 | `?pattern<CR>`          | `n`  | `N`  |
| 执行替换                 | `:s/target/replacement` | `&`  | `u`  |
| 执行一系列修改           | `qx{changes}q`          | `@x` | `u`  |

## Compound

| 复合命令 | 等效的长命令 |
| :------- | :----------- |
| `C`      | `c$`         |
| `s`      | `cl`         |
| `S`      | `^c`         |
| `I`      | `^i`         |
| `A`      | `$a`         |
| `o`      | `A<CR>`      |
| `O`      | `ko`         |

## Operator

操作符命令 + 动作命令 (范围), `Operator + {Motion}`.

:::tip

```vim
:h operator
:h :map-operator
```

:::

**操作符命令**, 基本编辑命令:

| 命令 | 作用                                   |
| :--- | :------------------------------------- |
| `c`  | 修改                                   |
| `d`  | 删除                                   |
| `y`  | 复制到寄存器                           |
| `g~` | 反转大小写                             |
| `gu` | 转换为小写                             |
| `gU` | 转换为大写                             |
| `>`  | 增加缩进                               |
| `<`  | 减小缩进                               |
| `=`  | 自动缩进                               |
| `!`  | 使用外部程序过滤 `{motion}` 所跨越的行 |

### Filter

- `!!{filter-command}`: 过滤当前行
- `v!{filter-command}`: 过滤选区
- `!{motion}{filter-command}`: 过滤 `{motion}` 所跨越的行

```vim
" Insert date
!!date
" Sort block
v!sort
" Format JSON
!}jq
```

## Motion

**动作命令**:

- `a`(all)/`i`(in)/`t`(til): e.g. `$`/`2l`/`aw`/`ap` 或 `/patterns`
- 模式串: `/patterns`
- `0`/`$`: 行首/尾
- 文本对象: `i`/`a`
- 分隔符文本对象 (separator text objects):

| 分隔符文本对象 | 选择区域                        |
| :------------- | :------------------------------ |
| `a)` 或 `ab`   | 一对圆括号 `(parentheses)`      |
| `i)` 或 `ib`   | 圆括号 `(parentheses)` 内部     |
| `a}` 或 `aB`   | 一对花括号 `{braces}`           |
| `i}` 或 `iB`   | 花括号 `{braces}` 内部          |
| `a]`           | 一对方括号 `[brackets]`         |
| `i]`           | 方括号 `[brackets]` 内部        |
| `a>`           | 一对尖括号 `<angle brackets>`   |
| `i>`           | 尖括号 `<angle brackets>` 内部  |
| `a'`           | 一对单引号 `'single quotes'`    |
| `i'`           | 单引号 `'single quotes'` 内部   |
| `a"`           | 一对双引号 `"double quotes"`    |
| `i"`           | 双引号 `"double quotes"` 内部   |
| `` a` ``       | 一对反引号 \`backticks\`        |
| `` i` ``       | 反引号 \`backticks\` 内部       |
| `at`           | 一对 XML 标签 `<xml>tags</xml>` |
| `it`           | XML 标签内部                    |

- 范围文本对象 (range text objects):

| 范围文本对象 | 选择范围           |
| :----------- | :----------------- |
| `iw`         | 当前单词           |
| `aw`         | 当前单词及一个空格 |
| `iW`         | 当前字串           |
| `aW`         | 当前字串及一个空格 |
| `is`         | 当前句子           |
| `as`         | 当前句子及一个空格 |
| `ip`         | 当前段落           |
| `ap`         | 当前段落及一个空行 |

## Insert

| 复合命令 | 等效的长命令 |
| :------- | :----------- |
| `C`      | `c$`         |
| `s`      | `cl`         |
| `S`      | `^c`         |
| `I`      | `^i`         |
| `A`      | `$a`         |
| `o`      | `A<CR>`      |
| `O`      | `ko`         |

## Register

`{register}{operator}{motion}` / `<C-r>{register}`:

| 寄存器符号  | 作用                      | 使用范例                         |
| :---------- | :------------------------ | :------------------------------- |
| `""`        | 无名寄存器                | e.g. `yiw` / `diw`               |
| `"a` ~ `"z` | 有名寄存器                | e.g. `"ayiw`                     |
| `"0`        | 复制专用寄存器            | e.g. `yiw` + `diw` + `"0p`       |
| `"_`        | 黑洞寄存器/有去无回寄存器 | e.g. `"_diw`                     |
| `"+`        | 系统剪贴板寄存器          | e.g. `"+p` / `InsertMode <C-r>+` |
| `"*`        | 上次高亮文本寄存器        | e.g. `"+p` / `InsertMode <C-r>*` |
| `"=`        | 表达式寄存器              | e.g. `"+p` / `InsertMode <C-r>=` |
| `"%`        | 当前文件名                |                                  |
| `"#`        | 轮换文件名                |                                  |
| `".`        | 上次插入的文本            |                                  |
| `":`        | 上次执行的 Ex 命令        |                                  |
| `"/`        | 上次查找的模式            |                                  |

`:reg {register}` 显示寄存器内容

## Delete

`{number}{register}d/s/x{motion}`.

## Copy

`{number}{register}y{motion}`.

## Paste

`{number}{register}p{motion}`.

## Replace

- `gU{motion}`: 小写转大写 e.g. `gUaw`.
- `r{char}`: 替换光标所在字符.
- `gr{char}`.
- `R/gR` 进入替换模式.

## Indent

`>{motion}`

e.g. >G: 缩进全文

`={motion}`

`gg=G` 自动缩进全文

:::tip[格式化（Formatting）]

`={motion}` 在 VSCode 中会调用 [formatting](https://code.visualstudio.com/docs/editing/codebasics#_formatting) 命令，
可以快速格式化代码。

:::

## Comments

`\\{motion}`

> vim-commentary 插件

- `\\\` 注释行.
- `\\ap` 注释段落.

## Jump

### 基本域

| 命令          | 光标动作                          |
| :------------ | :-------------------------------- |
| `%`           | 跳转至下一个配对的范围符号        |
| `j`           | 向下移动一个实际行                |
| `gj`          | 向下移动一个屏幕行                |
| `k`           | 向上移动一个实际行                |
| `gk`          | 向上移动一个屏幕行                |
| `w`           | 正向移动到下一单词的开头          |
| `b`           | 反向移动到当前单词/上一单词的开头 |
| `e`           | 正向移动到当前单词/下一单词的结尾 |
| `ge`          | 反向移动到上一单词的结尾          |
| `0`           | 移动到实际行的行首                |
| `g0`          | 移动到屏幕行的行首                |
| `$`           | 移动到实际行的行尾                |
| `g$`          | 移动到屏幕行的行尾                |
| `^`           | 移动到实际行的第一个非空白字符    |
| `g^`          | 移动到屏幕行的第一个非空白字符    |
| `_`           | First char of line                |
| `g_`          | Last char of line                 |
| `H`           | Jump to top of screen             |
| `M`           | Jump to middle of screen          |
| `L`           | Jump to bottom of screen          |
| `zt`          | Current line to top of screen     |
| `zz`          | Current line to middle of screen  |
| `zb`          | Current line to bottom of screen  |
| `<C-u>/<C-d>` | 翻半页                            |
| `<C-b>/<C-f>` | 翻半页                            |
| `<C-o>`       | 跳转到较老位置                    |
| `<C-i>`       | 跳转到较新位置                    |
| `g;`          | 跳转到较早修改位置                |
| `g,`          | 跳转到较新修改位置                |
| `gd`          | Jump to definition                |
| `gi`          | Jump to last insert position      |
| `#`           | Jump to previous same word        |
| `*`           | Jump to next same word            |

查看 `path` 值 `:set path?`:

| 命令                                   | 作用                            |
| :------------------------------------- | :------------------------------ |
| `[count]G`                             | 跳转到指定的行号                |
| `/pattern<CR>` `/?pattern<CR>` `n` `N` | 跳转到下一个/上一个模式出现之处 |
| `%`                                    | 跳转到匹配的括号所在之处        |
| `(` `)`                                | 跳转到上一句/下一句的开头       |
| `{` `}`                                | 跳转到上一段/下一段的开头       |
| `gf`                                   | 跳转到光标下的文件名            |
| `gg`                                   | 文首                            |
| `G`                                    | 文尾                            |
| `<N>gg`                                | jump to line                    |
| `<N>%`                                 | jump to percent of file         |
| `<C-]>`                                | 跳转到光标下关键字的定义之处    |
| \``{mark}`                             | 跳转到一个位置标记              |

### Square Bracket Motions

`:help [`:

| 分类   | 快捷键      | 功能描述                                      |
| :----- | :---------- | :-------------------------------------------- |
| 代码块 | `[[` / `]]` | 跳转到上一个 / 下一个函数开头 (第一列的 `{`)  |
|        | `[]` / `][` | 跳转到上一个 / 下一个函数结尾 (第一列的 `}`)  |
|        | `[{` / `]}` | 跳转到当前代码块的起始 `{` 或结束 `}`         |
|        | `[(` / `])` | 跳转到当前括号对的起始 `(` 或结束 `)`         |
| 拼写   | `[s` / `]s` | 跳转到上一个 / 下一个拼写错误                 |
| 诊断   | `[d` / `]d` | 跳转到上一个 / 下一个诊断信息 (LSP) 或宏定义  |
| 搜索   | `[i`        | 显示光标下单词在文件中首次出现的一行          |
| 宏定义 | `[D` / `]D` | 列出当前文件及包含文件中所有匹配的宏定义      |
| 注释   | `[/` / `]/` | 跳转到注释 `/* */` 的开头或结尾               |
| 预处理 | `[#` / `]#` | 跳转到上一个 / 下一个未闭合的 `#if` / `#else` |

### 标记

`m{alpha}` 标记当前光标处, 标记名为 `alpha`.

| 位置标记    | 跳转到                           |
| :---------- | :------------------------------- |
| \``{alpha}` | 自定义标记处                     |
| \`\`        | 当前文件中上次跳转动作之前的位置 |
| \``.`       | 上次修改的地方                   |
| \``^`       | 上次插入的地方                   |
| \``[`       | 上次修改或复制的起始位置         |
| \``]`       | 上次修改或复制的结束位置         |
| \``<`       | 上次高亮选区的起始位置           |
| \``>`       | 上次高亮选区的结束位置           |

### Spell

| 命令  | 作用                                 |
| :---- | :----------------------------------- |
| `]s`  | 跳到下一处拼写错误                   |
| `[s`  | 跳到上一处拼写错误                   |
| `z=`  | 为当前单词提供更正建议               |
| `zg`  | 把当前单词添加到拼写文件中           |
| `zw`  | 把当前单词从拼写文件中删除           |
| `zug` | 撤销针对当前单词的 `zg` 或 `zw` 命令 |

## Search

### Character

| 命令 | 光标动作                          |
| :--- | :-------------------------------- |
| `w`  | 正向移动到下一单词的开头          |
| `b`  | 反向移动到当前单词/上一单词的开头 |
| `e`  | 正向移动到当前单词/下一单词的结尾 |
| `ge` | 反向移动到上一单词的结尾          |
| `;`  | 重复`f`/`F`/`t`/`T`               |
| `,`  | 撤销`f`/`F`/`t`/`T`               |

- `<C-a>/<C-x>`: 查找数字, 递增/减数字
- `g <C-a>`: (visual mode) 快速递增数字

### Pattern

```bash
/pattern<CR>
?pattern<CR>
n
N
```

#### 原字符

| 原字符      | 作用                                  | 范例              |
| :---------- | :------------------------------------ | :---------------- |
| `\c`        | 忽略大小写                            |                   |
| `\C`        | 大小写敏感                            |                   |
| `\v`        | 开启 very magic 模式(可省略转义符)    |                   |
| `<` 与 `>`  | \v 模式下的单词定界符                 |                   |
| `%(` 与 `)` | 分组符                                | `/\v%(And\|D)rew` |
| `\V`        | 开启原义模式(可省略转义符):           |                   |
| `\w`        | 匹配单词类字符(alphabet, number, `_`) |                   |
| `\W`        | 匹配非单词字符                        |                   |
| `\x`        | 匹配十六进制数`[0-9a-fA-F]`           |                   |
| `\s`        | 匹配空白符`/`换行符                   |                   |
| `\zs`       | 界定一个匹配的开始                    |                   |
| `\ze`       | 界定一个匹配的结束                    |                   |

#### Flags

置于 patterns 末尾:

| Flags | 作用                                                      |
| :---- | :-------------------------------------------------------- |
| `/g`  | 全局                                                      |
| `/e`  | 光标至匹配词末尾                                          |
| `/c`  | 确认或拒绝每一处修改                                      |
| `/n`  | 会抑制正常的替换行为,只报告本次 substitute 命令匹配的个数 |
| `/&`  | 重复上次 flags                                            |
