引言:
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
一、vim基础
1、插入文本
Vim 是一个多模式的编辑器。就是说,在不同模式下,编辑器的响应是不同的。在 普通模式 下,你敲入的字符只是命令;而在 插入模式 ,你敲入的字符就成为插入的文本了。当你刚刚进入Vim,它处在普通模式。通过敲入 “
i
“ 命令 ( i 是插入 ( Insert ) 的 缩写) 可以启动插入模式,这样你就可以输入文字了,这些文字将被插入到文件中。按<Esc>
键退出插入模式回到普通模式。
2、移动光标
在普通模式下,可以使用如下命令移动光标
按键 | 方向 |
---|---|
h | 左 |
j | 下 |
k | 上 |
l | 右 |
3、删除字符
- 删除一个字符
把光标移动到它上面,然后输入
x
。(其实这是对以前的打字机的一种回归, 那时通过在字符上输 xxxx 来删除它) - 删除一整行
使用
dd
命令,删除光标所在当前行,并将后一行移上来填充掉留下的空行。 - 删除一个换行符
在Vim中可以将两行连接起来,这意味着删除两行间的换行符。
J
命令用于完成这个功能。
4、撤销与重做
- 撤销
假设你删得太多了。当然,你可以重新输入需要的内容。不过,还有一个更简单的选择。
u
命令撤销上一个编辑操作。 - 重做
如果你撤销得太多,你可以输入
Ctrl-R(redo)
回退到前一个命令执行前。换句换说,它撤销一个撤销 - 行撤销
特殊的撤销命令。
U
行撤销命令撤销所有在最近编辑在行上的操作。输入该命令两次,取消前一个U
。
A very intelligent turtle
xxxx 删除 very
A intelligent turtle
xxxxxx 删除turtle
A intelligent
用 “U” 恢复行
A very intelligent turtle
用 “u” 撤销 “U”
A intelligent
U
命令本身就是⼀个改变操作, u
命令撤销该操作, CTRL-R 命令重做该操作。有点乱。但不用担心,用 u
和 CTRL-R
命令你可以切换到任何你编辑过的状态。
5、其他编辑命令
添加
i
命令在光标所在字符前面插入字符,并把vim切换到插入模式。一般情况下,这就够用了,但如果你刚好想在行尾加东西要怎么办呢? 这可以通过a
(append,附加)命令实现。总结一下:i
命令会进入插入模式,并在当前字符前进行插入。a
命令也会进入插入模式,但是是在当前字符后进行插入。
开始一个新行
o
命令在光标下方建立一个新行,并把Vim切换到插入模式。然后你可以在这个新行内输入文本。同时,大写的O
命令可在光标的上方建立一个新行,并把Vim切换到插入模式。
注意:
在使用i
、a
、o
、O
命令进入插入模式后,进行了一些插入操作后,退出插入模式回到普通模式,可使用u
命令撤销此次插入操作,回到未插入前的状态。
指定计数
假定你想向上移动9行,你可以使用
kkkkkkkkk
或者你可以直接输入9k
。实际上,你可以在很多命令前加上一个数字。例如你可以通过输入a!!!<Esc>
在当前光标所在位置后面增加三个感叹号。另一个方法是使用命令3a!<Esc>
。计数3要求把后面的命令执行三次。同理3x
删除三个字符。计数总是放在要被处理多次的命令的前面。
6、退出
保存文件并退出
使用大写的
ZZ
命令可以退出。这个命令保存当前文件并退出。与其他编辑器不一样,Vim不会自动建立一个备份文件。如果你输入ZZ
,你的修改立即生效并且不能恢复。
放弃修改并退出
有时你会发现做了一系列的修改还不如不修改。Vim有放弃修改并退出的命令,那就是
:q!
,别忘了按回车使你的命令生效。该命令由三部分组成:
冒号(:)
,它使Vim进入命令模式;q命令
,它告诉Vim退出;而感叹号
是强制命令修饰符。这里强制修饰符是必要的,它强制性的要求Vim放弃修改并退出。如果你只是输入:q
,Vim会显示一个错误信息并拒绝退出。如果你放弃修改后还想重新编辑,用
:e!
命令可以重新装载原来的文件。
二、移动
1、词移动
w
命令将光标移动到其右边的第一个单词的词首。可以在命令前加上数字前缀表示把这个命令重复多次。例如,3w
表示将光标移动到其右边第3个单词的词首。e
命令将光标移动到其右边第一个单词的词尾。注意:若当前光标已在一个单词的词尾,则移动到右边第一个单词的词尾;若当前光标不在当前单词的词尾,则移动到当前单词的词尾。b
命令将光标移动到其左边的第一个单词的词首。若当前光标已在一个单词的词首,则移动到左边第一个单词的词首;若当前光标不在当前单词的词首,则移动到当前单词的词首。ge
命令将光标移动到其左边第一个单词的词尾。
2、移动到行首或行尾
$
命令把光标移动到当前行行尾。如果你的键盘上有End
键,也可以完成相同的功能。^
命令把光标移动到当前行的第一个非空字符。0
命令把光标移动到当前行的第一个字符。Home
键也可以完成相同的功能1$
移动到当前行行尾。3$
移动到其下第2行行尾。如此类推。
3、移动到一个指定的字符
- 单字符查找命令是最有效的移动命令之一。
fx
命令向右查找本行中的字符x,并移动光标到x处。3fx
向右查找本行中的第3个字符x,并移动光标到此处。F
命令由于向左查找。t
命令与f
命令相似,但它只是把光标移动到目标字符的前一个字符上。t表示To(到达)T
命令与t
方向相反- 以上四个命令可以通过
;
命令重复,,
命令用于反向重复。无论用以上那个命令,光标都不会移除当前行,只在当前行查找并移动。
4、括号匹配
%
命令能匹配一对括号()、[]、{}。如果光标在(
上,则它移动到对应的)
上。反之,如果光标在)
上,则它移动到对应的(
上。
5、移动到指定的行
G
命令加上一个计数前缀,这个命令可以将光标制动到指定的行。如果没有指定计数前缀,那么G
命令把光标移动到文件末。- 移动到文件首的命令是
gg
。当然1G
也能完成这个功能。- 另一个定位行的方法是使用带计数前缀的
%
命令。例如50%
移动到文件的中间,而90%
移动到差不多结尾的位置。- 提示:
H
表示Home(头)、High(高),M
表示Middle(中),而L
表示Last(尾)、Low(低)。
6、确定当前位置
使用
CTRL-G
命令,你会或得如下消息"file.txt line 233 of 650 --35%-- col 45-52"
这里显示了你正在编辑的文件的名称,你所处的当前行的行号,全文的总行数,光标以前的行占全文的百分比,和你所处的列的列号。有时你会看到一个分开的两个列号。例如:“col 2-9”,表示光标处于第二个字符上,但是由于使用了制表符,在屏幕上的位置是9。位置
number
选项。这会在每行的前面加上一个行号- 开启每行的行号显示
:set number
- 关闭每行的行号显示
:set nonumber
由于
number
是一个布尔型类型的选项,在它前面加上no
表示关闭它。布尔选项只会有两个值,on
或者off
。
- 开启每行的行号显示
位置
ruler
选项。这会在Vim窗口的右下角显示当前光标的位置:set ruler
7、滚屏
CTRL-U
和CTRL-D
命令分别是向上滚动和向下滚动半个屏幕。CTRL-E
和CTRL-Y
命令分别是向上滚动和向下滚动一行。CTRL-F
和CTRL-B
命令分别是向前(forward)滚动和向后(backward)滚动一个屏幕。其实就是向下滚动和向上滚动,因为向下才是我们正常的阅读顺序,称为向前,相反则称为向后。- 小写的
zz
命令,将当前的文字滚动到使得当前的光标所在行处于屏幕中央。上面我们知道,当使用j
向下移动时,你的光标会处于屏幕的底部,其实有时你可能希望光标所在行处于屏幕的中间,这是就可以使用zz
命令。注意:大写的ZZ
命令是保存并退出。 zt
命令或zb
命令,分别将当前的文字滚动到使得当前的光标所在行处于屏幕的顶部或底部。- 注意:要使光标上下总保留有几行(n)处于视窗中用作上下文,可以使用
:set scrolloff=n
选项,默认其实保留了5行。
8、简单查找
查找命令是
/String
。例如,要查找单词”include”,使用如下命令/include
。输入好要查找的字符串后,使用Enter
开始执行这个查找命令。- 当输入“/”时,光标会移动到Vim窗口的最后一行,这与
冒号命令
一样,在那里可以输入要查找的字符串。可以使用退格键(退格键头或<BS>)进行修改,如果需要,还可以使用<Left>和<Right>键。/
不支持计数前缀。 - 要查找下一个匹配可以使用
n
命令。比如用/include
查找时,输入n
数次,你会移动到其后每一个找到的“include”上。如果你知道你想要的是第几个,那么可以在n
命令前增加计数前缀。
- 当输入“/”时,光标会移动到Vim窗口的最后一行,这与
忽略大小写
通常,你必须区分大小写地输入你要查找的内容。如果你不在乎大小写,可以设置“ignorecase”选项:
- 不区分大小写查找字符串:
:set ignorecase
- 恢复到区分大小查找字符串的模式:
:set noignorecase
- 不区分大小写查找字符串:
历史记录
假设你执行了一下三个查找命令:
/one
、/two
、/three
现在我们输入
/
启动一次查找,但是先不按下回车键。现在按<Up>键,Vim将会把“/three”放到你的命令行上。这时候回车就会从当前位置查找”three”。但如果不回车,继续按<Up>键,Vim会把“/two”放到命令行上,而下一次会变成“/one”。当然也可以使用<Down>键在历史记录中反向查找。如果你知道前面查找过的字符串以什么字母开头,而且你想再次使用这个字符串查找的话。可以在使用<Up>按键前输入开头的部分字母。比如在前面的例子中输入 “/o<Up>”,就可以直接显示”/one”这条查找历史记录。
在文本中查找一个单词
假设你在文本中看到一个单词“TheLongFunctionName”,而你想找到下一个相同的单词。你可以输入”/TheLongFunctionName”,但只要输入一段很长的字符串,如果输入错了,Vim是不可能找到你想要的单词的。有一个简单的方法是:把光标移动到那个单词下面使用
*
命令。Vim会取得当前光标上的单词,并把它作为查找的字符串。而#
命令反向完成相同的功能。*
命令和#
命令都可以加上计数前缀。(*
、#
是匹配整个单词,若要匹配词首和词尾,得使用g*
和g#
)。查找整个单词
- 如果你输入
/the
,你可以找到“there”。要找到以“the”结尾的单词,可以用/the\>
。其中”>“是一个特殊的记号,表示只匹配单词末尾。类似地,“<”只匹配单词的开头。若想完整地匹配一个单词“the”,需要使用/\<the\>
。这样,就不会错误的匹配上“there”或者“soothe”。 - 其实
*
命令和#
命令也使用了“词首”和“词尾”标记来匹配整个单词。(若想使用部分匹配,则使用g*
和g#
命令)
- 如果你输入
高亮匹配
当你编辑一段代码的时候,你看见一个变量叫”nr”。你想查一下它在哪里被用到了,你可以把光标移动到”nr”下面,使用
*
命令,然后用n
命令一个一个去遍历。还有一种更好的方法是使用hlsearch
选项。:set hlsearch
,开启该选项后,现在如果你查找“nr”,Vim会高亮显示所有匹配上的地方。这是一个很好的确定变量在哪被使用,而不需要输入更多命令的方法。关掉这个功能,请使用:set nohlsearch
。如果这样做,下一次查找需要高亮显示又得重新:set hlsearch
。如果你只是想去掉当前的高亮显示,而保留下一次查找时继续高亮显示的功能,你只需要使用:nohlsearch
。这样的话,不会复位”hlsearch”选项,它只是关闭了当前查找词的高亮显示。当你执行下一次查找的时候,其高亮功能依然能够被正常使用。调节查找方式
有一些选项能够改变查找命令的工作方式,其中有几个最基本的:
:set incsearch
这个命令使Vim在你输入字符串的过程中就显示匹配点。用这个功能可以检查是否会被找到正确的匹配,这时按下<Enter>就可以真正地跳转到匹配的地方。
:set nowrapscan
这个设置使得找到文件末尾后停止查找,或者当你往回查找的时候遇到文件开头停止查找。默认情况下,
wrapscan
的状态是on
。所以在找到文件尾的时候就会自动折返到文件头。
9、简单的查找模式
Vim用正则表达式来定义要查找的对象。正则表达式是一种非常强大和紧凑的定义查找模式的方法。但是非常不幸,这种强大的功能是有代价的,因为使用它需要掌握一些技巧。
- 行尾与行首