如何在vim中有效地切换参数

时间:2014-06-24 11:15:07

标签: vim

在vim中编辑文件时遇到一种情况,我仍然没有找到一种方法以vim方式快速完成。在编辑函数调用时,我会错误地将我的参数置于错误的顺序。

anyFunction(arg2, arg1)

到达这种情况时,我必须找到arg2 /删除它/在')'之前附加它/处理','/ etc。

快速完成此任务不是更好的方法吗?我对任何想法(宏/快捷方式/插件)都持开放态度,即使我宁愿采用“仅限vim”的方式来实现这一目标

6 个答案:

答案 0 :(得分:3)

你需要两件事:

  1. 文本对象以快速选择参数(因为它们并不像您的示例中那样简单)。 argtextobj plugin(我改进的前叉here)执行此操作。
  2. 虽然您可以使用删除+视觉模式+粘贴+返回+粘贴,但交换文本的插件使这更容易。我的SwapText plugin或已经提到的exchange plugin都可以完成这项工作。

答案 1 :(得分:2)

将此映射放在_vimrc中。

 " gw : Swap word with next word 
 nmap <silent> gw :s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l>

然后在正常模式下,光标在arg1中的任何位置键入gw以交换参数

 anyFunction(arg1, arg2)

说明: -

arg1分隔符(这里是逗号)和arg2放入regexp内存1 2 3

替补将他们反转为3 2 1

Control-O返回上一个位置

Control-L重绘屏幕

请注意,分隔符是任何非字母数字字符或字符串e,g空格

答案 2 :(得分:2)

我会推荐一个插件:vim-exchange:

https://github.com/tommcdo/vim-exchange

答案 3 :(得分:2)

我实际上制作了一个插件来处理名为argumentative.vim的确切情况。 (对不起插头。)

Argumentative.vim提供以下映射:

  • [,],动作将转到上一个或下一个参数
  • <,>,向左或向右移动参数
  • i,a,参数文本对象。例如da,ci,yi,

因此,使用此插件,您可以移至相关参数,然后根据需要多次执行<,>,。它也可以计算,例如2>,

如果Tim Pope的优秀repeat.vim插件安装<,>,可以通过.命令重复使用。

答案 4 :(得分:1)

这是正则表达式搜索和替换的完美用法。

你想找到“anyFunction(”,然后将任何东西交换到','以及从','到'')的任何内容。这是相当简单的,使用[^,]*表示“任何直到','”和[^)]*表示“任何直到'的')'”。使用\(...\)来捕获每件事物,并使用\1\2来指代替换中的内容:

:s#anyFunction(\s*\([^,]*\),\s*\([^)]*\)#anyFunction(\2, \1#g

请注意我如何使用\s*来允许“anyFunction(”和第一件事之间以及','和第二件事之间的任何空格。

如果您希望能够跨越多行,则可以使用\_s代替\s,如果要维护多行格式,则捕获空格:

:s#anyFunction(\(\_s*\)\([^,]*\),\(\_s*\)\([^)]*\)#anyFunction(\1\4,\3\2#g

还有[...]个集合的多行变体,例如\_[^,]表示“除了','之外的任何内容(甚至是新行),”如果你可以在模式中使用你的用例需要它。

有关详细信息,请参阅以下帮助主题:/\s/\_s/\1/\(/[

如果要在每个位置使用更通用的映射,可以使用正则表达式中的光标位置,而不是键入函数名称。使用\%#匹配正则表达式中的光标位置,如下所示:http://vim.wikia.com/wiki/Exchanging_adjacent_words

答案 5 :(得分:0)

类似于Peter Rincker所建议的(议论),sideways也是你所描述的。

相关问题