vi - 如何生成数字序列?

时间:2012-03-28 08:23:21

标签: vim pattern-matching vi sequential

有没有办法在vi(m)中生成数字序列?

例如,从文件中的随机行(在vim中打开),比如说Row-i - 到随机行,比如Row-j,其中Row-i< Row-j,有没有办法从Row-i到Row-j生成数字序列,从数字1开始到数字j-i + 1,步长增加为1?

说我在文件中有以下行。

this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10

我希望从第4行到第8行的数字序列加前缀,从第1行开始到第5行。操作后,生成的文件应如下所示:

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10

如果可以,有没有办法增加步数?例如,序列应为2,4,6,8,10 ..即步数为2。

请注意:

SO post类似但不相同。

10 个答案:

答案 0 :(得分:45)

使用 V (Shift-v)选择多行,然后键入命令bellow:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

输入:help sub-replace-expression以阅读更多内容。

答案 1 :(得分:27)

您可以简单地使用带有 CTRL-a 函数的宏来增加前导数字,而不是复杂的构造。示例数据:

aaa
bbb
ccc

首先插入起始编号和空格

1 aaa
bbb
ccc

然后在第1行录制此宏(<C-a>表示 CTRL-a ):

qq0yf 0j0P0<C-a>q

说明:

  1. qq:将宏记录到注册表q
  2. 0:转到第一栏。
  3. yf:猛拉所有内容,包括第一个空格(请记住您的第一行有1和空格)。
  4. 0jP:向下并将图案粘贴到线的开头。
  5. 0<C-a>:转到第一列并将数字加1。
  6. q:结束微距录制。
  7. 这给出了:

    1 aaa
    2 bbb
    ccc
    

    现在您可以根据需要使用@q应用此宏。如果你需要增加两个,只需使用 CTRL-a CTRL-a 而不是一次。现在,您可以将此宏应用于连续行,例如:

    :.,$norm @q
    

    将为文件的其余部分添加前导行号。

答案 2 :(得分:16)

使用 Vim 8.0 可以使用 g Ctrl-a ,请参阅:help v_g_CTRL-A

转到第4行,使用 Ctrl-v 以块状方式选择第一个字符,按 Shift i ,输入1(这是 1 ,然后是 Space )和 Esc 退出插入模式。结果将如下所示:

this is line #1
this is line #2
this is line #3
1 this is line #4
1 this is line #5
1 this is line #6
1 this is line #7
1 this is line #8
this is line #9
this is line #10

现在,从第5行开始,再次使用 Ctrl-v 选择除第一个之外的所有插入的1。按 g Ctrl-a 创建序列。

this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5                                                                     
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #1

使用 2g Ctrl-a 使用步数2.

答案 3 :(得分:9)

:4,8s/^/\=line(".")-3." "    

会做你想做的事

如果你需要count = 2:

:4,8s/^/\=2*(line(".")-3)." " 

这将给你2,4,6,8,10

在我的示例中,

行号是硬编码的,您可以使用V来选择要更改的行。

答案 4 :(得分:2)

在可视模式下选择目标线,然后运行Ex命令

:'<,'>s/^/\=(line('.')-line("'<")+1).' '

答案 5 :(得分:2)

这是一个肮脏的伎俩,但生活就是由这些组成的。 :)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

不跨平台。

答案 6 :(得分:1)

Nexus插件提供了Series类型和一个这样使用的对象s1:

:4,8s/^/\=s1.next().' '/

Nexus还附带了一个s0 Series对象,它将0作为第一个.next()结果。 s0和s1都使用1步增量。所有Seri​​es对象都有一个.reset()方法,可以将它们设置回启动值。可以像以下调用一样创建新的Series对象:

let s2 = Series(0, 2)

创建一个满足第二个请求的两步对象(产生:2,4,6,8 ......)

答案 7 :(得分:1)

我认为所有提议的解决方案都难以记住,您可以使用一次,但是每次使用时都需要详细说明(如果每天使用不到一次)。

我发现visual incrementing script非常容易安装和使用。一旦在vim中安装,你只需要生成一个0的列,用Ctrl-V选择它并写下命令:I。然后它会在每一行自动生成增加的数字。还有其他功能:

  • 以不同于0的数字开头
  • 左边或右边的垫号为0(如001,...,015)
  • 减少或增加数字
  • 增加超过1
  • 日期(但你需要一个额外的插件),字母,日期字母

这解决了一个更普遍的问题,因为它也可以在与第0列不同的位置工作,只需使用Ctrl-V可以选择该列。

插件的vimball是herehere

答案 8 :(得分:0)

(如果您的vim具有Perl支持 - 在许多Linux发行版中是默认的):在可视模式(V)中选择行并执行

:perldo s/^/++$z . " "/e

答案 9 :(得分:-1)

灵活性较低但容易记住的方法是使用Renumber.vim重新编号插件http://www.vim.org/scripts/script.php?script_id=189

如果还没有任何数字,就像在OP中一样,应该在他们的位置插入一些数字。重新编号可以处理实际的排序,它只根据第一个数字来完成。

在此示例中,我使用<C-v>在您想要编号的所有行上插入起始编号。

4G<C-v>4jGI1 <Esc>gv:Renumber

使用两个步骤

:Renumber s2