vim fu,交换方法调用的参数

时间:2009-08-13 06:04:01

标签: vim

在Vim中为方法调用交换两个参数的最有效方法是什么?

例如,我想改变:

call "hello mister 123", 2343

为:

call 2343, "hello mister 123" 

(假设光标位于该行的开头。)

理想情况下,该技巧适用于像

这样的东西
call "hello, world" , "goodbye, world"

5 个答案:

答案 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