vi/vim使用技巧: 替换的巧妙使用(1)

这个技巧是在VIM邮件列表中看到的,非常实用。

这里以编写C语言程序为例, 假设,我们最终想完成的代码如下:

#define BIT_MASK_1      (1 << 0)
#define BIT_MASK_2      (1 << 1)
#define BIT_MASK_3      (1 << 2)
#define BIT_MASK_4      (1 << 3)
#define BIT_MASK_5      (1 << 4)
#define BIT_MASK_6      (1 << 5)
#define BIT_MASK_7      (1 << 6)
#define BIT_MASK_8      (1 << 7)
#define BIT_MASK_9      (1 << 8)
#define BIT_MASK_10      (1 << 9)
#define BIT_MASK_11      (1 << 10)
#define BIT_MASK_12      (1 << 11)
#define BIT_MASK_13      (1 << 12)
#define BIT_MASK_14      (1 << 13)
#define BIT_MASK_15      (1 << 14)
#define BIT_MASK_16      (1 << 15)
#define BIT_MASK_17      (1 << 16)
#define BIT_MASK_18      (1 << 17)
#define BIT_MASK_19      (1 << 18)
#define BIT_MASK_20      (1 << 19)
#define BIT_MASK_21      (1 << 20)
#define BIT_MASK_22      (1 << 21)
#define BIT_MASK_23      (1 << 22)
#define BIT_MASK_24      (1 << 23)
#define BIT_MASK_25      (1 << 24)
#define BIT_MASK_26      (1 << 25)
#define BIT_MASK_27      (1 << 26)
#define BIT_MASK_28      (1 << 27)
#define BIT_MASK_29      (1 << 28)
#define BIT_MASK_30      (1 << 29)
#define BIT_MASK_31      (1 << 30)
#define BIT_MASK_32      (1 << 31) <

我们不需要一行一行的去写,只需要先写好第一行,如下:

#define BIT_MASK_1      (1 << 0) 

然后,我们回到Normal模式,在这一行上输入”Y31p”,拷贝此行,然后粘贴31次。这样,我们得到总共32行上面的内容。

现在使用”V31j”命令选中这32行,然后使用两次替换命令:

:'<,'>s/BIT_MASK_\zs\d*\ze/\=line(".") - line("'<") + 1
:'<,'>s/\zs\d*\ze)$/\=line(".")-line("'<")

这样,我们就得到了我们想要的结果。

这种方式还可以用于数组下标的自动增加,以及文本的章节自动编号等功能。只要你能够用正则表达式准确的定位出你想要自动编号的的数字,那么就可以使用这种方法来自动编号。

将在下一篇文章中详细介绍本文中使用的VIM命令。

[参考文档]

  • VIM邮件列表,2007/01/29, 邮件标题:”replace with a number sequence”

“vi/vim使用技巧: 替换的巧妙使用(1)”的12个回复

  1. 您好,我想在两行相减后除以3,即(line(“.”) – line(“‘<"))/3 + 1,但是,/总是会被当作特殊字符,请问需要怎样处理?谢谢!

  2. @karl
    我现在还没有这个计划。
    对已经对vim有所掌握的人来说,他应该已经学会了通过vim手册来提升自己的vim使用能力,所以我觉得写这类文章的必要性不大,除非有更多的人有这种需求。
    我现在想写的是vim使用入门系列的文章,很多刚接触Linux的人,第一个使用的编辑器就是vim,但真正坚持下来并喜爱上vim的,我相信只是非常少的一部分。原因很简单,一是对只有Windows背景的人来说,vim的工作方式是他们不能理解的;二是vim的学习曲线太陡峭,要记忆很多东西,对“惜时如金”的现代人来说是无法接受的。
    我希望做的,就是让vim的初用者更快的适应vim环境,能够接受vim的哲学并喜欢上vim,只有这样,才更有利于vim用户群的培养,才能更好的使vim推广开来。
    也希望能有更多的vim用户参与到这一进程中。

  3. 好的,谢谢

    你的系列文件是不是再写两篇关于vim脚本的?--先写点简单的:关于脚本的编写,调用时怎么传参等。。。

  4. @karl
    先查找这个模式,然后用”15n”,向下查找第15次出现的地方
    如果写正则表达式,不知道能不能实现,即使能实现,也会很复杂的说

  5. 再请教个问题:我想查找某个模式出现第n次的地方,除了写命令,有没有方便的方法。我现在用let..while 查找,每次要敲四五行的命令很不方便

  6. 那天晚上后来就试成功了。。。呵。。。折腾了一会儿。。。
    BTW:请教一下:我现在遇到一个问题就是:vi看代码的时候想找一个快速搜索的方法:
    比如:看javascript的代码:
    其中有一个goog$array$contains,我想在文件上下文中找这个变量,有没有快速的方法?如果单是其中的一个那么按个*或#就行了,现是想goog$array$contains怎个查找,除了在未行输入:/goog\$array\$contains之外,在可视模式下,选上这个goog$array$contains的话有没有可以快速查找的方法?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注