Vim 常用的模式有四种:

  • 普通模式:Vim 启动后的默认模式,用来移动光标、删除文本、覆盖输入文本、恢复操作、粘贴文本等等。

  • 插入模式:输入 i 或 a 进入插入模式,在这个模式下敲击键盘会往文字缓冲区增加文字,相当于普通编辑器的编辑模式。

  • 可视模式:选择文本,可以行选、块选和依次选择,选择后可以进行复制、删除、排序等操作。

  • 命令模式:执行内部和外部命令,通过 “:”“/”“?”“:!” 可以进入命令模式,分别对应的是:执行内部命令、向上或向下搜索、执行外部命令。

重复操作

  • . 命令可以让我们重复上次的修改,它是Vim中最为强大的多面手。
  • yyp 复制当前行

删除

  • x 命令会删除光标下的字符
  • dw删除单词(需要用b移动到单词前)
  • daw在任意位置删除单词(delete a word)
  • dd 删除当前行
  • D 则相当于 d$,删除到行尾。

插入

  • i在光标之前,进入插入模式
  • I在本行开头,进入插入模式
  • a在光标之后,进入插入模式
  • A在本行结尾,进入插入模式
  • o在本行之后新增一行,并进入插入模式
  • O在本行之前新增一行,并进入插入模式
  • s删除当前字符,并进入插入模式
  • S删除当前行中的所有文本,并进入插入模式

恢复

  • u撤销上次的修改

移动

  • $ 移动到末尾(光标前)
  • a移动到末尾(光标后)
  • b 移动到单词的首端
  • 0 跳转到行首
  • gg 命令跳转到开头

  • 行移动

    • 下移一行
      • j
    • 下移十行
      • 10j

修改

  • 加动作来进行修改(cc 修改整行);C 则相当于 c$,删除到行尾然后进入插入模式。
  • s 相当于 cl,删除一个字符然后进入插入模式;S 相当于 cc,替换整行的内容。
  • i 在当前字符前面进入插入模式;I 则相当于 ^i,把光标移到行首非空白字符上然后进入插入模式。
  • o 在当前行下方插入一个新行,然后在这行进入插入模式;O 在当前行上方插入一个新行,然后在这行进入插入模式。
  • u撤销最近的一个修改动作;U 撤销当前行上的所有修改
  • r 替换光标下的字符;R 则进入替换模式,每次按键(直到 )替换一个字符。

退出

  • 无条件退出
    • :q! / ZQ
  • 存盘并退出
    • :wq / ZZ

重复操作

; 重复最近的字符查找(f、t 等)操作

, 重复最近的字符查找操作,反方向

n 重复最近的字符串查找操作(/ 和 ?)

N 重复最近的字符串查找操作(/ 和 ?),反方向

. 重复执行最近的修改操作

image.png

删除前一个字符。删除前一个单词,删除至行首,删除至末尾

切换到普通模式

image.png

image.png

image.png

  1. dd删除
  2. .重复上次的操作

  3. G会增加从当前行到文档末尾处的缩进层级

  4. h 左移一列

  5. l 右移一列
  6. j 下移一行
  7. k 上移一行
  8. 0 移动到屏幕行的行首
  9. $移动到实际行的行尾
  10. w 正向移动到下一单词的开头
  11. b 反向移动到当前单词/上一个单词的开头
  12. e 正向移动到当前单词/下一单词的结尾
  13. % 在()之间的跳转
  14. :q! 放弃更改
  15. :%s/源字符串/目的字符串/g 全局批量替换字符串

先定单位再定量

操作对象的范围计算公式为:操作范围 = 操作次数 * 操作单位。比如:5h 命令左移 5 个字符,8w 命令右移 8 个单词。

Vi/Vim 中操作单位有很多,按从小到大的顺序为(括号内为相应的操作命令):字符(h、l)→ 单词 (w、W、b、B、e) → 行 (j、k、0、^、$、:n) → 句子((、))→ 段落({、})→ 屏 (H、M、L) → 页(Ctrl-f、Ctrl-b、Ctrl-u、Ctrl-d) → 文件(G、gg、:0、:$)。

操作单位 命令 说明
字符 h左移一位,l右移一位
单词 w/W 移动到下一单词的开头 b/B 移动到上一单词的开头 e/E 移动到光标所在单词的末尾 W、B、E 命令操作的单词是以空白字符(空格、Tab)分隔的字串,比如字符串“str1-str2 str3-str4”,对 W、B、E 命令来说是两个单词,而对 w、b、e 命令来说则是四个单词。
j 下移一行 k 上移一行 0 移到当前行开头 ^ 移到当前行的第一个非空字符 $ 移到当前行末尾 :n 移动到第 n 行 0 为数字零(zero)
句子 ) 移动到当前句子的末尾 ( 移动到当前句子的开头

TODO

  1. 回到标记的位置