这个技巧是在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”
您好,我想在两行相减后除以3,即(line(“.”) – line(“‘<"))/3 + 1,但是,/总是会被当作特殊字符,请问需要怎样处理?谢谢!
我已经找到啦,把分隔符换成/以外的字符,翻您的VIM相关文章找到的解决方法,谢谢:-)
@karl
我现在还没有这个计划。
对已经对vim有所掌握的人来说,他应该已经学会了通过vim手册来提升自己的vim使用能力,所以我觉得写这类文章的必要性不大,除非有更多的人有这种需求。
我现在想写的是vim使用入门系列的文章,很多刚接触Linux的人,第一个使用的编辑器就是vim,但真正坚持下来并喜爱上vim的,我相信只是非常少的一部分。原因很简单,一是对只有Windows背景的人来说,vim的工作方式是他们不能理解的;二是vim的学习曲线太陡峭,要记忆很多东西,对“惜时如金”的现代人来说是无法接受的。
我希望做的,就是让vim的初用者更快的适应vim环境,能够接受vim的哲学并喜欢上vim,只有这样,才更有利于vim用户群的培养,才能更好的使vim推广开来。
也希望能有更多的vim用户参与到这一进程中。
好的,谢谢
你的系列文件是不是再写两篇关于vim脚本的?--先写点简单的:关于脚本的编写,调用时怎么传参等。。。
@karl
先查找这个模式,然后用”15n”,向下查找第15次出现的地方
如果写正则表达式,不知道能不能实现,即使能实现,也会很复杂的说
再请教个问题:我想查找某个模式出现第n次的地方,除了写命令,有没有方便的方法。我现在用let..while 查找,每次要敲四五行的命令很不方便
好!! 可以
@karl
试试把”$”字符加到iskeyword选项里,例如:
:au FileType javascript setl isk=”@,48-57,_,192-255,$”
那天晚上后来就试成功了。。。呵。。。折腾了一会儿。。。
BTW:请教一下:我现在遇到一个问题就是:vi看代码的时候想找一个快速搜索的方法:
比如:看javascript的代码:
其中有一个goog$array$contains,我想在文件上下文中找这个变量,有没有快速的方法?如果单是其中的一个那么按个*或#就行了,现是想goog$array$contains怎个查找,除了在未行输入:/goog\$array\$contains之外,在可视模式下,选上这个goog$array$contains的话有没有可以快速查找的方法?
@karl
文章已经更新,再试一下文章中的命令。
@karl
这篇文章从CSDN转过来的时候,所有的”\”都被过滤掉了
今天空闲时我更新一下
提示找不到模式BIT_MASK_zsd*ze是为什么?