【问题标题】:vi sequence number generationvi 序列号生成
【发布时间】:2012-11-23 22:33:21
【问题描述】:

我需要使用这种模式在vi 中创建一个文件。有没有办法使用第一行自动生成这些行

run 1 end
run 2 end
run 3 end
run 4 end
run 5 end
run 6 end

我总是可以在 excel 中执行此操作,然后将其转换为文本文件,然后切换到 vi,但想知道是否有办法在 vi 中执行此操作,这样我就不必切换返回excel

【问题讨论】:

    标签: regex vi vim


    【解决方案1】:

    :help ctrl-a

    ^a 增加光标下的数字,您可以在宏中使用它。对于您的情况,假设您有第一行并且光标在其上:

    qaYpw^aq4@a
    

    应该做的伎俩。这是帮助页面中概述的技术,使用w 修改以将光标向前移动到数字。分解:

  • qa 开始在寄存器a 中录制宏
  • Y 拉出当前行
  • p 将 yank 缓冲区放在当前位置下方并移动到新行的第 1 列
  • w 前移一个字(到数字)
  • ^a 增加数字
  • q 停止录制宏
  • <count>@a 应用宏

    另一种技术是使用外部工具。例如,如果您已经有了该行并且光标在其上:

    !!awk '1;{for(i=0;i<5;i++){$2+=1; print}}'
    
  • 【讨论】:

    • qa 开始录制 Yp 复制粘贴 w 将光标移动到下一个单词 其余的我不关注
    • ^a 表示按住 ctrl 键并点击a。如果您在窃取击键的 tmux 和/或屏幕会话中运行,这会变得很尴尬。
    • 这行得通。我把^a 当作^ a。现在我知道这是CTRL+A。谢谢
    • awk 命令也有效。也可以请解释一下。再次感谢。我理解 for 循环,我猜 $2+=1 给出的增量为 1。print 打印它。开头的1 做了什么
    • w 实际上并不需要。 ^A 会从光标位置向前看找到找到的第一个数字,所以如果在行首使用它会正常工作。
    【解决方案2】:

    威廉的回答非常好。我会发布另一个解决方案(它有点复杂),假设你已经有了第一行

    Y6P
    :let g:I=1
    :%g/\d/s/\d/\=g:I/|let g:I=g:I+1
    
    • let 允许您分配变量
    • g 运行全局命令
    • \d 匹配行中的数字
    • s 是替代品
    • \d 是因为你要写一个数字
    • \= 是替换表达式(参见::help sub-replace-\=
    • g:I 是我们在表达式中替换的变量,让变量 g:I 递增

    【讨论】:

      【解决方案3】:

      :put!=map(range(1,6),'\"run \".v:val.\" end\"')

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多