VIM 快速参考
模式、导航、编辑、搜索、宏、缓冲区
模式
模式切换
| i | 插入模式(光标前) |
| a | 插入模式(光标后) |
| o | 在下方新建行并进入插入模式 |
| O | 在上方新建行并进入插入模式 |
| v | 可视模式(字符) |
| V | 可视模式(行) |
| Ctrl+v | 可视块模式 |
| : | 命令行模式 |
| R | 替换模式 |
| Esc | 返回普通模式 |
导航
字符与行移动
| h j k l | 左、下、上、右 |
| 0 / ^ | 行首 / 第一个非空字符 |
| $ | 行尾 |
| w / W | 下一个单词 / WORD |
| b / B | 上一个单词 / WORD |
| e / E | 单词末尾 / WORD 末尾 |
| f{c} / F{c} | 向前/向后查找字符 |
| t{c} / T{c} | 向前/向后跳到字符前 |
屏幕与文件移动
| gg / G | 跳到第一行 / 最后一行 |
| :{n} | 跳到第 n 行 |
| Ctrl+d / Ctrl+u | 向下/向上半页 |
| Ctrl+f / Ctrl+b | 向下/向上整页 |
| H / M / L | 屏幕顶部/中部/底部 |
| % | 跳到匹配的括号 |
编辑
插入与追加
| I | 在行首插入 |
| A | 在行尾追加 |
| ea | 在单词末尾追加 |
| gi | 在上次插入位置继续插入 |
删除与修改
| x / X | 删除光标下/前的字符 |
| dd | 删除整行 |
| dw | 删除单词 |
| d$ / D | 删除到行尾 |
| cc / S | 修改整行 |
| cw | 修改单词 |
| c$ / C | 修改到行尾 |
| ci" / ci( | 修改引号/括号内的内容 |
复制与粘贴
| yy | 复制(yank)整行 |
| yw | 复制单词 |
| y$ | 复制到行尾 |
| p / P | 在光标后/前粘贴 |
| J | 将下一行合并到当前行 |
撤销与重复
搜索与替换
搜索
| /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
可视模式
选择
| v | 开始字符选择 |
| V | 开始行选择 |
| Ctrl+v | 开始块选择 |
| o | 移动到选区另一端 |
| gv | 重新选择上次的可视选区 |
对选区的操作
| d | 删除选区 |
| y | 复制选区 |
| c | 修改选区 |
| > | 缩进选区 |
| < | 反缩进选区 |
| ~ | 切换大小写 |
| U / u | 选区转大写/小写 |
缓冲区与窗口
缓冲区
| :ls | 列出所有已打开缓冲区 |
| :bn / :bp | 下一个/上一个缓冲区 |
| :b{n} | 跳到第 n 个缓冲区 |
| :bd | 关闭当前缓冲区 |
| :e file | 在新缓冲区中打开文件 |
窗口
| :sp file | 水平分割 |
| :vsp file | 垂直分割 |
| Ctrl+w h/j/k/l | 切换到指定方向的窗口 |
| Ctrl+w = | 均衡所有窗口大小 |
| Ctrl+w q | 关闭窗口 |
标签页
| :tabnew file | 在新标签页中打开文件 |
| gt / gT | 下一个/上一个标签页 |
| :tabclose | 关闭当前标签页 |
寄存器
使用寄存器
| "ay | 复制到寄存器 a |
| "ap | 从寄存器 a 粘贴 |
| "Ay | 追加复制到寄存器 a |
| :reg | 显示所有寄存器 |
特殊寄存器
| "" | 无名寄存器(最近删除/复制的内容) |
| "0 | 最近一次 yank |
| "+" | 系统剪贴板 |
| "/" | 最近的搜索模式 |
| ". | 最近插入的文本 |
| "_ | 黑洞寄存器(丢弃内容) |
宏
录制与播放
| 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
文件操作
保存与退出
| :w | 保存 |
| :w file | 另存为 |
| :q | 退出(有未保存内容时失败) |
| :q! | 不保存强制退出 |
| :wq / :x / ZZ | 保存并退出 |
| :wa | 保存所有缓冲区 |
| :qa | 退出所有缓冲区 |
文件信息与外部命令
| Ctrl+g | 显示文件信息 |
| :!cmd | 执行 shell 命令 |
| :r !cmd | 将命令输出插入文件 |
| :r file | 插入文件内容 |
文本对象
内部与外部对象
| 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
标记与跳转
标记
| m{a} | 在当前位置设置标记 a |
| 'a | 跳到标记 a 所在行 |
| `a | 跳到标记 a 的精确位置 |
| :marks | 列出所有标记 |
跳转列表
| Ctrl+o | 跳到上一个位置 |
| Ctrl+i | 跳到下一个位置 |
| :jumps | 显示跳转列表 |
| '' | 跳到上次跳转的位置 |