Vim 是一个高度可配置的文本编辑器,其构建方式是使创建和更改任何类型的文本都非常有效。
下面介绍Vim的使用:
命令行中直接输入vim
回车即可。
确保你使用的是英文输入法,然后按下面的顺序敲击键盘:
方式一:
ESC
:
q!
方式二:
ESC
:
wq
方式三:
ESC
ZZ
做的很好,你已经退出了vim
Vim 不同于其他编辑器的主要特点就是模式化。什么叫做模式化?可以理解为编辑器的一种状态,不同的状态下对用户的输入采取不同的响应方式。比较常见的模式有命令模式、输入模式、底线命令模式。
Vim默认打开的是命令模式,在这个模式下,按键不能直接将字符插入至文件,而是执行各种命令。
输入模式,顾名思义,在这个模式下,按键的字符是直接插入的。
底线命令模式,在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
命令模式是 Vim 默认模式,任何模式下通过
按键都可以切换到命令模式。 命令模式想要切换到输入模式,方法有很多。比较常用的按键如下:
案件 | 描述 |
---|---|
i |
在当前光标字符前插入 |
a |
在当前光标字符后插入 |
I |
在当前行首插入 |
A |
在当前行尾插入 |
o |
在下方开一新行,插入 |
O |
在上方开一新行,插入 |
命令模式切换到底线命令模式,按下:
即可
Vim 的各种命令是可以灵活组合变通的,命令是解决问题的手段。
移动命令
Vim 的各种移动命令主要是在命令模式下。最基本的移动命令是光标的上下左右移动,当然,你可以使用方向键,但是我想更多的 Vim 用户比较喜欢使用 h、j、k、l 按键。
按键 | 描述 |
---|---|
h |
光标左移 |
j |
光标下移 |
k |
光标上移 |
l |
光标右移 |
学会了这四个移动命令,你就可以自由地移动你的光标了,开始尽情地上下左右!
慢着,一个光标一个光标移动多慢啊,电脑上的其他编辑器可以鼠标定位, 还有那么多触控设备可以直接定位光标,用 Vim 的用户难道是慢吞吞的乌龟么?
还记得一开始说的灵活使用命令么?你可以输入“数字+移动命令”,一次性进行多次移动。
按键 | 描述 |
---|---|
n+h |
光标左移 n 个位置 ,n(number) 指数字 |
n+j |
光标下移 n 个位置 ,n(number) 指数字 |
n+k |
光标上移 n 个位置 ,n(number) 指数字 |
n+l |
光标右移 n 个位置 ,n(number) 指数字 |
带上了数字后,你发现光标健步如飞,仿佛穿上了跑鞋
开放思想,当你编辑一个小文件时,正好光标在一行中部,你想跳到行首,你可以99h
, 当你在文件中部,你可以99k
跳到第一行,同理其他移动命令来达成行尾、末行的效果。
但如果一个文件有几万行几万列,我们也这样输入一个无穷大的数字来跳转么?
放心,Vim 已经内置了这些该有的命令。
当然 Vim 还有其他常用的移动光标的按键:
按键 | 描述 |
---|---|
0 |
跳到行首,可以理解为无穷大的h |
^ |
跳到行首开始的第一个非空白字符 |
$ |
跳到行尾,可以理解为无穷大的l |
gg |
跳到首行,可以理解为无穷大的k |
G |
跳到末行,可以理解为无穷大的j |
w |
跳到下一个词首 |
b |
跳到上一个词首 |
e |
跳到下一个词尾 |
ge |
跳到上一个词尾 |
词间跳转中,“上一个词首”的精确断句为“上一个/词首”,即如果当前光标不在词首,则跳到本词词首; 如果当前光标已经在词首,才跳到上一个词的词首。 “下一个词尾”与此类似。
词间跳转也是支持“数字+移动命令”的,比如输入 5w
可以向后移动 5 个词。
编辑文档的过程,实际上就是不断操作特定文本的过程:删除、修改、复制,等等。 Vim 下的操作命令(Operator Commands)即特指一系列针对特定文本的操作。 常用的操作命令包括:
按键 | 描述 |
---|---|
c |
删除,并进入插入模式 |
d |
删除 |
y |
复制 |
gu |
变为小写字母 |
gU |
变为大写字母 |
g~ |
颠倒字母的大小写 |
> |
右缩进 |
< |
左缩进 |
= |
自动缩进 |
你可能会问,那怎么指定这些操作命令作用的文本对象呢?
记住我们刚开始所说的,Vim 的各种命令都是可以灵活组合变通的! 操作特定文本,Vim 的解决方案是"操作命令+移动命令", 即操作命令的对象由移动命令来指定,举例:
dl
:向右删除一个字符(删除当下字符,右侧字符不会被删);dh
:向左删除一个字符(删除左侧字符,当下字符不会被删);d3l
:向右删除 3 个字符(3dl
亦有相同效果,下同);d3w
:删除文本至右侧第三个词首之前;de
:删除当下字符至下一个词尾;y2w
:复制当下位置至右侧第二个词首之间的文本;gUe
:将当下字符至下一个词尾变成大写;其他请以此类推。你会发现,由于操作命令和移动命令的多种多样,能够组合出来的文本操作也是多种多样。 再结合数字,可以实现的功能就更强大了。
需要注意的是,一个操作命令只会对紧随其后的一个移动命令有效。所以 dll
的作用是 “向右删除一个字符后再右移一位”,而不是“向右删除两个字符”。 如果要实现“向右删除两个字符”,应使用 d2l
。 2l
虽然相当于移动两次,当应视为单个移动命令(因为单独一个数字不构成一个完整命令)。
针对一整行的操作是很常见的。 比如,如果要删除一整行,应该如何操作呢? 根据上面的讲解,你可能会回答:先用 0
回到行首,再用 d$
删至行尾。 这未免显得繁琐了些。而且,这只是删除了行内字符,并没有将整行删掉。
Vim 提供了“操作命令二连击”的方式来实现真正的行操作:
按键 | 描述 |
---|---|
cc |
删除整行,并进入 insert (插入)模式 |
dd |
删除整行 |
yy |
复制整行 |
guu /gugu |
整行变为小写字母 |
gUU /gUgU |
整行变为大写字母 |
g~~ /g~g~ |
颠倒整行字母的大小写 |
>> |
行右缩进 |
<< |
行左缩进 |
== |
行自动缩进 |
命令模式下的“一击即中”的常用命令包括:
按键 | 描述 |
---|---|
p |
粘贴于当前光标之后 |
P |
粘贴于当前光标之前 |
x |
删除当前字符,相当于 dl |
s |
删除当前字符并插入,相当于 cl |
C |
删除至行尾并插入,相当于 c$ |
D |
删除至行尾 |
S |
从当前行首个非空字符删除至行尾并插入,相当于 ^C |
u |
撤销上一次修改 |
|
重做上一次修改,u 的逆过程 |
. |
在当前光标处重复上一次修改 |
一个小思考题:d2w
和 dw.
都可以实现相同的效果,它们本质上一样吗? 如果它们之后跟着一个 u
或 .
,效果有什么不同? 考虑一下,如果你要删除接连几个词,大概会使用怎样的键入组合。
对了,重做命令是
而非 r
,因为 r
被另一个常用命令占用了,即替代命令:
按键 | 描述 |
---|---|
r |
替代字符,将当前字符替代为紧跟着输入的字符 |
R |
进入替代模式,将当前及之后的字符都替代为紧跟着输入的字符串,直到按 返回命令模式 |
本文部分内容,转载自https://github.com/vim-china/hello-vim/blob/master/quick-start-guide.md#%E6%93%8D%E4%BD%9C%E5%91%BD%E4%BB%A4