# Vim 快速参考

*模式、导航、编辑、搜索、宏、缓冲区*

> Source: Vim Documentation (vimdoc.sourceforge.net) · MIT

## 模式

### 模式切换

| Command | Description |
|---------|-------------|
| `i` | 插入模式（光标前） |
| `a` | 插入模式（光标后） |
| `o` | 在下方新建行并进入插入模式 |
| `O` | 在上方新建行并进入插入模式 |
| `v` | 可视模式（字符） |
| `V` | 可视模式（行） |
| `Ctrl+v` | 可视块模式 |
| `:` | 命令行模式 |
| `R` | 替换模式 |
| `Esc` | 返回普通模式 |

## 导航

### 字符与行移动

| Command | Description |
|---------|-------------|
| `h j k l` | 左、下、上、右 |
| `0 / ^` | 行首 / 第一个非空字符 |
| `$` | 行尾 |
| `w / W` | 下一个单词 / WORD |
| `b / B` | 上一个单词 / WORD |
| `e / E` | 单词末尾 / WORD 末尾 |
| `f{c} / F{c}` | 向前/向后查找字符 |
| `t{c} / T{c}` | 向前/向后跳到字符前 |

### 屏幕与文件移动

| Command | Description |
|---------|-------------|
| `gg / G` | 跳到第一行 / 最后一行 |
| `:{n}` | 跳到第 n 行 |
| `Ctrl+d / Ctrl+u` | 向下/向上半页 |
| `Ctrl+f / Ctrl+b` | 向下/向上整页 |
| `H / M / L` | 屏幕顶部/中部/底部 |
| `%` | 跳到匹配的括号 |

## 编辑

### 插入与追加

| Command | Description |
|---------|-------------|
| `I` | 在行首插入 |
| `A` | 在行尾追加 |
| `ea` | 在单词末尾追加 |
| `gi` | 在上次插入位置继续插入 |

### 删除与修改

| Command | Description |
|---------|-------------|
| `x / X` | 删除光标下/前的字符 |
| `dd` | 删除整行 |
| `dw` | 删除单词 |
| `d$ / D` | 删除到行尾 |
| `cc / S` | 修改整行 |
| `cw` | 修改单词 |
| `c$ / C` | 修改到行尾 |
| `ci" / ci(` | 修改引号/括号内的内容 |

### 复制与粘贴

| Command | Description |
|---------|-------------|
| `yy` | 复制（yank）整行 |
| `yw` | 复制单词 |
| `y$` | 复制到行尾 |
| `p / P` | 在光标后/前粘贴 |
| `J` | 将下一行合并到当前行 |

### 撤销与重复

| Command | Description |
|---------|-------------|
| `u` | 撤销 |
| `Ctrl+r` | 重做 |
| `.` | 重复上次命令 |

## 搜索与替换

### 搜索

| Command | Description |
|---------|-------------|
| `/pattern` | 向前搜索 |
| `?pattern` | 向后搜索 |
| `n / N` | 下一个/上一个匹配 |
| `*` | 向前搜索光标下的单词 |
| `#` | 向后搜索光标下的单词 |

### 替换

```
:s/old/new/       " replace first on line
:s/old/new/g      " replace all on line
:%s/old/new/g     " replace all in file
:%s/old/new/gc    " replace all, confirm each
```

## 可视模式

### 选择

| Command | Description |
|---------|-------------|
| `v` | 开始字符选择 |
| `V` | 开始行选择 |
| `Ctrl+v` | 开始块选择 |
| `o` | 移动到选区另一端 |
| `gv` | 重新选择上次的可视选区 |

### 对选区的操作

| Command | Description |
|---------|-------------|
| `d` | 删除选区 |
| `y` | 复制选区 |
| `c` | 修改选区 |
| `>` | 缩进选区 |
| `<` | 反缩进选区 |
| `~` | 切换大小写 |
| `U / u` | 选区转大写/小写 |

## 缓冲区与窗口

### 缓冲区

| Command | Description |
|---------|-------------|
| `:ls` | 列出所有已打开缓冲区 |
| `:bn / :bp` | 下一个/上一个缓冲区 |
| `:b{n}` | 跳到第 n 个缓冲区 |
| `:bd` | 关闭当前缓冲区 |
| `:e file` | 在新缓冲区中打开文件 |

### 窗口

| Command | Description |
|---------|-------------|
| `:sp file` | 水平分割 |
| `:vsp file` | 垂直分割 |
| `Ctrl+w h/j/k/l` | 切换到指定方向的窗口 |
| `Ctrl+w =` | 均衡所有窗口大小 |
| `Ctrl+w q` | 关闭窗口 |

### 标签页

| Command | Description |
|---------|-------------|
| `:tabnew file` | 在新标签页中打开文件 |
| `gt / gT` | 下一个/上一个标签页 |
| `:tabclose` | 关闭当前标签页 |

## 寄存器

### 使用寄存器

| Command | Description |
|---------|-------------|
| `"ay` | 复制到寄存器 a |
| `"ap` | 从寄存器 a 粘贴 |
| `"Ay` | 追加复制到寄存器 a |
| `:reg` | 显示所有寄存器 |

### 特殊寄存器

| Command | Description |
|---------|-------------|
| `""` | 无名寄存器（最近删除/复制的内容） |
| `"0` | 最近一次 yank |
| `"+"` | 系统剪贴板 |
| `"/"` | 最近的搜索模式 |
| `".` | 最近插入的文本 |
| `"_` | 黑洞寄存器（丢弃内容） |

## 宏

### 录制与播放

| Command | Description |
|---------|-------------|
| `q{a}` | 开始录制宏到寄存器 a |
| `q` | 停止录制 |
| `@{a}` | 播放寄存器 a 中的宏 |
| `@@` | 重播上次执行的宏 |
| `5@a` | 播放宏 a 共 5 次 |

### 宏示例

```
qa        " start recording into a
I//       " insert // at line start
Esc j     " return to normal, move down
q         " stop recording
10@a      " comment next 10 lines
```

## 设置

### 常用选项

```
:set number         " show line numbers
:set relativenumber  " relative line numbers
:set tabstop=4      " tab width
:set expandtab      " spaces instead of tabs
:set ignorecase     " case-insensitive search
```

### 显示与行为

```
:set wrap / nowrap   " toggle line wrapping
:set hlsearch        " highlight search matches
:set incsearch       " incremental search
:set cursorline      " highlight current line
:syntax on           " enable syntax highlighting
```

## 文件操作

### 保存与退出

| Command | Description |
|---------|-------------|
| `:w` | 保存 |
| `:w file` | 另存为 |
| `:q` | 退出（有未保存内容时失败） |
| `:q!` | 不保存强制退出 |
| `:wq / :x / ZZ` | 保存并退出 |
| `:wa` | 保存所有缓冲区 |
| `:qa` | 退出所有缓冲区 |

### 文件信息与外部命令

| Command | Description |
|---------|-------------|
| `Ctrl+g` | 显示文件信息 |
| `:!cmd` | 执行 shell 命令 |
| `:r !cmd` | 将命令输出插入文件 |
| `:r file` | 插入文件内容 |

## 文本对象

### 内部与外部对象

| Command | Description |
|---------|-------------|
| `iw / aw` | 单词内部 / 单词加空格 |
| `is / as` | 句子内部 / 句子加空格 |
| `ip / ap` | 段落内部 / 段落加空行 |
| `i" / a"` | 双引号内部 / 含引号 |
| `i' / a'` | 单引号内部 / 含引号 |
| `i( / a(` | 括号内部 / 含括号 |
| `i{ / a{` | 花括号内部 / 含花括号 |
| `it / at` | HTML 标签内部 / 含标签 |

### 常用组合

```
ciw     " change inner word
di"     " delete inside quotes
ya{     " yank around braces
vip     " select inner paragraph
```

## 标记与跳转

### 标记

| Command | Description |
|---------|-------------|
| `m{a}` | 在当前位置设置标记 a |
| `'a` | 跳到标记 a 所在行 |
| ``a` | 跳到标记 a 的精确位置 |
| `:marks` | 列出所有标记 |

### 跳转列表

| Command | Description |
|---------|-------------|
| `Ctrl+o` | 跳到上一个位置 |
| `Ctrl+i` | 跳到下一个位置 |
| `:jumps` | 显示跳转列表 |
| `''` | 跳到上次跳转的位置 |
