练习
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 |
:onlyCtrl-w + o |
只保留当前窗口, 关闭其它窗口 |
:closeCtrl-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
配置文件