Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vim在多行上复制和粘贴不同长度的字符_Vim - Fatal编程技术网

vim在多行上复制和粘贴不同长度的字符

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中有没有一种优雅的方法可以做到这一点?(无需单独复制粘贴每个变量)您可以复制整个块,然

我有以下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中有没有一种优雅的方法可以做到这一点?(无需单独复制粘贴每个变量)

您可以复制整个块,然后用正则表达式替换第二部分:

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