vim在多行上复制和粘贴不同长度的字符
我有以下shell脚本:vim在多行上复制和粘贴不同长度的字符,vim,Vim,我有以下shell脚本: STORAGE_PORT='7000' API_PORT='10000' CLIENT_PORT='9042' 我希望它成为: STORAGE_PORT='7000' API_PORT='10000' CLIENT_PORT='9042' STORAGE_PORT:STORAGE_PORT API_PORT:API_PORT CLIENT_PORT:CLIENT_PORT vim中有没有一种优雅的方法可以做到这一点?(无需单独复制粘贴每个变量)您可以复制整个块,然
STORAGE_PORT='7000'
API_PORT='10000'
CLIENT_PORT='9042'
我希望它成为:
STORAGE_PORT='7000'
API_PORT='10000'
CLIENT_PORT='9042'
STORAGE_PORT:STORAGE_PORT
API_PORT:API_PORT
CLIENT_PORT:CLIENT_PORT
vim中有没有一种优雅的方法可以做到这一点?(无需单独复制粘贴每个变量)您可以复制整个块,然后用正则表达式替换第二部分:
ggyGGp:,$s/^\v(.*)\=.*/\1:\1/g
但也可以使用各种形式的宏
虽然ggyGGp
是vim用户非常流利地使用的一组命令,但Peter在Ingo的回答下的评论让我记住,这也是一种非常初级的方法(嘿,我还在学习,所以还可以)
:%t0
可能更优雅,它是复制的同义词,%
表示每行,0
表示零行。因此,我的正则表达式解决方案如下所示:
:%t0<cr>o<esc><cr>:,$s/^\v(.*)\=.*/\1:\1/g
:%t0o:,$s/^\v(.*)\=./\1:\1/g
这仍然比Peters Golf solution长8个字符,但我可以接受,因为Golf只适合有钱人。您可以使用
:global
迭代所有行(从变量开始;然后我们可以通过gn
命令重用搜索模式进行捕获),并附加到(大写)我们使用换行符预先初始化的寄存器,因此寄存器是按行的,每个添加的变量用换行符分隔:
:let @a="\n"|g/^\w\+/norm! "Aygn
:put a
代码高尔夫
为了进一步缩短时间,我们可以用一个简单的^
(以便所有行都匹配)替换模式,并使用t=
仅捕获变量:
:let @a="\n"|g/^/norm! "Ayt=
:put a
虽然我真的很喜欢其他答案中描述的简洁方式,但这里有一个更逐步的解释 首先将3行复制到新位置 然后目视选择它们。转到第一行,点击
Vjj
<代码>V开始行视觉,然后向下移动两行
然后点击
:
。光标跳转到命令行,命令行中填充了。我会将光标放在第一行
gg0
然后开始录制宏
qq
然后手动执行第一行
ywjjo<ESC>pa:<ESC>p0kk
然后重复宏两次,或根据需要重复多次
@q@q
虽然这是一个有趣的方法,它回答了标题中的问题,但我必须告诉你,它不会产生期望的输出。然而,这是实现所需输出的有效第一步,我非常喜欢将寄存器
和put
逻辑添加到文件末尾的想法,必须记住这一点!谢谢你@多克托罗斯瓦尔多:你说得对,它不会一直走下去。我将变量的加倍和不同的分隔符视为示例的特殊性,而不是泛化的一部分。更多信息::%t0o:,$norm ywwC:0
@PeterRincker这是一个非常好的解决方案,我尝试了类似的方法,但就是记不起
,昨天天气不好。。。但是,没有理由监督:t
命令头->表。谢谢你,现在我的答案看起来不再像是有人用大手指砸碎了g
键了!工会似乎有一个更短的高尔夫:ggqywjjopa:p-kq@q@qo
这比我的答案解释得更好,但几乎相同ggyGGp
将行复制到底部<代码>:,$
是一个范围,在这种情况下,这个范围与您的“将其更改为“compact”如何?我的也较短:)没有关系,没有不好的感觉。正如我所说,你的补充信息可能会帮助询问的人。我只是想指出,在vim中有很多方法可以做到完全相同,你必须检查其他答案,否则我们会有300种不同的正则表达式模式(当然,如果你认为你的更好,并解释为什么它更好,这是非常好的)。祝你今天愉快gg
就足够了,不需要gg0
。否则这是一个很好的解决方案。0k
可能会被-
替换。请参见:h-
。我发现-
、+
和
对于创建好的可重复宏非常有帮助。我不知道%t,谢谢!这里没有特别寻找高尔夫解决方案。
q
@q@q