引言
一般情况下, vs code 是我的首选文本编辑器,主要是因为上手容易,界面友好,对各种编程语言支持比较好,配置也简单。可是在有些情况下,vim 是唯一的选择,例如 ssh 登录到远程计算机,没有图形界面,只能用命令行工具,这时 vs code 和 ubuntu 自带的 gedit 都不能用,只能用 vim;再例如不能用鼠标的时候,纯键盘操作下 vim 是比较高效的。
vim 有很多命令和快捷键,当长期使用 vs code,在迫不得已的情况下转到 vim,总是要花一些时间重温那些按键对应的命令。本文收集了一些常用的 vim 命令,供自己、也供读者查阅。
如果要系统的学习 vim,还是推荐 vimtutor 这个交互式的学习环境。如果已经安装了 vim,那么在命令行中输入 vimtutor
即可进入。
另外,这本免费的电子书也不错 https://www.barbarianmeetscoding.com/boost-your-coding-fu-with-vscode-and-vim/dedication。
模式简介
vim 主要有3 种模式:normal, insert 和 visual mode。
- normal mode: 控制模式,这也是打开 vim 之后的默认模式。在这种模式下,键盘按键会有一些特殊功能,包括控制光标移动,复制粘贴,删除,搜索替换等;
- insert mode: 就是普通的书写模式,在这种模式下,按键就对应了文本的输入;
- visual mode: 在这种模式可以大块的选取文本,然后进行特定操作。
insert mode
在默认的控制模式中,按如下按键可以进入 insert 模式:
- 按键
i
在当前光标位置前进入 insert 模式,即随后输入的文字是在当前光标位置之前 -
I
(大写的 i,即 shift + i ): 在当前行的开头进入 insert 模式 -
a
在当前光标位置后进入 insert 模式 -
A
在当前行的末尾进入 insert 模式 -
o
在下一行进入 insert -
O
在上一行进入 insert
insert mode 可说的不多,进入之后书写就好了。vim 的核心和难点在 normal mode,这里包含了文本编辑过程中的大部分控制操作。
normal mode (控制模式)
在 insert mode 中按 ESC 键即可进入控制模式。
在控制模式中最常用的就是光标的移动
-
h
左 -
j
下 -
k
上 -
l
右
还有基于 word 和 WORD 的移动,这里一个 word 就是普通意义上的 word,以标点符号和空格分割, 而 WORD 则是一个连续的字符串,包括文字和紧挨着的符号,以空格分割。
-
w
移动光标下一个 word 开头,遇到符号就认为新的 word -
W
下一个 WORD 开头,遇到空格才认为是新 WORD -
e
下一个 word 结尾,如果当前位置是在 word 中部,则就是当前 word 的结尾 -
E
下一个 WORD 结尾,遇到空格才认为是新 WORD -
b
本 word 的开头,如果已经在开头,则到前一个 word 的开头
number + 上述移动操作(number 为某一数字),就相当于按了 number 次那个键。也可以输入 number 次某个字符串,例如 3igo ESC
,就输入了 3 次 go
0
移动光标到本行头部第一个字符$
到本行末尾最后一个字符gg
到整篇文档的开头G
到整篇文档的结尾number + G
到文章的第 number 行ctrl + b
上翻页,backctrl + f
下翻页,forward:w
保存:q
退出:q!
强制退出,不保存f + <字符>
向后查找某个字符F + <字符>
向前查找某个字符number + 上边的命令
向前/向后查找第 number 个字符/
search forward?
search backward
上述两个查找命令可以通过n
和N
不断地进行下一次查找和反方向查找在程序中,可以用
%
查找配对的括号*
当前光标所在 word 下一次出现的位置#
当前光标所在 word 上一次出现的位置r
替换一个字符R
替换当前位置开始的多个字符c + 前边的光标移动命令
删除从当前位置到给定位置的字符,并进入 insert 模式C
删除从当前位置到行尾的字符,并进入 insert 模式x
等价于普通的 delete —— 删除当前位置字符-
X
等价于普通的 backspace —— 删除前一字符相比于
x
, 按键d
的功能更丰富,可以指定删除的范围 d + 光标移动命令
删除从当前位置到给定位置的字符dw
删除从当前位置到本 word 结束,光标放在下一个 word 开头de
与dw
类似,删除之后放在本 word 的结尾
上边这两个删除命令,比较容易记的方式是,w
或e
原本要跳到哪里,删除之后光标就会落到哪里。例如:
原本w
是到下一个 word 开头,所以删除的时候,就一直删到下一个 word 开头,光标停在那里;
原本e
是到下一个结尾,由于整个 word 都删了,要往后挪一个,到了下一个 word 前边的一个位置。D
删除从当前位置到行尾的字符
d
与c
的区别似乎仅仅是删除之后是否进入 insert 模式y + 光标移动命令
复制从当前位置到给定位置的字符Y
==yy
复制整行p
粘贴到当前位置后边,如果是整行内容,则粘贴到下一行-
P
粘贴到当前位置的前边,如果是整行内容,则张贴到上一行
vim 有自己独立的剪贴板,而不是采用系统的剪贴板。因此在 vim 中复制的内容不能粘贴到 vim 之外的应用程序中,同样的,在 vim 之外复制的内容也不能粘贴到 vim 中。
可以通过如下设置,让 vim 使用系统的剪贴板:- 首先确认当前安装的 vim 是否带有 clipboard 扩展功能:在 vim 中输入
:echo has('clipboard')
,如果返回 1 则说明可以用 clipboard,跳到第 3 步;如果返回 0,则需要安装 clipboard。 - 一般 ubuntu 自带的 vim 是最简安装,不带 clipboard,可以安装功能更全的 vim-gtk:
sudo apt install vim-gtk
。安装之后再次确认具有 clipboard 功能。 - 当要使用系统剪贴板时,在原本的复制/粘贴命令之前添加
"+
即可。例如复制某一行到系统剪贴板"+yy
;从系统剪贴板中粘贴内容"+p
- 首先确认当前安装的 vim 是否带有 clipboard 扩展功能:在 vim 中输入
:1,4s/word1/word2/g
: 1,4 是指明搜索的行号,从第1行到第4行,/g 是指明每行如果有多个搜索结果,则都要替换掉:%s/word1/word2/g
: % 是指明全文搜索~
改变当前位置字母的大小写u
undoctrl + r
redo.
重复之前的操作
visual mode
除了前边的 normal mode 和 insert mode,还有一个 visual mode,允许选取一定范围的文字,然后进行操作
-
v
进入 visual mode
选取之后可以进行删除,复制等操作,命令与 normal mode 中相同。