我想在Vim中合并两个线块,即取线n..m并将它们附加到线条上a..b.如果您更喜欢伪代码解释:[a[i] + b[i] for i in min(len(a), len(b))]
例:
abc
def
...
123
45
...
Run Code Online (Sandbox Code Playgroud)
应该成为
abc123
def45
Run Code Online (Sandbox Code Playgroud)
没有手动复制和粘贴,有没有一种很好的方法可以做到这一点?
ram*_*ion 880
你当然可以通过一次复制/粘贴(使用块模式选择)完成所有这些,但我猜这不是你想要的.
如果您只想使用Ex命令执行此操作
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
Run Code Online (Sandbox Code Playgroud)
会改变
work it
make it
do it
makes us
harder
better
faster
stronger
~
Run Code Online (Sandbox Code Playgroud)
成
work it harder
make it better
do it faster
makes us stronger
~
Run Code Online (Sandbox Code Playgroud)
更新:这个许多赞成票的答案值得更彻底的解释.
在Vim中,您可以使用管道字符(|)来链接多个Ex命令,因此上述内容相当于
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Run Code Online (Sandbox Code Playgroud)
许多Ex命令接受一系列行作为前缀参数 - 在上面的例子中,5,8在指定命令操作的行之前del和1,4之前s///.
del删除给定的行.它可以采用一个寄存器参数,但是如果没有给出,它会将这些行转储到未命名的寄存器,@"就像在正常模式下删除一样. let l=split(@")然后使用默认分隔符:空格将已删除的行拆分为列表.要在已删除行中包含空格的输入上正常工作,例如:
more than
hour
our
never
ever
after
work is
over
~
Run Code Online (Sandbox Code Playgroud)
我们需要指定一个不同的分隔符,以防止"work is"被分成两个列表元素:let l=split(@","\n").
最后,在替换中s/$/\=remove(l,0)/,我们用$表达式的值替换每一行()的结尾remove(l,0). remove(l,0)改变列表l,删除并返回其第一个元素.这使我们可以按照读取它们的顺序替换删除的行.我们可以使用相反的顺序替换删除的行remove(l,-1).
ib.*_*ib. 58
优雅而简洁的Ex命令解决的问题可以通过组合获得:global,:move和:join命令.假设第一行的行在缓冲区的第一行开始,并且光标位于紧接第二块的第一行之前的行上,则命令如下.
:1,g/^/''+m.|-j!
Run Code Online (Sandbox Code Playgroud)
对于所使用的技术的详细说明,请参阅答案我给了这个问题:" Vim的粘贴-d'行为开箱? ".
mli*_*elt 44
要加入行块,您必须执行以下步骤:
jjCTRL-v$CTRL-ENDxkk$p运动不是最好的(我不是专家),但它的工作方式与你想要的一样.希望会有更短的版本.
以下是先决条件,因此这项技术运作良好:
abc和示例中的示例中def)具有相同的长度XORKen*_*ger 19
这是我怎么做的(光标在第一行):
qama:5<CR>y$'a$p:5<CR>dd'ajq3@a
Run Code Online (Sandbox Code Playgroud)
你需要知道两件事:
这是发生了什么:
qa将所有内容记录到下q一个"缓冲区"中a.ma 在当前行上创建一个标记.:5<CR> 去下一组.y$ 猛拉其余部分.'a 返回到先前设置的标记.$p 贴在行尾.:5<CR> 返回第二组的第一行.dd 删除它.'a 回到标记.jq 下降一行,并停止录音.3@a 重复每一行的动作(在我的情况下为3)如其他地方所述,块选择是要走的路.但您也可以使用以下任何变体:
:!tail -n -6 % | paste -d '\0' % - | head -n 5
此方法依赖于UNIX命令行.paste创建该实用程序是为了处理这种行合并.
PASTE(1) BSD General Commands Manual PASTE(1)
NAME
paste -- merge corresponding or subsequent lines of files
SYNOPSIS
paste [-s] [-d list] file ...
DESCRIPTION
The paste utility concatenates the corresponding lines of the given input files, replacing all but the last file's newline characters with a single tab character,
and writes the resulting lines to standard output. If end-of-file is reached on an input file while other input files still contain data, the file is treated as if
it were an endless source of empty lines.
Run Code Online (Sandbox Code Playgroud)