San*_*raj 44 vi vim pattern-matching 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
Run Code Online (Sandbox Code Playgroud)
我想要从第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
Run Code Online (Sandbox Code Playgroud)
如果可以,有没有办法增加步数?例如,序列应为2,4,6,8,10 ..即步数为2.
请注意:
这个SO帖子类似但不一样.
kev*_*kev 49
用V(Shift-v)选择几行,然后键入命令bellow:
:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2
Run Code Online (Sandbox Code Playgroud)
输入:help sub-replace-expression以阅读更多内容.
hoc*_*chl 27
您可以简单地使用带有该CTRL-a函数的宏来增加前导数字,而不是复杂的构造.示例数据:
aaa
bbb
ccc
Run Code Online (Sandbox Code Playgroud)
首先插入起始编号和空格:
1 aaa
bbb
ccc
Run Code Online (Sandbox Code Playgroud)
然后在第1行录制此宏(<C-a>表示按下CTRL-a):
qq0yf 0j0P0<C-a>q
Run Code Online (Sandbox Code Playgroud)
说明:
qq:将宏记录到寄存器中 q0:转到第一栏.yf:猛拉所有直到并包括第一个空格(记住你的第一行有1空格).0jP:向下并将图案粘贴到线的开头.0<C-a>:转到第一列并将数字递增1.q:结束宏录制.这给了:
1 aaa
2 bbb
ccc
Run Code Online (Sandbox Code Playgroud)
现在您可以根据需要使用此宏@q.如果你需要增加两个CTRL-aCTRL-a而不是只使用一次.现在您可以将此宏应用于连续行,例如:
:.,$norm @q
Run Code Online (Sandbox Code Playgroud)
将为您的文件的其余部分添加前导行号.
rkt*_*kta 25
使用Vim 8.0可以使用g Ctrl-a,请参阅:help v_g_CTRL-A
转到第4行,用于Ctrl-v按块顺序选择第一个字符,按Shift i,输入0(这是1,后跟Space)并Esc退出插入模式.结果将如下所示:
__PRE__
现在,从第5行开始,Ctrl-v再次使用选择0除第一个之外的所有插入.按下g Ctrl-a以创建序列.
__PRE__
使用2g Ctrl-a使用的2步数.
:4,8s/^/\=line(".")-3." "
Run Code Online (Sandbox Code Playgroud)
会做你想做的
如果你需要数= 2:
:4,8s/^/\=2*(line(".")-3)." "
Run Code Online (Sandbox Code Playgroud)
这将给你2,4,6,8,10
在我的示例中,行号是硬编码的,您可以使用V来选择要更改的行.
这是一个肮脏的把戏,但生活就是由这些组成的。:)
ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done
Run Code Online (Sandbox Code Playgroud)
不跨平台。