以下是vim中的示例缓冲区:
fooooo
bar
pippy
one
two
three
以下是我想要制作的内容:
foooooone
bartwo
pippythree
理想情况下,通过指定两个行号范围,但一系列命令也会很棒。
答案 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, linewise和blockwise。这会影响在粘贴寄存器内容时如何将寄存器的内容放入缓冲区。你可以利用这个来解决这个问题。
将光标放在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)
)的前面。
如果您发现自己这么做了,可能需要将上述命令绑定到一个命令中。