将一行范围附加到另一行范围的末尾

时间:2010-03-26 16:57:58

标签: vim

以下是vim中的示例缓冲区:

fooooo
bar
pippy

one
two
three

以下是我想要制作的内容:

foooooone
bartwo
pippythree

理想情况下,通过指定两个行号范围,但一系列命令也会很棒。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

这是一个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)

答案 2 :(得分:1)

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

将光标放在one行的开头,并使用可视块模式选择这些行:
CTRL + V $ Ĵ Ĵ
删除块:
X
将光标移动到foo行的末尾并粘贴刚删除的内容:
P

答案 3 :(得分:1)

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

<C>-v } $ d { $ p

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

答案 4 :(得分:1)

好的,首先是你想要放置或删除你想要放在最后的三行(例如5G3dd)。然后:

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

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

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

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

这将替换所选范围(/$/)中每一行('<,'>)的结尾,而下一行未移位到行列表(\=remove(lines,0))的前面。

如果您发现自己这么做了,可能需要将上述命令绑定到一个命令中。