# Vim 常用操作速查卡

> 贴手边的 Vim 快速参考。按功能分组，支持复制速记。

---

## 1. 模式切换

| 按键 | 作用 |
|------|------|
| `i` | 在光标前插入（进入插入模式） |
| `a` | 在光标后追加（进入插入模式） |
| `o` | 在下一行新建行并插入（进入插入模式） |
| `I` | 在行首（第一个非空字符）插入 |
| `A` | 在行末追加 |
| `O` | 在上一行新建行并插入 |
| `Esc` | 回到普通模式 |
| `v` | 进入字符可视模式（逐字选择） |
| `V` | 进入行可视模式（逐行选择） |
| `Ctrl-v` | 进入块可视模式（矩形选择） |

---

## 2. 移动

### 基础移动
| 按键 | 作用 |
|------|------|
| `h` | 左 |
| `j` | 下 |
| `k` | 上 |
| `l` | 右 |
| `w` | 跳到下一个单词开头 |
| `b` | 跳到上一个单词开头 |
| `e` | 跳到当前单词末尾 |
| `0` | 跳到行首 |
| `^` | 跳到行首（第一个非空字符） |
| `$` | 跳到行末 |

### 跳页
| 按键 | 作用 |
|------|------|
| `gg` | 跳到文件开头 |
| `G` | 跳到文件末尾 |
| `Ctrl-u` | 向上翻半页 |
| `Ctrl-d` | 向下翻半页 |
| `Ctrl-f` | 向下翻整页 |
| `Ctrl-b` | 向上翻整页 |

### 块级移动
| 按键 | 作用 |
|------|------|
| `{` | 跳到上一个空行 |
| `}` | 跳到下一个空行 |
| `%` | 在配对括号间跳转（如 `()`、`[]`、`{}` 间） |

### 字符查找
| 按键 | 作用 |
|------|------|
| `f<char>` | 跳到当前行下一个 `<char>` |
| `F<char>` | 跳到当前行上一个 `<char>` |
| `t<char>` | 跳到当前行下一个 `<char>` 前一个位置 |
| `T<char>` | 跳到当前行上一个 `<char>` 后一个位置 |
| `;` | 重复上一个 `f/F/t/T` 命令 |
| `,` | 反向重复上一个 `f/F/t/T` 命令 |

---

## 3. 编辑

### 删除
| 按键 | 作用 |
|------|------|
| `x` | 删除光标所在字符 |
| `X` | 删除光标前字符（backspace） |
| `dd` | 删除整行 |
| `dw` | 删除从光标到下一个单词开头 |
| `db` | 删除从光标到上一个单词开头 |
| `d$` | 删除从光标到行末 |
| `d0` | 删除从行首到光标 |
| `d<motion>` | 删除到指定动作（如 `dj`、`d5w`） |

### 复制与粘贴
| 按键 | 作用 |
|------|------|
| `yy` | 复制整行 |
| `yw` | 复制从光标到下一个单词开头 |
| `y$` | 复制从光标到行末 |
| `y<motion>` | 复制到指定动作 |
| `p` | 在光标后粘贴 |
| `P` | 在光标前粘贴 |

### 修改（删除 + 插入）
| 按键 | 作用 |
|------|------|
| `cc` | 删除整行并进入插入模式 |
| `cw` | 删除单词并进入插入模式 |
| `c$` | 删除到行末并进入插入模式 |
| `c<motion>` | 修改到指定动作 |
| `r<char>` | 用 `<char>` 替换光标所在字符 |
| `R` | 进入替换模式（覆盖输入） |

### 撤销与重做
| 按键 | 作用 |
|------|------|
| `u` | 撤销最后一步操作 |
| `Ctrl-r` | 重做最后撤销的操作 |
| `.` | 重复最后一次操作 |

---

## 4. 查找与替换

### 查找
| 按键 | 作用 |
|------|------|
| `/pattern` | 向下查找 `pattern`（回车确认） |
| `?pattern` | 向上查找 `pattern` |
| `n` | 跳到下一个匹配 |
| `N` | 跳到上一个匹配 |
| `*` | 查找光标所在单词（向下） |
| `#` | 查找光标所在单词（向上） |

### 替换
| 命令 | 作用 |
|------|------|
| `:s/old/new/` | 替换当前行第一个 `old` 为 `new` |
| `:s/old/new/g` | 替换当前行所有 `old` 为 `new` |
| `:n,m s/old/new/g` | 替换第 n 到 m 行的所有 `old` 为 `new` |
| `:%s/old/new/g` | 替换整个文件的所有 `old` 为 `new` |
| `:%s/old/new/gc` | 替换整个文件，每次都询问（c = confirm） |

---

## 5. 多文件 / 窗口 / 缓冲

### 文件操作
| 命令 | 作用 |
|------|------|
| `:e <file>` | 打开或编辑文件 |
| `:w` | 保存当前文件 |
| `:w <file>` | 另存为 `<file>` |
| `:q` | 关闭当前窗口（无修改时） |
| `:q!` | 强制关闭（丢弃修改） |
| `:wq` 或 `:x` | 保存并关闭 |
| `:e!` | 放弃修改，重新加载文件 |

### 窗口分割
| 命令 | 作用 |
|------|------|
| `:sp` | 水平分割窗口（打开相同文件） |
| `:vsp` | 竖直分割窗口（打开相同文件） |
| `:sp <file>` | 水平分割窗口并打开 `<file>` |
| `:vsp <file>` | 竖直分割窗口并打开 `<file>` |

### 窗口切换（Ctrl-w 系列）
| 按键 | 作用 |
|------|------|
| `Ctrl-w w` | 切换到下一个窗口 |
| `Ctrl-w h/j/k/l` | 切换到左/下/上/右窗口 |
| `Ctrl-w c` | 关闭当前窗口 |
| `Ctrl-w o` | 仅保留当前窗口（关闭其他） |
| `Ctrl-w =` | 平均分配窗口大小 |
| `Ctrl-w >/<` | 增加/减少窗口宽度 |
| `Ctrl-w +/-` | 增加/减少窗口高度 |

### 缓冲管理
| 命令 | 作用 |
|------|------|
| `:bn` | 切换到下一个缓冲 |
| `:bp` | 切换到上一个缓冲 |
| `:b<n>` | 切换到缓冲 n（`:ls` 查看缓冲列表） |
| `:ls` 或 `:buffers` | 列出所有缓冲 |
| `:bd` | 删除当前缓冲 |

---

## 6. 组合的威力（必读）

Vim 的精妙在于**操作符 + 动作的组合**。任何删除、复制、修改命令都可以与动作组合。

### 核心模式

```
<operator> <motion>
```

**操作符**：`d`（删除）、`y`（复制）、`c`（修改）、`v`（可视化选择）
**动作**：`w`（单词）、`j`（下一行）、`}`（段落）、`f<char>`（到字符）等

### 常用组合示例

| 按键 | 等效于 | 作用 |
|------|--------|------|
| `di(` | — | 删除括号内内容（删除 inner `(...)` |
| `ci"` | — | 修改双引号内内容 |
| `da{` | — | 删除花括号及其内容（delete around `{}` |
| `yi]` | — | 复制方括号内内容 |
| `dt,` | — | 删除到逗号前（delete till `,` |
| `3dd` | — | 删除 3 行 |
| `5j` | — | 向下移 5 行 |
| `2dw` | — | 删除 2 个单词 |
| `y2e` | — | 复制 2 个单词（到词尾） |

### 文本对象（内部动作）

| 对象 | 作用 |
|------|------|
| `iw` | inner word（单词内部） |
| `aw` | a word（包括单词和空格） |
| `i"` / `i'` / `i`` | 引号内 |
| `a"` / `a'` / `a`` | 引号及其内容 |
| `i(` 或 `ib` | 小括号内 |
| `i[` | 方括号内 |
| `i{` 或 `iB` | 花括号内 |
| `ip` | 段落内 |
| `it` | 标签内（HTML/XML） |

**示例**：
- `caw` → 修改光标所在单词（含空格）
- `yi{` → 复制花括号内容
- `da"` → 删除双引号及其内容

---

## 7. 常用配置片段（.vimrc 起步）

```vim
" 基础设置
set number              " 显示行号
set relativenumber      " 相对行号
set hlsearch            " 高亮搜索结果
set ignorecase          " 搜索忽略大小写
set smartcase           " 智能大小写（有大写字母时区分）
set expandtab           " Tab 转空格
set tabstop=4           " Tab 显示为 4 个空格
set softtabstop=4       " 按 Tab 插入 4 个空格
set shiftwidth=4        " 缩进 4 个空格
set autoindent          " 自动缩进
set mouse=a             " 启用鼠标
set clipboard=unnamed   " 复制到系统剪贴板

" 快捷键映射示例
let mapleader = ","     " 设置 Leader 键为逗号
nnoremap <leader>w :w<CR>      " ,w 保存
nnoremap <leader>q :q<CR>      " ,q 退出
nnoremap <leader>/ :nohlsearch<CR>  " ,/ 关闭搜索高亮

" 括号自动补全（基础版）
inoremap ( ()<Left>
inoremap [ []<Left>
inoremap { {}<Left>
```

---

## 8. 速记提示

### 记住这 3 个核心概念

1. **动作可重复**：`3dd` = 删 3 行，`5j` = 下 5 行
2. **操作符 + 动作**：不用死记 `dw`、`cw`，理解 `d` + `w` 就能推广到 `d$`、`df,`…
3. **可视模式验证**：不确定某个范围时，先 `v` 选择看看，再按 `d`/`y`/`c`

### 进阶提示

- `:set incsearch` 启用搜索时动实时跳转（边输入边显示）
- `Ctrl-]` 跳到标签定义（配合 ctags）
- `gd` 跳到本地变量定义
- `K` 查看光标单词的 man 手册
- `:help <topic>` 获取帮助（如 `:help motion`）

---

**最后：Vim 学习曲线陡峭，但回报远大。不要在 `:wq` 上耗时，集中力量掌握动作组合——那是 Vim 的核心威力。**
