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

Sam*_*ron 22 vim

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

例如,我想改变:

call "hello mister 123", 2343
Run Code Online (Sandbox Code Playgroud)

至:

call 2343, "hello mister 123" 
Run Code Online (Sandbox Code Playgroud)

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

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

call "hello, world" , "goodbye, world"
Run Code Online (Sandbox Code Playgroud)

Bri*_*per 17

这个正则表达式将为您的示例做到:

:s/\vcall ("[^"]+"|[^,]+)\s*,\s*("[^"]+"|[^,]+)/call \2, \1/
Run Code Online (Sandbox Code Playgroud)

如果您在其中一个参数中转义了引号和此类内容,则此正则表达式将需要逐渐变得更加讨厌.

实际上,我只是突出显示一个参数(在可视模式下),点击d,突出显示其他参数,然后点击p; Vim会很好地粘贴寄存器中的内容,覆盖突出显示的内容,并将删除的文本交换到寄存器中.然后移动光标p再次点击.突出显示,d突出显示,p移动光标,p是一种常见的组合,至少在我的vimming中.

所以将光标放在行的开头,第一个例子:

wva"dlvawpF,P
Run Code Online (Sandbox Code Playgroud)

含义移过单词"call"(w),突出显示带引号的字符串(va"),删除它(d),向右移动一个空格(l),突出显示单词(vaw),粘贴(p),向后移动到逗号(F,),在它之前粘贴(P).

第二个例子:

wva"dlva"p_f,P
Run Code Online (Sandbox Code Playgroud)

一旦习惯了移动命令,这并不难.


Jim*_*art 6

查看sideways.vim,一个@AndrewRadev的插件.它可以处理移动参数和其他分隔列表项,具有一些很好的功能,例如将嵌套列表作为单个单元移动.它也处理没有括号的Ruby风格的方法调用.非常便利.