练习

Interactive Vim tutorial

Vim的工作模式

%%{
  init: {
    'theme': 'base',
    'themeVariables': {
      'primaryColor': '#ffff',
      'primaryTextColor': '#000f',
      'primaryBorderColor': '#000f',
      'lineColor': '#000f',
      'secondaryColor': '#0000',
      'tertiaryColor': '#0000'
    }
  }
}%%
graph TB
command["命令模式
Command"] insert["插入模式
Insert"] replace(["取代模式
Replace"]) visual(["可视模式
Visual"]) lastline["底线命令模式
Last Line"] command--"i,a,o"--> insert insert --"Esc"--> command command--"r,R"--> replace replace --"Esc"--> command command --"v"--> visual visual --"Esc"--> command command --":"--> lastline lastline --"Esc"--> command

指令速查表

移动光标

Shortcuts Description
h j k l ← ↓ ↑ →
[num] + h j k l 重复 [num] 次 ← ↓ ↑ →
[num] + Enter 向下移动 [num] 行至行首字符
Shortcuts Description
Ctrl + f 屏幕向下移动一页, 相当于 Page Down
Ctrl + b 屏幕向上移动一页, 相当于 Page Up
Ctrl + d 屏幕向下移动半页
Ctrl + u 屏幕向上移动半页
zz 屏幕移动至光标处
Shortcuts Description
w/W 跳转到下一个 word/WORD 的词首
e/E 跳转到当前或下一个 word/WORD 的词尾
b/B 跳转到当前或上一个 word/WORD 的词首
ge/gE 跳转到上一个 word/WORD 的词尾
[num] + w/e/b/ge/W/E/B/gE/ 执行 [num] 次 w/e/b/ge/W/E/B/gE

Vim 中 word 表示由数字、英文字母、下划线组成的字符串, 例如 hello_world, 或由其它非空白字符组成的字符串, 例如 {}[]()<>"'+-*/\%=&|!^$#@,;.:; WORD 表示由非空白字符组成的字符串. 空白字符即 space 或者 tab.
简单来说, WORD 由 space/tab 分隔, word 由 space/tab 以及 {}[]()<>"'+-*/\%=&|!^$#@,;.: 等非数字/字母/下划线的字符分隔.

Shortcuts Description
$ [END] 跳转到光标所在行尾
0 [HOME] 跳转到光标所在行首
^ 跳转到光标所在行首字符
Shortcuts Description
* 跳转到光标所在字符下一次重复出现的位置
# 跳转到光标所在字符上一次重复出现的位置
Shortcuts Description
G (Shift+g) 跳转到文件末行行首字符
[num] + G 跳转到文件全局第 [num] 行行首字符
gg 跳转到文件首行行首字符, 相当于 1G
Shortcuts Description
H 光标移动到屏幕上方行首
M 光标移动到屏幕中央行首
L 光标移动到屏幕下方行首
Shortcuts Description
f + [char] 行内搜索, 光标跳转到下一个 [char] 所在位置
F + [char] 行内搜索, 光标跳转到上一个 [char] 所在位置
t + [char] 行内搜索, 光标跳转到下一个 [char] 前一位置
T + [char] 行内搜索, 光标跳转到上一个 [char] 前一位置
[num] + f/F/t/T + [char] 行内搜索, 光标跳转到对应第 [num] 个 [char] 对应位置
Shortcuts Description
. 重复上一次命令

输入模式

Shortcuts Description
i 从光标前开始insert字符, 进入输入模式 (insert mode)
a 从光标后开始append字符, 进入输入模式 (insert mode)
A 从光标所在行未开始append字符, 进入输入模式 (insert mode)
o 在光标的下一行插入新行, 进入输入模式 (insert mode)
O 在光标的上一行插入新行, 进入输入模式 (insert mode)
Shortcuts Description
[num] + i + [content] + Esc 在光标前插入 [num] 次 [content]
[num] + a + [content] + Esc 在光标后插入 [num] 次 [content]
[num] + o + [content] + Esc 在光标下一行插入 [num] 行 [content]
[num] + O + [content] + Esc 在光标上一行插入 [num] 行 [content]

例如 10i-Esc 可以快速输入 ----------

Shortcuts Description
r + [char] 替换光标所在字符为 [char]
R 进入取代模式 (replace mode), Esc 键退出

搜索替换

Shortcuts Description
/[text] 向光标之后查找字符串 [text]
?[text] 向光标之前查找字符串 [text]
n 重复前一个查询
N 反向重复前一个查询
Shortcuts Description
:[num1],[num2]s/[word1]/[word2]/g 将第 [num1] 行与第 [num2] 行之间的 [word1] 全部替换为 [word2]
:1,$s/[word1]/[word2]/g
:%s/[word1]/[word2]/g
将第 1 行与最后一行之间 (全文) 的 [word1] 全部替换为 [word2]
:1,$s/[word1]/[word2]/gc
:%s/[word1]/[word2]/gc
全文查询 [word1] 并挨个替换为 [word2], 替换前需要确认

替换时提示 replace with [word2] (y/n/a/q/l/^E/^Y)?:

  • y Yes: 执行当前替换
  • n No: 不执行当前替换
  • a All: 执行所有替换
  • q Quit: 直接退出
  • l Last: 执行完当前替换后退出
  • ^E (Ctrl+E): 屏幕向上翻滚一行
  • ^Y (Ctrl+Y): 屏幕向下翻滚一行

删除与复制粘贴

Shortcuts Description
x 删除光标所在字符, 相当于 Delete
X 删除光标前一字符, 相当于 Backspace
[num] + x/X 连续执行 [num] 次 x/X
Shortcuts Description
d + [num] + j 删除光标所在行到往下第 [num] 行的所有行
d + [num] + k 删除光标所在行到往上第 [num] 行的所有行
d + [num] + h 删除光标左侧 [num] 个字符
d + [num] + l 删除光标右侧 [num] 个字符
Shortcuts Description
d + w 删除光标右侧第 1 个 word
d + b 删除光标左侧第 1 个 word
d + [num] + w/b 重复 [num] 次 d + w/b
Shortcuts Description
d + G 删除光标所在行到最后一行的所有行
d + gg
d + 1G
删除光标所在行到第一行的所有行
d + [num] + G 删除光标所在行到第 [num] 行的所有行
d + $ 删除光标到行尾的所有字符
d + 0 删除光标到行首的所有字符
Shortcuts Description
yy 复制光标所在的行
[num] + yy 复制光标所在的往下 [num] 行
y + G 复制光标所在行到最后一行的所有行
y + gg
y + 1G
复制光标所在行到第一行的所有行
y + [num] + G 复制光标所在行到第 [num] 行的所有行
y + $ 复制光标到行尾的所有字符
y + 0 复制光标到行首的所有字符
Shortcuts Description
p 将内容粘贴到光标所在行的下一行
P 将内容粘贴到光标所在行的上一行
Shortcuts Description
u undo
Ctrl + r recovery
Shortcuts Description
v 从当前光标所在位置进入可视模式 (visual mode), visual 模式下移动光标进行选中
v + d visual 模式下删除选中内容
v + y visual 模式下复制选中内容

保存退出

Shortcuts Description
:w save 保存
:q quit 退出
:wq save and quit 保存并退出
:q! quit without saving 强制退出

分屏模式

Shortcuts Description
:split (:sp)
Ctrl-w + s
将当前窗口水平分割成上下两个窗口
:split [filename] 水平分割窗口, 并在新窗口中显示指定文件
:vsplit (:vsp)
Ctrl-w + v
将当前窗口垂直分割成左右两个窗口
:split [filename] 垂直分割窗口, 并在新窗口中显示指定文件
Shortcuts Description
:wall 保存所有窗口修改过的内容
:qall 关闭所有窗口退出 vim
:wqall 保存所有窗口修改过的内容并退出vim
:wqall 保存并关闭所有窗口, 退出 vim
:only
Ctrl-w + o
只保留当前窗口, 关闭其它窗口
:close
Ctrl-w + c
关闭所有窗口
Shortcuts Description
Ctrl-w + w 切换到后一个窗口
Ctrl-w + p 切换到前一个窗口
Ctrl-w + t/b 切换到top/bottom窗口
Ctrl-w + h/j/k/l 切换到左/下/上/右窗口
Shortcuts Description
Ctrl-w + r 将当前窗口向后移动一个位置
Ctrl-w + R 将当前窗口向前移动一个位置
Ctrl-w + H/J/K/L 将当前窗口移动到最左/下/上/右侧
Shortcuts Description
Ctrl-w + > 增加当前窗口宽度
Ctrl-w + < 减少当前窗口宽度
Ctrl-w + + 增加当前窗口高度
Ctrl-w + - 减少当前窗口高度
Ctrl-w + _ 最大化当前窗口
Ctrl-w + = 平均所有窗口的大小
Ctrl-w + [num] + [x] 多次操作

注意上面的 Ctrl-w + [x] 是先按 Ctrl-w 放开后再按 [x]

其它

Shortcuts Description
Ctrl + s 关闭屏幕回显, 进入静默模式. 此时 vim 只接受输入而不输出.
Ctrl + q 退出静默模式

很多人误按了 Ctrl + s 后以为是 vim 卡死了, 其实只是进入了静默模式, 使用 Ctrl + q 退出静默模式.
静默模式下 vim 只是锁定了屏幕, 但还是正常接受输入, 有点像 linux 终端下输入密码一样. 等退出静默模式, 此前的输入都会正常显示在屏幕上.

自动补全

插件管理

插件管理工具 VimPlug
Minimalist Vim Plugin Manager | GitHub

插件市场 VimAwesome

配置文件