我有以下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中有一种优雅的方法吗? (无需单独复制粘贴每个变量)
答案 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行复制到新位置。
然后直观地选择它们。转到第一行,然后点击Vjj
。 V
开始逐行显示,然后向下移动两行。
然后点击:
。光标跳至命令行,该命令行由'<,'>
填充。这意味着该命令将仅在视觉选择的行上执行(请参见:help v_:
)。然后输入命令
'<,'>s/^\([^=]*\)=.*$/\1:\1/
这与从行首(^
)到=
字符之前的变量名匹配,并存储为“组1”(\(...\)
表示组)。然后也匹配到行尾(.*$
)。替换将整个行替换为“组1”(\1
),后跟:
,然后再次是“组1”。