天天看点

《Vim实用技巧(第2版)》——2.4 用次数做简单的算术运算

本节书摘来自异步社区《vim实用技巧(第2版)》一书中的第2章,第2.4节,作者:【英】drew neil(尼尔)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。

很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次(参见 :h count

《Vim实用技巧(第2版)》——2.4 用次数做简单的算术运算

)。

<code>&lt;c-a&gt;</code> 和 <code>&lt;c-x&gt;</code>命令分别对数字执行加和减操作。在不带次数执行时,它们会逐个加减,但如果带一个次数前缀,那么可以用它们加减任意整数。例如,如果把光标移到字符5上,执行 10<code>&lt;c-a&gt;</code> 就会把它变成15。

但是如果光标不在数字上会发生什么?文档里说, <code>&lt;c-a&gt;</code>命令会“把当前光标之上或之后的数值加上 [count]”(参见 :h ctrl-a

《Vim实用技巧(第2版)》——2.4 用次数做简单的算术运算

)。因此,如果光标不在数字上,那么 <code>&lt;c-a&gt;</code> 命令将在当前行正向查找一个数字,如果找到了,它就径直跳到那里。我们可以利用这一点简化操作。

下面是一段css片段。

normal_mode/sprite.css

我们要复制最后一行并且对其做两个小改动,即用“news”替换单词“blog”,以及把“0px”改为“-180px”。可以运行 yyp 来复制此行,然后用 cw 来修改第一个单词。但该怎么处理那个数值呢?

一种做法是用 f0 跳到此数字,然后进入插入模式手动修改它的值,即<code>i-18&lt;esc&gt;</code>。不过,运行 <code>180&lt;c-x&gt;</code> 则要快得多。由于光标不在要操作的数字上,所以该命令会正向跳到所找到的第一个数字上,从而省去了手动移光标的步骤。让我们看看整个操作过程。

《Vim实用技巧(第2版)》——2.4 用次数做简单的算术运算

在本例中,只复制了一行并做出改动。但是,假设要复制10份,并对后续数字依次减180。如果要切换到插入模式去修改每个数字,每次都得输入不同的内容(-180,然后-360,以此类推)。但是如果用 <code>180&lt;c-x&gt;</code> 命令的话,对后续行也可以采用相同的操作过程。甚至还可以把这组按键操作录制成一个宏(参见第11章),然后根据需要执行多次。

数字的格式

007的后面是什么?不,这不是詹姆斯·邦德的恶作剧,我是在问:如果对007加1,你觉得会得到什么结果。

如果你的答案是008,那么当你尝试对任意以0开头的数字使用<code>&lt;c-a&gt;</code> 命令时,也许会感到诧异。像在某些编程语言中的约定一样,vim把以0开头的数字解释为八进制值,而不是十进制。在八进制体系中,007 + 001 = 010,看起来像是十进制中的10,但实际上它是八进制中的8,糊涂了吗?

如果你经常使用八进制,vim的缺省行为或许会适合你。如果不是这样,那么你可能想把下面这行加入你的vimrc里:

<code>set nrformats=</code>

这会让vim把所有数字都当成十进制,不管它们是不是以0开头的。