重构代码时,能够交换函数参数将很有用。

更改例如:

func(foo[0], bar(), baz.spam)




func(baz.spam, foo[0], bar())


是否有某种方法可以向左/向右交换参数,将函数括号和逗号保留在适当的位置?如果您想考虑参数本身就是带有自己参数的函数调用的参数,则需要花费很多精力-例如:func(baz->spam, foo[0], bar(a, b, c))-支持这些情况可能会涉及到更全面的解析。

#1 楼

没有插件


|指示光标位置


func(foo[0], bar(), |baz.spam)


步骤:



dt)将删除baz.spam


Ff将光标移至foo[0]中的字符f


vt,p将删除foo [0]并将其替换为baz.spam


$P会将foo [0]粘贴在括号之前
对其他任何步骤重复步骤1-4。

使用插件



vim-argumentative:提供用于移动函数自变量的文本对象(默认映射:<,>,)。Tom McDonald的vim-exchange:提供方便的映射以交换两个选择(默认映射:在正常模式下为cx,在可视模式下为X)。Andrew Radev的vim-sideways:左右移动函数参数(以及其他按某项分隔的项)(默认映射) :NA)。

通过machakann的vim-swap:对定界项目进行重新排序(默认映射: g<g>)。


评论


非插件解决方案非常适合这种情况...

– elyashiv
2015年2月8日,12:55

@elyashiv的想法是,您可以对任何函数参数使用类似的技术。基本上,拉一个单词,从视觉上选择另一个单词,粘贴,Vim将把已删除的字符拉到寄存器中,然后粘贴到第一次拉出的位置。

–akshay
2015年2月8日,12:57

+1为vim-sideways!最后一部分描述了一个非常不错的功能:cia到“参数更改”。 ❤️

–马丁·考特(Martijn Courteaux)
18年3月14日在16:30

#2 楼

我介绍了3种方法。前两个是特殊情况,需要较少的击键。最后一个是通用的。
|表示光标位置。

交换相邻的参数(对后两个无效)
function func(foo[0], |bar(), baz.spam, qux->norf)

步骤:


dW删除当前单词(参数)

W转到下一个参数的第一个字符

P将光标粘贴到光标之前

交换最后两个参数
function func(foo[0], bar()|, baz.spam, qux->norf)

步骤:


dt,删除直到下一个逗号

E转到最后下一个参数的字符

P粘贴到光标之前

交换任意两个参数
function func(|foo[0], bar(), baz.spam, qux->norf)

步骤:


vt,d直观地删除,直到逗号

W几次,直到到达要与之交换的参数为止。

gP在光标之前粘贴并在粘贴内容后将光标放在char

dt,删除,直到下一个逗号为止。如果这是最后一个参数,则将,替换为)

`<返回最后一个可视区域的开头(光标将置于逗号处)

P在光标


编辑:如@ aharris88所指出的,OP希望最后一个参数为第一个,并将所有其他参数向右移动。
function func(foo[0], bar(), baz.spam|, qux->norf)

步骤:


dw删除,␣


dt)删除最后一个参数

%p跳转至开头括号并粘贴最后一个参数

a,␣插入逗号和空格
<Esc>返回正常模式

或者,如果您不想退出正常模式:


"rdw删除,␣到寄存器r


dt)删除最后一个参数

%p跳转到打开括号并粘贴最后一个参数

"rp粘贴寄存器r的内容



奖金:每种情况下的GIF:
swap1,swap2,swap3和rotate

评论


尽管此答案确实交换了参数,但并未回答问题,即如何将最后一个参数移到开头。

–aharris88
2015年2月9日在18:38

@ aharris88,你是对的。我编辑了答案。

–贡萨洛·里贝罗(GonçaloRibeiro)
2015年2月9日在19:30