代码之家  ›  专栏  ›  技术社区  ›  davetapley

将一系列行追加到另一系列行的末尾

vim
  •  2
  • davetapley  · 技术社区  · 15 年前

    下面是vim中的一个缓冲区示例:

    fooooo
    bar
    pippy
    
    one
    two
    three
    

    以下是我想制作的:

    foooooone
    bartwo
    pippythree
    

    理想情况下,通过指定行号的两个范围,但是命令序列也很好。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Don Reba    15 年前

    在这种情况下,我通常会录制这样的宏: qq4j^y$4k$pjq . 它的作用是:从第一个列表中的一个项开始,向下到第二个列表,复制一个项,返回,然后将该项粘贴到行的末尾。最后,它移到第一个列表的第二个项目。执行此宏三次( 3@q )产生期望的结果。

        2
  •  2
  •   Michael    15 年前

    以下是vim脚本解决方案:

    fun MergeLines(start1, start2, length)
        let end1 = a:start1 + a:length - 1
        let end2 = a:start2 + a:length - 1
        let starting_lines = getline(a:start1, end1)
        let ending_lines = getline(a:start2, end2)
    
        " Append each line in ending_lines to starting_lines.
        let i = 0
        while i < linecount
            let starting_lines[i] .= ending_lines[i]
            let i += 1
        endw
    
        " Set the new lines.
        call setline(a:start1, starting_lines)
    
        " Delete the old ones (there should be a function for this...).
        exe a:start2 . ',' . end2 . 'del'
    endf
    

    为了完成你的例子:

    :call MergeLines(1, 4, 3)
    
        3
  •  1
  •   jamessan    15 年前

    vim的寄存器有一个与之相关的模式: characterwise, linewise blockwise . 这会影响粘贴寄存器内容时如何将寄存器内容放入缓冲区。你可以利用这个来解决这个问题。

    将光标放在 one 行并使用视觉块模式选择这些行:
    CTRL+V $ J J
    删除块:
    X
    将光标移到 foo 行并粘贴您刚刚删除的内容:

        4
  •  1
  •   Seth Johnson    15 年前

    由于第一个组都具有相同的行长度,因此可以将块选择与 <C>-v . 从选定的第二个块的第一个字符开始,

    <C>-v } $ d { $ p
    

    因此,在“块”模式下选择整个底部部分,移动到第一个块开始的行的末尾,然后粘贴。

        5
  •  1
  •   rampion    15 年前

    好的,那么从拉或者移除你想放在末端的三条线开始(例如。 5G3dd )然后:

    :let lines=split(@","\n")
    

    这会将所有这些行放入字符串列表中(例如 ['one', 'two', 'three'] )

    现在选择要附加到的行(例如 1GV2j )然后

    :'<,'>s/$/\=remove(lines,0)
    

    这将替换每行的结尾( /$/ )在选定范围内( '<,'> )下一行从行列表的前面取消( \=remove(lines,0) )

    如果您发现自己经常这样做,您可能需要将上述命令绑定到单个命令中。