繁体   English   中英

如何在一个命令中复制匹配模式的行,并修改第二行?

[英]How can I duplicate lines matching a pattern, and modify the second line, all in one command?

我正在尝试使用VIM作为编辑器向java类添加属性。 因此,我认为我可以使用命令来简化我的工作,使用所有样板代码。 例如:

所有包含“atributeA”的行,就像这一行一样

this.attributeA=attributeA //basic constructor

应该变成

this.attributeA=attributeA //basic constructor
this.attributeB=attributeB //basic constructor

可能吗?

将解决方案作为一个单线程作为要求似乎有点奇怪,因为如果您愿意,您可以将任何按键序列或任何函数或命令分配给Vim中的按键。

话虽如此,这种类型的东西是Vi的面包和黄油。 尝试:

:g/attributeA/ copy . | s//attributeB/g

哪里

:g/pattern/ command1 | command2 | ...

在每个匹配pattern行上执行命令(参见:help :global ),

copy .

复制当前行(请参阅:help :copy )匹配:g到地址后面. (意思是当前行),和

s/pattern/replacement/g

然后在当前行上执行替换(请参阅:help :substitute ),即您刚刚创建的副本。 最后的g标志导致对行中的所有匹配模式执行替换,而不仅仅是第一个。 另请注意,我将搜索模式留空:Vim将记住上一个:global:substitute命令中使用的最后一个搜索模式,以方便使用。

您的确切样本很容易实现:

yy
p
:s/A/B/g

但是你完全有可能想要更通用的东西。 如果是这种情况,您应该编辑您的问题。

看看这个功能:

function AddAttribute()
    exe "/this.attributeA=attributeA;"
    exe "normal yyp"
    exe "s/attributeA/" . input('New attribute: ') . "/g"
endfunction

当您调用函数call AddAttribute() ,系统将提示您输入一个新属性,该属性将在您的示例中添加。 您可以使用以下内容绑定密钥:map <F5> :call AddAttribute<CR>这样您只需按F5即可添加此行。

编辑

如果你想复制带有attributeA所有行(这对我来说没有意义),你可以用这个映射做到这一点( ^MCTRL + v然后回车 ):

:map <F5> :call inputsave()\|let newAttribute=input('new attribute: ')\|:call inputrestore()\|:g/attributeA/exe "normal! yyp"\|exe ":s/attributeA/" . newAttribute . "/g"^M

当您按F5时 ,系统会提示您输入新属性,并且包含attributeA等效行将被复制并替换为您的输入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM