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

时间:2019-01-09 13:00:50

标签: 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中有一种优雅的方法吗? (无需单独复制粘贴每个变量)

4 个答案:

答案 0 :(得分:1)

我会将光标放在第一行

gg0

然后开始录制宏

qq

然后手动执行第一行

ywjjo<ESC>pa:<ESC>p0kk

并停止录制宏

q

然后重复两次宏,或根据需要重复

@q@q

答案 1 :(得分:0)

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

ggyGGp:,$s/^\v(.*)\=.*/\1:\1/g

但是您也可以使用各种形式的宏

尽管ggyGGp是vim用户非常流畅地使用的一组命令,但是Peter在Ingo的回答下的评论让我记住,这也是一个相当新手的方法(嘿,我仍然学习,没关系)。

:%t0可能更优雅,t是复制的同义词,%表示每一行,0表示从零开始。所以我的正则表达式解决方案看起来像这样:

:%t0<cr>o<esc><cr>:,$s/^\v(.*)\=.*/\1:\1/g

这仍然比Peters Golf解决方案长8个字符,但我可以接受,因为高尔夫仅用于豪华和富人。

答案 2 :(得分:0)

您可以使用:global遍历所有行(以变量开头;然后我们可以稍后通过gn命令重新使用搜索模式进行捕获),并追加到我们用换行符预初始化的(大写)寄存器,因此该寄存器是 linewise ,并且每个添加的变量都用换行符分隔:

:let @a="\n"|g/^\w\+/norm! "Aygn
:put a

高尔夫代码

为了进一步简化,我们可以用简单的^替换模式(以便所有行都匹配),然后使用t=来捕获变量:

:let @a="\n"|g/^/norm! "Ayt=
:put a

答案 3 :(得分:0)

虽然我真的很喜欢其他答案中描述的紧凑方式,但是这里有逐步的解释。

首先将3行复制到新位置。

然后直观地选择它们。转到第一行,然后点击VjjV开始逐行显示,然后向下移动两行。

然后点击:。光标跳至命令行,该命令行由'<,'>填充。这意味着该命令将仅在视觉选择的行上执行(请参见:help v_:)。然后输入命令

'<,'>s/^\([^=]*\)=.*$/\1:\1/

这与从行首(^)到=字符之前的变量名匹配,并存储为“组1”(\(...\)表示组)。然后也匹配到行尾(.*$)。替换将整个行替换为“组1”(\1),后跟:,然后再次是“组1”。