vi - 如何生成数字序列?

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以阅读更多内容.

  • 谢谢你!vim是如此强大!! 试试这个:`:让我= 1 | 设j = 1 | '<,'> g/^/s //\= i/| 设c = i + j | 让j = i | 让我= c` (2认同)

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)

说明:

  1. qq:将宏记录到寄存器中 q
  2. 0:转到第一栏.
  3. yf:猛拉所有直到并包括第一个空格(记住你的第一行有1空格).
  4. 0jP:向下并将图案粘贴到线的开头.
  5. 0<C-a>:转到第一列并将数字递增1.
  6. q:结束宏录制.

这给了:

1 aaa
2 bbb
ccc
Run Code Online (Sandbox Code Playgroud)

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

:.,$norm @q
Run Code Online (Sandbox Code Playgroud)

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

  • 我经常在我的宏中添加 `zz` 来看看接下来会发生什么。当光标位于屏幕底部时很难。 (2认同)

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步数.

  • 精彩的。使用 Vim 20 年之后,我仍然对其功能感到惊讶。 (3认同)
  • 当你制作动画 gif 时,你是否使用了插件或某种技巧来显示每个按键的文本? (2认同)

Ken*_*ent 9

: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来选择要更改的行.


Nou*_*him 5

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

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

不跨平台。