练习
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
配置文件