回顾前面3个.命令编辑任务
在技巧2中,我们想在一系列行的结尾添加分号.我们先用A;
修改了第一行,做完这步准备之后,就可以使用.命令对后续行重复此修改,我们使用了j命令在行间移动,要完成剩余的修改,只需要简单地按足够多次j.就可以了.
在技巧3中,我们想为每一个+号的前后各添加一个空格,我们先用f+
命令跳到目标字符上,然后用s命令把一个字符替换成3个,做完这步操作后,我们就可以按若干下;.完成此任务.
在技巧5中,我们想把每次出现单词”content”的地方都替换成”copy”,我们使用*命令来查找目标单词,然后用cw
命令修改第一处地方.做完这步准备后,就可以用n
键跳到下一匹配项,然后用.键做相同的修改.要完成这项任务,只需要简单地按足够多次n.
就行了.
理想模式:用一键移动,另一键执行.
就像画家只花一小部分时间涂色一样,程序员也只花一小部分时间编写代码,绝大多数时间用来思考,阅读,以及在代码中穿梭浏览.当确实需要修改的时候,谁说一定要切换到插入模式才行?我们可以重新调整已有代码的格式,复制它们,移动其位置,或是删除它们.在普通模式中,我们有众多的工具可以利用.
输入一些词后使用撤销命令,可能会撤销最后输入的词或字符,然而在vim中,我们可以自己控制撤销的粒度.
u键触发撤销命令,会撤销最新的修改.一次修改可以是改变文档内文本的任意操作,其中包括在普通模式,可视模式以及命令行模式中所触发的命令,而且一次修改也包括了在插入模式中输入(或删除)的文本,因为我们也可以说,i{insert some text}
是一次修改.
停顿的时候,就该退出插入模式了,当准备好继续写的时候,按A就可以重新回到原来的地方继续写作.
如果我认为我走错了方向,我会切换到普通模式,然后按u撤销,每次做撤销时,文字都按我最初书写时的思路,被切分成条理清晰的块.
在插入模式中移动光标会重置修改状态
撤销命令会回退从进入插入模式到退出此模式间输入(或删除)的全部字符.
但是如果在插入模式中使用了up,down,left,right这些光标键,会产生一个新的撤销块.
你可以把这个想象为先切换回普通模式,然后用h,j,k,l命令对光标进行移动,唯一的区别是我们并没有退出插入模式,这会对 . 命令操作产生影响.
在vim中,要完成一件事,总有不止一种方式,在评估那种方式最好时,最显而易见的指标是效率,那种手段需要的按键次数最少.然而,在出现平局的时候改如何选择获胜者?
在下例中,假设光标位于行尾处的字符”h”上,而我们想要删除单词”nigh”:
The end is nigh
反向删除
db The end is h
x The end is
正向删除
b The end is nigh
dw The end is
删除整个单词
daw The end is
你可以把daw命令解读成delete a word,这样比较容易记忆.
只有最后一个方案,使用.的时候,可以删除一个单词.可以重复上次删除单词的操作.
大多数普通模式命令可以在执行时指定次数,我们可以利用这个功能来做简单的算数运算.
很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次.
和
命令分别对数字执行加和减操作.在不带次数执行时,它们会逐个加减,如果带一个次数前缀,那么就可以用它们加减任意次数.例如,如果我把光标移动到字符5上,执行10
就会把它变成15.
但是如果光标不在数字上会发生什么?文档中说,
命令会”把当前光标之上或之后的数值加上[count]”,因此,如果光标不在数字上,那么
命令将在当前行正向查找一个数字,如果找到了,它就径直跳到那里
举例:
.blog, .news {backgroud-image: url(/sprite.png);}
.blog { background-position: 0px 0px }
.news { background-position: -180px 0px }
我们要复制最后一行并且对其做两个小改动,即用”news”替换单词”blog”,以及把”0px”改为”-180px”
我们可以运行yyp来复制此行,然后用cw来修改第一个单词.
一种做法是用f0跳到此数字,然后进入插入模式手动修改它的值.
不过运行180要快的多.由于我们的光标不在要操作的数字上,所以该命令会正向跳到所要找到的第一个数字上 ,从而省去了手动移光标的步骤.
yyp
cW.news
180<C-x>
vim中把以0开头的数字解释为8进制,而不是10进制.007+001=010
把 set nrformats=
加入到你的vimrc里面,会让vim把所有的数字当成十进制,不管他们是不是以0开头.