Vim 简明使用指北
Practise more.
编辑模式ψ(`∇´)ψ
Normal Modeψ(`∇´)ψ
一般 Vim 的命令都是在 Normal mode 下面完成的。
所有模式按 ESC 都可以进入 Normal mode。
Normal mode 不可以进行输入,键盘上所有的字母基本都是个命令。
也可以用 : 进入 Command mode。
下面的命令会标记 [N] 表示该快捷键在 Normal mode 下可用。
Command Modeψ(`∇´)ψ
可以进行一些文件操作,属性的设置。
还可以利用 :!<Command> 在一个外部终端里面执行 <Command> 命令。
比如 !g++ % -o %< -Wall -std=c++17 -O2 -g 就可以编译当前的文件(cpp)。
s
Insert Modeψ(`∇´)ψ
正常的输入模式,Vim Easy 只有这个模式。
Visual Modeψ(`∇´)ψ
选择模式,有三种。
第一种是在 Normal mode 下按 v 进入的可视模式,这个就是类似其他 Editor 的选择功能。
第二种是按 V 也就是 S-v 进入的行可视模式,这个模式会自动选择光标所在行,并且会复制换行符。
第三种是按 C-v 进入的块可视模式,这个模式会选中一个块(矩形),比如下面这个实例:
1 2 | |
我们想把它们前面的 std:: 全部删掉,就可以用块可视模式选中然后删除(当然你也可以一个个查找然后repalce掉它们)。
Replace Modeψ(`∇´)ψ
按 R 进入,顾名思义是用来批量 replace 的。
编辑器快捷键ψ(`∇´)ψ
移动类ψ(`∇´)ψ
[N/V] h j k l: 上下左右(可以在前面加上数字表示重复多少次,比如 \(3l\) 就是往左移动三个字符(Vim 的所有命令基本都支持这个))[N/V] gg:跳到文件的开头。[N/V] G:跳到文件的结尾[N/V] <Number>G / :<Number>: 跳到第<Number>行[N/V] <Number>|:把光标移动到第<Number>列上[N/V] Backspace Space: 移动到上一个字符/下一个字符[N/V] + Enter:移动到下一行第一个非空白字符[N/V] -:移动到上一行第一个非空白字符。[N] f<Char>:移动到同一行的下一个<Char>字符处。[N] F<Char>:移动到同一行的上一个<Char>字符处。[N/V] 0/^/$:移动到硬/软行头/尾。(软行首不包括缩进,即指第一个可见字符。)[N/V] H: 把光标移到屏幕最顶端一行。[N/V] M: 把光标移到屏幕中间一行。[N/V] L: 把光标移到屏幕最底端一行。[N/V] b/B:跳到上一个单词开头(如果在某个单词里,会跳到这个单词开头)[N/V] ge/E:跳到上一个单词的结尾。[N/V] w/W:跳到下一个单词开头[N/V] e/E:跳到下一个单词结尾- 这四个键的小写是只要有运算符或者空格就分割,大写只以空格为标准划分。
[N/V] %:跳转到匹配的括号的开头。[N/V] ():跳转到这一句的开头或者结尾(似乎只对英文句号起作用)[N/V] {}:跳转到某一段的开头或者结尾(以空格隔开)
纯编辑类ψ(`∇´)ψ
[N] i:进入 Insert Mode(在当前光标块的左侧插入)[N] a:进入 Insert Mode(在当前光标块的右侧插入)[N] O:在当前行上方新建一行,并进入插入模式,光标处于行首(除非有 auto indent)[N] o:在当前行下方新建一行,并进入插入模式,光标处于行首(除非有 auto indent)[N] A:将光标移动至本行末尾,同时进入插入模式。[N] I:将光标移动至本行首,同时进入插入模式。[N] S:删除本行的所有文字,同时进入插入模式。[N] u/C-r:Undo 和 Redo。[N] ~:反转光标块字符的大小写。[V] <>:减少或者增加选中块的缩进[N] << >>:当前行。[N] .:在光标位置输入上一次进入 INSERT 模式时输入的字符串(太好用了!)
复制粘贴类ψ(`∇´)ψ
[V] y:复制在可视模式下选中的文本(可以加组合键来复制一个单词/句子之类的,不过我不咋用就不写了)。[N/V] yy复制当前行。[N] ggVG:这是一个组合键,等价于全文复制(会多复制一个换行符)。[N/V] d:剪切(需要类似d<Number><Move>的组合键,比如d8l就是删除光标块右边8个字符(包括光标块本身(光标实际上是在光标块的左边)),d8h则是左边(不含光标块),dG是从当前行一直删到文件结尾)。[N/V] dd:剪切一整行。[N/V] x<Number>:删除光标右边<Number>个字符(光标是在光标块的左边,所以如果你直接按x会删除光标块选中的字符)。[N/V] X<Number>:左边。[C] :<i>,<j> dd:剪切第 \(i\) 行到第 \(j\) 行的所有文本。[N] p/P:在光标的后/前位置粘贴(注意是否复制了换行符,可以使用reg查看对应寄存器里的东西)[N/V] "<char>y:复制到<char>寄存器当中(0 ~ 9的数字,a ~ z/A ~ Z的字母,+-*),粘贴同理。
*(win)/+(linux) 是当前缓冲区,系统剪贴板也会到这里面来。
一个 tips:如果直接 <S-v>$d 是会带上换行符的,不想要可以 $ 之后 h。
文件操作类ψ(`∇´)ψ
:file filename:命名当前文件为filename。:e file:关闭当前的文件,打开文件file(可以是目录,可以指定文件位置):e#:回到上一个文件:e:重新加载当前文件。:w:写入当前文件。:q:退出。:wq:保存并退出。:saveas filename:另存为。
屏幕操作类ψ(`∇´)ψ
[N]C-f: 下翻一屏(forward)。[N]C-b: 上翻一屏(back)。[N]C-d: 下翻半屏(down)。[N]C-u: 上翻半屏(up)。[N]C-e: 向下滚动一行。[N]C-y: 向上滚动一行。[N]zz: 将当前行移动到屏幕中央。[N]zt: 将当前行移动到屏幕顶端(top)。[N]zb: 将当前行移动到屏幕底端(buttom)。[N]C-w H/J/K/L:将当前窗口移动到屏幕的左/下/上/右处。[N]C-w h/j/k/l:切换到左/下/上/右的窗口。[N]C-w C-w:按顺序切换窗口。[N]C-w -+<>:更改当前窗口大小[N]C-w =:平均分配大小。:split:分割当前的窗口为两个窗口(水平分割),可以用:set scb打开同步滚动。:split <filename>:水平分割并打开新的文件。:new:水平打开一个新窗口并编辑一个新的文件。:vsplit/:vnew:竖直分割。:only:只保留当前窗口。:close:关闭当前窗口。
多文件编辑类ψ(`∇´)ψ
vim a.txt b.cpp c.json 可以同时打开多个文件。
:n可以编辑下一个文件,:N可以编辑上一个文件。:ls或者:args可以显示文件列表。
多标签编辑类ψ(`∇´)ψ
注意这个和多文件不一样,一个标签页里可以有多个窗口,多文件不是标签页,只是同时打开了多个文件。
也就是说标签页类似 Workspace。
vim -p files:打开多个文件,每个文件占用一个标签页。:tabe/:tabnew:如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。C-w gf:在新的标签页里打开光标下路径指定的文件。:tabn:切换到下一个标签,C-PageDown也可以。:tabp/tabN: 切换到上一个标签,C-PageUp也可以。<n> gt: 切换到下一个标签。如果前面加了 n,就切换到第 n 个标签。第一个标签的序号是 1。gT:切换到上一个。:tab split: 将当前缓冲区的内容在新页签中打开。:tabc[lose]: 关闭当前的标签页。:tabo[nly]: 关闭其它的标签页。:tabs: 列出所有的标签页和它们包含的窗口。:tabm[ove] <N>: 将当前标签页移动到第 \(N\) 个标签页之后。
查找/替换类ψ(`∇´)ψ
:s/old/new:用new替换当前行第一个old。:s/old/new/g:用new替换当前行所有的old。:n1,n2s/old/new/g:用new替换当前文件n1行到n2行所有的old,当然你也可以直接先选中。:%s/old/new/g:用new替换文件中所有的old。:%s/^/xxx/g:在每一行的行首插入xxx,^表示行首。:%s/$/xxx/g:在每一行的行尾插入xxx,$表示行尾。
Tips: 如果所有替换命令末尾加上了 c,则每个替换都将需要用户确认。 如 :%s/old/new/gc,加上 i 则忽略大小写 (ignore)。
插件扩展快捷键类ψ(`∇´)ψ
[N] \ci \cu: 设置注释或者取消注释(Need Nerd-Commenter)[N] zR:展开所有 Folding(Markdown)[N/V] C-N:选中词汇并进入 Visual-Multi,或者选中下一个匹配(Need Visual-Multi)[M] n/N:获取下一个/上一个事件。[M] q:跳过当前事件。C-Down/Up:创建垂直光标。
:MarkdownPreview:预览 Markdown。:MarkdownPreviewStop:停止预览。
补全ψ(`∇´)ψ
[I]C-x C-f:补全文件名
其它的不常用懒得写了。
其他技巧ψ(`∇´)ψ
:pwd:显示当前工作目录。:reg:显示 register 状态。- 在任意命令后加上
!表示强制执行,例如:q!,:close!。 - 在任意命令前加上
!表示在终端中执行命令。 :terminal可以在当前目录打开一个新的终端(Windows下默认 cmd)。:TOhtml可以把当前文档转化为 HTML。- 大部分命令前加上数字表示重复多少次。
cd可以更改工作目录。- 在 Command 模式下使用 Tab 会有补全(区分大小写)
/xxx可以用来检索索xxx,接上<CR>可以跳到下一个匹配的位置(在光标下方搜索,如果是要往上就用?),我喜欢在#define int long long之后/int main<CR>/xk。*/#则可以直接检索当前单词,免得你手动输入太麻烦。<C-o>可以打开上一个 Tag?我不清楚 Tag 是什么,不过我知道这个可以快速跳转到之前编辑的位置(不管是否打开文件)。- Vim 的大部分命令都是单词的缩写,比如 yank, paste, quit, write.
- 在内置终端里使用 vim command 时候需要加上
C-w来转义。 gx可以打开光标下的 url(vim 9 可以,其他没试过)gf则是文件。- 剪贴板中
:%.也是可以用的(意义很显然)。