在excel中,提供了一个功能可以根据第一个数字下拉生成一串连续的数字,那么在vim中能不能生成呢?答案是肯定的,而且方法不只一种,而且灵活性更高。

第一种.用Vim的查找替换,说白了,比如说要生成1到100,那么就讲100个1顺序替换,每次替换自加就可以了。方法如下:
1)在Vim中键入1.
2)在1所在行,yy,100p。
3)进入命令行模式,输入如下命令:

let i=1|g/1/s//\=i/|let i=i+1

OK啦,效果如下。

生成连续数字,方法1

其实命令比较简单,简单解释一下:

1/  代表查找1
s/  代表替换后的新字符就在这个位置
/   就代表后面跟的是新的字符内容
\=i \=是把后面的字符串当成表达式来对待,在这里就是i的值
|   (逻辑或的符号)用以连接三个语句

其实到这里大家就可以自由发散啦,比如如果我想让字母横排怎么办呢?

:%s/\n/ /gc

再比如我只要偶数/奇数怎么办呢,相信大家都比我聪明,所以我就不罗嗦啦~

再由这个例子延伸一下,我要在每行前生成一个行号,怎么搞?按照刚才的思维,肯定还是要用到递增的理念,然后在啰嗦一句行首匹配符是^~~
呵呵,命令如下:

let i=1|g/^/s//\=i/|let i=i+1

 效果图如下:

插入行号
好啦,那么接着介绍我们的第二种方法–列模式+visincr插件。
1)在Vim中键入1。
2)在1所在行,yy,100p。
3)按下CTRL+v,然后按下G,从而讲所有的行都选中。
4)进入命令行,按下:I

效果图如下:

生成连续数字,列模式+visincr插件

是不是也是很棒?
呵呵,visincr就是专门做这种递增事情的插件的,他的生成方式要比我们查找替换更灵活写,比如他可以控制是左对齐还是右对齐,关于这个插件本博以后专门写一篇文章讲解~所以这次就不再赘述啦。
OK,怎么样,Vim够强大吧,赶紧去试试吧~~

版权所有,转载请注明出处。http://www.vimer.cn

vim(gvim)正则表达式查找替换(7)-结合vim脚本

《vim(gvim)正则表达式查找替换》是个比较久的系列了,这次因为博友niejieqiang的一个问题,所以决定继续在写一篇,而主题就是将正则表达式查找替换与vim脚本...

阅读全文

使用Vim(gvim)实现复杂的查找替换的一个例子

今天老婆在整理文档的时候希望能快捷的排版某些格式,无奈发现word并不能满足要求,所以就让我用Vim试一下。 问题如下: 1 加州大学伯克利分校 University of...

阅读全文

vim(gvim)正则表达式查找替换(6)-压缩(删除)重复行

之前有用正则表达式写过一个重复两行压缩成一行的命令,今天我们来看一个讲重复多行压缩成一行的命令。 首先,我们先考虑怎么查出多个重复行。 有两种方法,...

阅读全文

12则回应给“vim(gvim)正则表达式查找替换(4)-生成连续数字或行号”

  1. NaturalLight说道:

    :let i=1|%s/1/\=i/|let i=i+1
    这句话为什么不能完成上面的效果呢?

    [回复]

    Dante 回复:

    应该是和g命令有关,vim的文档中如下描述:
    The global commands work by first scanning through the [range] lines and
    marking each line where a match occurs (for a multi-line pattern, only the
    start of the match matters).
    In a second scan the [cmd] is executed for each marked line with its line
    number prepended.
    即g命令应该是先把所有行标识出来,然后再去做的替换操作,而%s应该是一次行全部做完了,所以没有递增。

    [回复]

    NaturalLight 回复:

    嗯,谢谢。
    我越来越喜欢vim了,看了你的blog对我帮助很大。

    [回复]

  2. NaturalLight说道:

    我还有一个问题,想要在生成的数后面加个空格应该怎么去做呢?

    let i=1|g/^/s//\=i /|let i=i+1
    这个搞不定啊

    [回复]

    Dante 回复:

    试了一下,不只是空格,任何字母都添加不了。。。
    我再研究一下吧,有解决办法之后告诉你~~

    [回复]

    依云 回复:

    :g/^/exe “s/^/”.line(‘.’).’ /’

    [回复]

    依云 回复:

    注意,引号变中文的了。。。。。

    [回复]

    Dante 回复:

    哈,试了一下,果然可以~

    [回复]

  3. [...] 《vim(gvim)正则表达式查找替换》是个比较久的系列了,这次因为博友niejieqiang的一个问题,所以决定继续在写一篇,而主题就是将正则表达式查找替换与vim脚本结合。 其实这种方法在之前的文章中也出现过如: vim(gvim)正则表达式查找替换(4)-生成连续数字或行号中 [...]

  4. ollyblue说道:

    直接生成连续的数可以在命令模式中执行如下的代码片段: let j=10 | while j < 100 | exec ‘normal! i’ . j . nr2char(13) | let j=j+1 | endwhile (其中可以自定义数字的开始与结束,只需改变 let j=开始数字 while j < 结束数字)

    [回复]

  5. 刘 强说道:

    你好,关注你的博客很久了,在学习vim的过程中也从您这儿学到很多东西。最近使用visincr插件有个困惑,就是在列自增的时候,如果数字前面有个单词,发现就会出错,比如下面这种情况test1test1test1test1我使用块选中1以后,使用:I,但是得到的结果却是 es11 es21 es31 es41我使用Gvim的版本是7.4,visincr插件版本是20。难道是插件不兼容Gvim7.4的版本?期待得到解答

    [回复]

  6. 路人甲说道:

    你好,文章说的很详细,感谢分享。如文章所说的方法,首先使用 `g` 命令找出所有的匹配行,如果只是从头开始,这样是没问题的,但是如果在其他地方已经有了类似的数据序列,文章中你用 `1` 做标志,如果在其他地方已经有了这个标志,这样就没办法正确递增或者递减了。虽然可以使用其他的标志,但是在一个大文件里面,可能找不到这么一个标志。

    [回复]

发表评论