5.8. 技巧10——使用计数来做简单的算术
5.8 技巧10——使用计数来做简单的算术
大多数正常模式的命令都可以带有一个数字来执行,利用这个特性可以进行简单的算术运算。
在正常模式可用的许多命令都可以一个数字作为前缀。 Vim 将会尝试按指定的次数执行命令,而不是只执行一次(见 :h count ⓘ)。
<C-a> 和 <C-x> 命令对数字执行加和减。当没有一个计数时,它们只增减1。但如果以一个数字做我前缀,则可以加或者减任何整数。比如将光标放在一个字符 5 上,然后运行 10<C-a> 将会把它修改为15。
但是如果光标不在一个数字上,会发生什么呢?文档说 <C-a> 命令将“对光标下或光标后的数字加上 [count]” (见 :h ctrl-a ⓘ)。所以如果光标不在一个数字上,那么 <C-a> 命令将在当前行上往前寻找一个数字,如果找到了,就直接跳过去。可以利用这个特性。
下面是一个 CSS 的代码片段:
我们将复制最后一行,然后进行两个小的修改:将单词 “blog” 替换为 “news”,将 “0px” 替换为 “-180px”。 运行 yyp 复制这一行,然后使用 cW 改变第一个单词。但是怎么样去处理那个数字呢?
一个方法是使用 f0 跳到这个数字上,然后进入插入模式,手动改变这个值: i-18<Esc>。但是只运行 180<C-x> 会更快。因为光标一开始不是在一个数字上的,它会直接跳到它找到的第一个数字上。这省去了将手动将光标移动到那里的步骤。看一下这个工作实际的流程。
在本例中,只是复制了这一行一次,然后进行修改。但假如不得不进行10个修改,对每一个连续的拷贝都从该位置的数字上减去180。如果切换到插入模式去修改每个数字,我们不得不每一次都输入不同的值(-180,然后-360如此等等)。但是通过使用 180<C-x> 命令,工作流对随后的每一行都是一样的。甚至可以将键击记录录制为宏(见11章 宏)然后按照需要的次数尽可能多地重复它。