交换函数参数


19

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

更改为例如:

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

进入

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

有什么方法可以将参数交换到左侧/右侧,并在函数括号和逗号之间保持适当位置?


请注意,如果您要考虑参数本身就是带有自己的参数的函数调用的参数,则可能会变得很func(baz->spam, foo[0], bar(a, b, c))复杂-例如:-支持这些情况可能会涉及一些更全面的解析。

Answers:


23

没有插件

| 指示光标位置

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

脚步:

  1. dt) 将删除 baz.spam
  2. Ff 将光标移至字符f foo[0]
  3. vt,p 将删除foo [0]并替换为 baz.spam
  4. $P 将foo [0]粘贴在括号之前
  5. 对其他任何步骤重复步骤1-4。

带插件

  • VIM-议论彼得Rincker:提供文本对象的走动函数的参数(默认映射:<,>,)。
  • VIM交换汤姆·麦克唐纳:提供方便的映射到交换两个选项(默认映射:cx在正常模式和X视觉模式)。
  • vim-sideways by Andrew Radev:左右移动函数参数(以及其他按某项分隔的项)(默认映射:)NA
  • VIM交换machakann:重新排序分隔的项目(默认映射:g<g>)。

6
非插件解决方案非常适合这种情况……
elyashiv 2015年

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

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

5

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


交换相邻的参数(对后两个无效)

function func(foo[0], |bar(), baz.spam, qux->norf)

脚步:

  1. dW 删除当前单词(参数)
  2. W 转到下一个参数的第一个字符
  3. P 粘贴在光标之前

交换最后两个参数

function func(foo[0], bar()|, baz.spam, qux->norf)

脚步:

  1. dt, 删除直到下一个逗号
  2. E 转到下一个参数的最后一个字符
  3. P 粘贴在光标之前

交换任意两个参数

function func(|foo[0], bar(), baz.spam, qux->norf)

脚步:

  1. vt,d 直观地删除直到逗号
  2. W 几次,直到到达要交换的参数为止
  3. gP 在光标之前粘贴,然后将光标放在粘贴内容之后的字符上
  4. dt,删除直到下一个逗号。如果这是最后一个参数,)则替换为
  5. `< 返回最后一个可视区域的开头(光标将置于逗号处)
  6. P 粘贴在光标之前

编辑:正如@ aharris88所指出的,OP希望最后一个参数为第一个参数,并将所有其他参数正确移动。

向右旋转参数

function func(foo[0], bar(), baz.spam|, qux->norf)

脚步:

  1. dw 删除 ,␣
  2. dt) 删除最后一个参数
  3. %p 跳转到左括号并粘贴最后一个参数
  4. a,␣ 插入逗号和空格
  5. <Esc> 返回正常模式

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

  1. "rdw删除,␣到寄存器r
  2. dt) 删除最后一个参数
  3. %p 跳转到左括号并粘贴最后一个参数
  4. "rp 粘贴寄存器内容 r

奖励:每个情况下,GIF: swap1swap2swap3旋转


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

@ aharris88,你是对的。我编辑了答案。
贡萨洛·里贝罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.