我尝试使用VIM作为编辑器向java类添加属性。 因此,我认为我可以使用命令来简化我的工作,使用所有样板代码。 例如:
包含" atributeA"的所有行,就像这一行
this.attributeA=attributeA //basic constructor
应该变成
this.attributeA=attributeA //basic constructor
this.attributeB=attributeB //basic constructor
有可能吗?
答案 0 :(得分:6)
将解决方案作为一个单线程作为要求似乎 有点奇怪,因为你可以分配任何序列 击键或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
命令中使用的最后一个搜索模式。
答案 1 :(得分:0)
您的确切样本很容易实现:
yy
p
:s/A/B/g
但是你完全有可能想要更通用的东西。如果是这种情况,你应该编辑你的问题。
答案 2 :(得分:0)
看看这个功能:
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
的所有行(这对我来说没有意义),你可以用这个映射做到这一点(^M
CTRL + 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
的等效行被复制并替换为您的输入。