【问题标题】:How to add a line after every few lines in vim如何在vim中每隔几行添加一行
【发布时间】:2024-01-17 23:56:01
【问题描述】:

我想使用 vim 编辑器在文件(大约 1000 行)的每 3 行之后添加一行。有人可以帮帮我吗?

谢谢, 艾丽莎

【问题讨论】:

    标签: vim


    【解决方案1】:

    有一个特定于 vim 的正则表达式可以做到这一点

      :%s/.*\n.*\n.*\n/\0\r/g
    
    • %s 是 vim ex 命令替换整个文件
    • .*\n 是包含行尾的一行
    • \0 是整个匹配的表达式
    • \r vim 表示添加新行的方式(不是人们期望的 \n)

    编辑:如果您想要换行以外的任何内容,只需将文本放在 \r 前面(如果它包含一些正则表达式字符,则正确转义正则表达式)

    【讨论】:

    • vim 也有 \{n\} 匹配 n 出现的模式。例如,我用它在每 100 行插入单词“GO”(因为输入 .*\n 100 次会很乏味):%s/\(.*\n\)\{100\}/\0GO\r/g。或者通过在正则表达式中启用非常神奇的模式(\v),它变得更容易阅读:%s/\v(.*\n){100}/\0GO\r/
    • 在 ubuntu 20.04 上运行的 spacemacs evil 模式中,我必须使用 \n 来指示换行符,而不是 \r,否则我会在所有行的开头得到 &M 而不是换行符。
    【解决方案2】:

    您可以使用macro。完整的流程如下:

    qq     " start recording to register q (you could use any register from a to z)
    o      " insert an empty line below cursor
    <Esc>  " switch to normal mode
    jjj    " move the cursor 3 lines downward
    q      " stop recording
    

    然后只需移动到起始行并键入 1000@q 即可执行您的宏 1000 次。

    【讨论】:

    • 最终的命令看起来像qqoThis is the line to add&lt;ESC&gt;jjjq 并且可能是333@q (1000 / 3 = 333)
    • @Sam Vim 将在宏到达文件末尾时立即停止运行。
    • 如果您想对一行的 end 做任何事情,而不是在第 4 行或类似行之前插入换行符,这也很方便。
    • 或者您可以使用这样的递归宏:qqqqqoThis is the line to add&lt;ESC&gt;jjj@qq@q。我在开头加了3个q先清理寄存器q
    【解决方案3】:
    " insert a blank line every 3 lines
    
    :%s/\v(.*\n){3}/&\r          
    
    : .............. command
    % .............. whole file
    s .............. replace
    / .............. start pattern that we will replace
    \v ............. very magic mode, see :h very-magic
    (.*\n) ......... everything including the line break
    {3} ............ quantifier 
    / .............. start new pattern to replace
    & .............. corresponds to the pattern sought in (.*\n)
    \r ............. add line break
    

    来源:http://www.rayninfo.co.uk/vimtips.html

    【讨论】:

      【解决方案4】:

      我会这样做:

      :%s/^/\=(line(".")%4==0?"\n":"")/g
      

      如果您的要求更改为“*每 700 行添加一个新的空白行*s”,则此方法有效:) 您只需更改“4”

      附:如果我需要这样做,我不会在 vim 中这样做。 sed、awk 可以更简单。

      【讨论】:

      • 你能解释一下每个 cmd 代表什么吗?
      • ^ 表示行首。我们将当前行数的 Mod 乘以 4,如果它为真(等于 0),它将新行作为替代,否则它不使用任何“”。
      最近更新 更多