原文:练上一年再来总结的vim使用技巧html
转眼上vim
的“贼船”
有一年多了。从PHP
到C
,都在用。想要真正用vim
于平常的编码工做,必然须要一些插件的支持。不过本文并不打算总结插件,笔者认为vim的两个精髓:组合
和重复
跟插件也没有什么关系。linux
在大多数编辑器中,相信你们都喜欢敲几个单词就“保存(ctrl+s)”一下。而在vim中,保存是:w
,并且须要在命令模式下进行。所以,每每要按Esc:w
多达三个键才能保存。不少初学者十分诟病这个设计。事实上,常用Esc
切换到命令模式才是vimer须要练就的第一个重要的反射行为。能够绝不夸张的说,只要你不在输入文字,就应该切换在命令模式下,命令模式应该是常态!程序员
这是vim中的光标上下左右的移动,刚开始使用vim的同窗可能以为这并无什么卵用,我用键盘上的上下左右就能够了!咱们知道,vim的大部分快捷键须要在命令模式下完成,并且HJKL也是须要在命令模式下才生效的,若是你常常在插入模式下工做,固然不会去用HJKL。然而,当你真正开始更多的使用命令模式的时候,你会懒到不想把右手挪到“上下左右”那儿去,这个时候HJKL成为无需思考的反射行为。HJKL的好处就是减小了右手的位移距离。毕竟右手还有不少“事情”要作。编程
咱们来举个例子,假设以下文本vim
one two three four five six
我但愿改为编辑器
"one","two","four","five","six"
首先光标定位在该行的行首,可以使用^
。而后键入f␣
(␣表示空格),此时光标定位在one和two之间的空格处,而后键入c␣","
(修改空格,进入插入模式,而后增长","
):ide
one","two three four five six
接着按;.
,光标将先查找下一个空格,即重复f␣
,这个空格位于two和three之间,而后.
能够重复上一次的修改操做,即c␣","
:学习
one","two","three four five six
接着重复按若干次;.
便可完成全部中间字符的修改:编码
one","two","three","four","five","six
最后应用I
和A
,添加开始和最后的双引号就能够了。spa
经过这个例子,vimer必需要领会的一个精髓是:让你的操做可重复!!
。若是上面的例子,咱们用l
或者->
来定位空格的话,因为one、two、three这些单词的长度是不肯定的,咱们没法事先知道须要按多少次l
,因此l
定位是不可重复的。而经过f
能够重复咱们的查找操做,从而精确的定位到空格。另外,若是咱们经过xi","
代替c␣","
也是不可重复的,由于xi","
表示先删除空格,而后进入插入模式后键入","
,这样就是两次分开的修改操做,而最近的操做变成了“进入插入模式后键入","
”,若是经过.
重复这个操做,是没法删除空格的。
这须要大量的实践和练习,才能改掉鼠标流的思惟定式。通常来讲,尽可能多用f
、c
、r
是不错的选择。另外,尽量的利用A
、a
、o
、O
来进入插入模式,而不是每次经过i
进入插入模式。
光标移动效率是vim程序员达到甚至超过鼠标流程序员的关键技能。vim中的移动光标的方式有不少,我来举几个我实际使用过程当中应用比较频繁的技巧:
set relativenumber(显示相对行号)
。我无心间发现的一个十分实用的技巧,比set number
显示行号更好用。经过这个设置,行号的显示会根据当前的光标的相对位置显示成偏移数,并动态变化。这个好处是,能够利用数字+j
数字+k
来进行多行跳转,由于是编译行数,因此数字不会太大。不然就算要向下移动10行,咱们可能也须要用138gg
。
w
、e
、b
:按照单词进行先后光标跳转,也能够组合数字进行跳转,不过以个人经验,与其去算要跳多少个单词,不如多按几回吧。
I
、A
:移动到行首或行末的第一个字符处,并进入插入模式。
H
、M
、L
:光标分别跳转到可视区域的最上面、中间、最下面。
Ctrl+D
、Ctrl+U
:有时,须要看的文本不在可视区域,经过这些组合进行上下翻页。
^
、$
、0
:光标移动到行首和行尾(0是绝对行首)。不过由于^
和$
都须要同时按住shift,并且数字键咱们每每难以盲打,因此我通常直接使用I+Esc
、A+Esc
。
%
:移动到与当前括号匹配的括号处。
gj
、gk
:有时可视区域不够宽,而一行的字符有不少,致使了wrap。那么经过jk是没法直观的定位到同一物理行,却不在同一个可视行里的位置,此时须要gj
和gk
。
f
、F
:经过上面的例子,咱们知道,f
是find的意思,能够在一行内查找某个字符出现的位置,并直接跳转过去。好比f<
能够从当前光标开始向右,找到第一个<
,并移动过去。F是向左查找。
;
:重复上一次的f
查找操做
.
:重复上一次的修改操做,跟;
能够说是好基友,常常用来实现一些简单的重复操做,比录制宏要简单不少。常常有意识的使用这种简单重复,是vimer编辑思路进阶的分水岭。
vim的另外一个优点是高效修改。在vim下修改就要改掉传统鼠标流的思惟方式,切忌提到修改就按i
。有不少高效的修改办法,并且这些办法每每是可重复的。下面举一些我经常使用的例子:
r
:替换模式,替换当前光标所在位置的一个字符。虽然你一样能够i
进入插入模式,而后删掉那个字符,再输入须要的字符,但这种操做是鼠标流思惟方式。替换是一个可重复操做,多用没坏处。
cw
:change word
能够删除从当前位置到一个单词的结尾,并进入插入模式。这种操做经常使用于修改一个变量。好比对于:int count=0;
但愿把count
改为cnt
,那么当光标位于c
字符处的时候,按cw
可直接删除count
,并进入插入模式。而后直接继续输入cnt
便可。
caw
:change a word
能够删除当前光标所在位置的单词。对于int count=0;
的例子,若是此时光标在count
中间某处,好比u
处,直接键入caw
能够达到一样的效果。因此caw
更强大一些。
c$
、c^
:触类旁通,能够猜到c$
是从当前位置删除到行尾,并进入插入模式。
ci"
:change inside "
能够用于修改当前位置附近,在相同配对的"
中的内容。好比对于const char *str="hello world";
。当在双引号中间的任意位置键入ci"
能够直接清空字符串,并继续输入新的但愿的字符串。
ci(
、ci[
:触类旁通change inside (
change inside [
。
cit
:这个比较特殊,能够直接编辑匹配的xml标签中的内容!常常编写html的童鞋能够熟悉一下。
yi"
:yank inside "
猜猜是啥意思?相似ci"
只是把编辑操做编程复制操做,由于y
是复制!是否是很强大。
ya"
:yank around "
复制整个字符串,包括双引号。
yw
、yaw
、daw
、d$
...:好了,这些能够"发明"出来了。
o
、O
:向下向上增长空行
u
、Ctrl+r
:undo和redo
上面的例子体现了vim组合的思想,不少命令能够经过组合获得不一样的效果。
v
、V
、Ctrl+v
是Visual模式,相似用鼠标选中一些文本。我在早期使用vim时候,十分喜欢用v
,好比要删除一个单词,我每每会用vwd
,试图用vw
选中一个单词,而后d
删除。这种方式明显是鼠标流的后遗症。直到我学会上面介绍的一些技巧后,v
已经不多用了。不过Ctrl+v
是Block Visual
模式,相似选中列,这个技巧有时颇有用。好比有以下文本:
one two three four
但愿变成
"one, two, three, four"
首先将光标定位到one的o处,Ctrl+v
,3j
,$
,A
,,
,Esc
,V
,3j
,J
。这一套连招下来,出来了:
one, two, three, four,
若是要合的行数不少,就比较有优点了。问我怎么知道按3j
,上文提到的set relativenumber
帮到你。
在开发效率上,不敢说vim优于IDE,不过vim的编辑和修改速度是比鼠标快的。使用vim的过程就是自我否认和自动重塑的过程,若是你不断的学习技巧的话,编辑习惯会一再被推翻,一再重塑。不断有新的理解注入到平常的工做中。最终会造成本身编辑风格。