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
则是文件。- 剪贴板中
:%.
也是可以用的(意义很显然)。