跳到正文

Vim 的模式与移动 ​

Vim 把「输入文字」和「操作文字」拆成两套键盘,移动命令就是这套语言里的名词。

模式决定按键含义 ​

一个 x 在 Insert 模式输入字符,在 Normal 模式删掉光标下的字符,在 Visual 模式删掉选区。同一个键三种含义,这就是模态编辑的全部秘密。

模式进入方式用途
Normal<ESC>移动与执行编辑命令,默认
Inserti打字
ReplaceR覆盖输入
Visualv按字符选中
Visual LineV按行选中
Visual Block<C-v>按矩形块选中
Command-line::w、:q、替换等

从 Normal 进入 Insert 有一族入口:a 在光标后插入,I 在行首,A 在行尾,o 在下方开新行,O 在上方开新行。

左下角会显示当前模式,迷路时先看它。Vim 刻意不用鼠标,也劝你别用方向键:前者让你离开主键区去找指针,后者要移动整只右手,都比 hjkl 慢。

i a oEscv V Ctrl-vEsc命令模式EscNormalInsertVisualCommand line

移动是名词 ​

Vim 的移动命令描述文本块,编辑命令再作用其上。先形成「这里的一个词」「到行尾」这样的空间直觉,按键才记得住。

目标按键
字符h j k l
词w b e
行首行尾0 ^ $
屏幕三处H M L
半屏<C-u> <C-d>
文件首尾gg G
指定行{n}G 或 :{n}<CR>
配对符号%
行内查找f t F T
搜索/{regex} ?{regex}

{n}G 与 :{n}<CR> 效果相同,前者不离开 Normal,后者会短暂进命令行。改完代码想回到原来的位置,<C-o> 可以跳回上一个位置。

行内查找与搜索 ​

f 找下一个字符,t 停在它前面;小写向前,大写向后。这两个命令比连续按 l 快得多,尤其在一行里追括号和引号的时候。

vim
f(        " 跳到本行下一个左括号
3f,       " 跳到本行第三个逗号
;         " 重复上一次 f 或 t
,         " 反向重复
/def main " 向下搜索,回车确认
n         " 下一个匹配
N         " 上一个匹配

搜索会记进历史,/ 之后按方向键上就能重用。:noh 清掉高亮,光标停在原地。

让 Escape 变便宜 ​

Vim 里按 <ESC> 的频率高到会拖慢手指。把 Caps Lock 映射成 Escape 是最划算的一次投资,macOS 在「系统设置 → 键盘 → 键盘快捷键 → 修饰键」里就能改。

不想动系统键位,也可以在插入模式里映射 jk:

vim
inoremap jk <ESC>

inoremap 只作用于 Insert 模式,不会污染 Normal 模式里的 j、k。映射之后打字稍慢一点,但手不用离开主键区。

练习路径 ​

vimtutor 是 Vim 自带的交互教程,半小时能过一遍基础。之后最好的练习方式是把编辑器、Shell、浏览器的 Vim 模式全打开,逼自己在真实任务里用。

  • vimtutor:自带教程,讲模式、移动、删除、粘贴
  • set -o vi:bash 的行编辑进入 vi 模式,<ESC> 后可用移动命令
  • bindkey -v:zsh 的同类开关
  • VimGolf:用最少按键完成一次编辑,专练组合

头一周效率一定下降,这是正常的。判断标准不是「比原来快」,而是「还需要几次查文档」。