在Vim中为方法调用交换两个参数的最有效方法是什么?
例如,我想改变:
call "hello mister 123", 2343
为:
call 2343, "hello mister 123"
(假设光标位于该行的开头。)
理想情况下,该技巧适用于像
这样的东西call "hello, world" , "goodbye, world"
答案 0 :(得分:16)
此正则表达式将为您的示例执行此操作:
:s/\vcall ("[^"]+"|[^,]+)\s*,\s*("[^"]+"|[^,]+)/call \2, \1/
如果您在某个参数中转义了引号和此类内容,则此正则表达式将需要逐渐变得更加讨厌。
实际上,我只是突出显示一个参数(在可视模式下),点击d
,突出显示另一个参数,然后点击p
; Vim会很好地粘贴寄存器中的内容,覆盖突出显示的内容,并将删除的文本交换到寄存器中。然后移动光标并再次点击p
。突出显示,d
,突出显示,p
,移动光标,p
是一种常见的组合,至少在我的vimming中。
所以将光标放在行的开头,第一个例子:
wva"dlvawpF,P
含义移过单词“call”(w
),突出显示引用的字符串(va"
),删除它(d
),向右移动一个空格({{ 1}}),突出显示一个单词(l
),粘贴(vaw
),向后移动到逗号(p
),粘贴到它前面(F,
)。< / p>
第二个例子:
P
一旦习惯了移动命令,这并不难。
答案 1 :(得分:5)
通过sideways.vim查看@AndrewRadev插件。它可以处理移动参数和其他分隔列表项,具有一些很好的功能,例如将嵌套列表作为单个单元移动。它也处理没有括号的Ruby风格的方法调用。非常方便。
答案 2 :(得分:3)
答案 3 :(得分:1)
如果你的论点在括号之间,就像这里:
function ($argument1 = null, 'argument2') {
...
}
将光标放在括号内的任何位置:
va(:s/\\%V(\\@<=\\s*\\(.\\+\\),\\s*\\(.\\+\\)\\%V\\s*/\\2, \\1/g
答案 4 :(得分:0)
:%s:call \(".*"\)\s\?,\(.*\):call \2,\1:g