在vim中编辑文件时遇到一种情况,我仍然没有找到一种方法以vim方式快速完成。在编辑函数调用时,我会错误地将我的参数置于错误的顺序。
anyFunction(arg2, arg1)
到达这种情况时,我必须找到arg2 /删除它/在')'之前附加它/处理','/ etc。
快速完成此任务不是更好的方法吗?我对任何想法(宏/快捷方式/插件)都持开放态度,即使我宁愿采用“仅限vim”的方式来实现这一目标
答案 0 :(得分:3)
你需要两件事:
答案 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:
答案 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也是你所描述的。