vim 递增数字列

问题描述 投票:0回答:6

通常我处理的文件如下所示:

0.98   3.45
2.45   3.90
.
.
.
4.56   8.45

假设有 100 行。我想要得到这样的东西:

1   0.98   3.45
2   2.45   3.90
.
.
.
100 4.56   8.45

第一列整数。我通常做的是生成一个 仅包含数字 1,2...100 的列文件,然后选择该块并 将其粘贴到包含两列的文件中。由于行数是 几乎总是不同我的方法似乎很慢。

您有什么建议吗?

谢谢。

vim vi
6个回答
16
投票
:%s/^/\=printf('%-3d ', line('.'))

更多信息:

:help :s\= 
:help printf()
:help line()

10
投票

这是一个替代的仅 vim 正常模式 版本。将光标置于第一列第一行:

<C-v>GI0 <ESC>gvg<C-a>
  • <C-v>
    视觉块模式(
    :help visual-block
    )
  • G
    被选择到屏幕底部 (
    :help G
    )
  • I
    在第 1 行开始插入模式 (
    :help v_b_I
    )
  • 0 
    输入文字零和文字空格
  • <ESC>
    返回正常模式
  • gv
    重新选择最后一个视觉选择(第 1 列的全部)(
    :help gv
    )
  • g<C-a>
    依次递增所选内容中的所有数字 (
    :help v_g_CTRL-A
    )

变成这个

0.98   3.45
2.45   3.90
4.56   8.45

进入这个

1 0.98   3.45
2 2.45   3.90
3 4.56   8.45

4
投票

我发现VisIncr对于类似的操作非常有价值(对于那些使用Vundle或NeoBundle的人来说,这是GitHub版本)。该插件“有助于制作一列递增或递减的数字、日期或日名”。添加行号的示例如下:

在可视块模式下选择文件的第一列:

gg<C-v>G

插入起始数字(本例中为 1)和列分隔符(我假设此处为 Tab):

I1<Tab><Esc>

重新选择文件的第一列:

gv

运行 VisIncr 命令来增加数字:

:I<CR>

您可以使用不同的命令右对齐数字:

:II<CR>

递增日期、字母、十六进制和罗马数字同样简单。


3
投票
:%!cat -n

是一个快速的解决方案。紧随其后的是

:%s/^\s*//g

它很快就能给你你想要的东西。


2
投票

对于生成一列连续数字,

nl
是你的朋友。假设你想生成从
1
n
:

  1. 在 vim 中创建一个包含

    n
    行的文件。

  2. 运行

    :%!nl

现在您可以使用

<C-v>
选择数字列并将其复制到其他位置。


0
投票
  1. 例如输入数字 1 然后复制 100 次

    y + 100
    
  2. 进入可视区块,选择从第二行开始的所有数字

  3. 最后按

    g + <C-a>
    
© www.soinside.com 2019 - 2024. All rights reserved.