有没有办法在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类似但不相同。
答案 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
说明:
qq
:将宏记录到注册表q
0
:转到第一栏。yf
:猛拉所有内容,包括第一个空格(请记住您的第一行有1
和空格)。0jP
:向下并将图案粘贴到线的开头。0<C-a>
:转到第一列并将数字加1。q
:结束微距录制。这给出了:
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步增量。所有Series对象都有一个.reset()方法,可以将它们设置回启动值。可以像以下调用一样创建新的Series对象:
let s2 = Series(0, 2)
创建一个满足第二个请求的两步对象(产生:2,4,6,8 ......)
答案 7 :(得分:1)
我认为所有提议的解决方案都难以记住,您可以使用一次,但是每次使用时都需要详细说明(如果每天使用不到一次)。
我发现visual incrementing script非常容易安装和使用。一旦在vim中安装,你只需要生成一个0的列,用Ctrl-V选择它并写下命令:I。然后它会在每一行自动生成增加的数字。还有其他功能:
这解决了一个更普遍的问题,因为它也可以在与第0列不同的位置工作,只需使用Ctrl-V可以选择该列。
答案 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