在编写代码的过程中,选择代码是一项非常常见的操作,其他文本编辑器都是使用鼠标进行选择,我在使用其他编辑器的时候,编写到一半的时候总是想着要去找鼠标,然后选择代码,然后在回到键盘上进行操作。对于vim来说代码选择再加上操作是非常强大的功能。
首先我们需要了解一下什么是文本对象,我对文本对象的理解就是在成对符号之间的字符串,比如",',{等,包括xml的标签之间的都属于文本对象。选中文我们都是为了操作文本,vim里面有一些按键用于操作,称之为操作符,比如d,c,y等,d表示删除,c表示删除插入,y表示提取。
我们以一个实例来解释文本操作加文本对象的使用。
This is a series of commands.
上面这句话假设光标所在位置是句首,我们想把commands改为hello,我们要完成这件事情有很多种方法,下面我们一个一个的来说。
第一种办法就是用l或者<Right>将光标移动到.上面,然后用i进入插入模式,使用<Backspace>删除commands,输入hello,<ESC>退出插入模式。不得不说,我在最开始接触vim的时候,我就是这么干,而且还这么干了很久,现在回想起来不得不佩服当初的愚蠢。因为我们还有更好的方式。
第二种办法使用$将光标一次性移动到行尾,使用i进入插入模式,或者是A将上面这个两个操作合并起来,删除commands,输入hello。这个方案明显比第一个方案高效了很多,因为我们可以一次就可以将光标移动到位了。当然,我们还有更加高效的办法。
第三种方案是使用fc将光标移动到c字母上面,使用cw删除commands并进入插入模式,输入hello。
上面这三种方案都还没涉及到文本对象的选择,如果我们使用fm将光标移动到commands上时,我们就需要使用到文本对象的选择了,因为cw是从当前光标开始删除,还会遗留下co没有被删除,所以我们可以输入ciw会将光标所在的单词整个删除并进入插入模式。这个方案在这里不一定是最好的,但是可以适用范围更加广。
现在我们改一下需求,删除commands和.号,因为这句话我们还没输入完成,我们输入hello之后,还需要继续输入,号。
这里就涉及到单词和字符串的概念了,单词就是我们平常所理解的单词,比如上面的This,is,commands等,而字符串是指两个空格之间的字符,如果我们需要删除commands.使用面向字符的文本对象操作起来会更加高效一些。
首先我们将光标移动到commands上面,也可以移动到.号上面,使用fc或者fm或者f.都可以,然后执行ciW会将commands.都删除并进入插入模式。
OK,我们再接着修改一下需求,我们仅仅只要将commands删除,而不进行其他操作。
首先我们还是要先移动光标到commands上面,和上面的方法是一样的,使用f+字符的模式来移动光标,这里特别说明一下,我以前很少使用f+字符来移动光标,一般都是用w,e,b等,后来我习惯使用f之后,在单行内移动光标的效率提升了很多,这里也建议大家使用这种模式来移动光标。我们要删除文本,所以执行命令以d开头,我们还用iw作为文本对象,即执行diw就可以删除commands了,比起使用c开头的命令,我们并不会进入插入模式,毕竟我们仅仅就是删除单词。但是我们会发现一个问题,就是of和.之间还有一个空格,我们需要再执行一次x才能删除空格。
这时候我们希望能一步到位,就是把commands和以前的空格以前删除了。这里就涉及到i和a的区别了,i表示的是单词本身或者字符串本身,a表示单词本身加上单词周围的一个或多个空格,为什么会有这样的区别呢?因为我们在编辑文本的时候,有时候需要删除+修改,有时候仅仅删除就好了。而删除修改空格往往需要保存原样,而删除总会有一个或多个多余的空格。所以在这种情况下,我们执行daw会一次性将commands和前面的空格一起删除,这样明显编辑效率就提高。
这样就形成了一个模式了,操作符(y,d,c等)+文本对象(iw,aw,iW,aW等),把这个模式推广开来,在其他类似的场合也能迅速的提高了编辑效率。大家可以通过:h text-objects来查看所有的文本对象。下面进行简单的列举一下,同时还能给出快速记忆的办法。
aw 一个单词包括一个空格,快速记忆:a word
iw 一个单词,快速记忆:inner word
aW 一个字符串包括一个空格,快速记忆:a WORD
iW 一个字符串,快速记忆: inner WORD
as 一个句子包括一个空行,快速记忆:a sentence
is 一个句子,快速记忆:inner sentence
到这里大家应该已经发现规律了吧,赶紧通过帮助文档查看完整的文本对象吧。
从这篇文章开始,针对vim的文章我换了一个写作方式,以我的实际编辑的例子来进行深入解析,这样可操作性更加强一些。
文章同步发布在:http://www.xinxingzhao.com/blog/2016/05/29/vim-select-boject.html