是否有一个很好的Vi(m)命令用于在函数调用中转置参数? Emacs的奖励积分

时间:2010-08-16 05:53:55

标签: vim emacs keyboard-shortcuts

例如,如果我有一些代码:

foo = bar("abc", "def", true, callback);

是否有一个很好的命令可以将真实移动到第一或第二位置,使逗号保持不变?

作为奖励,我的朋友想知道这是否也适用于Emacs。

5 个答案:

答案 0 :(得分:19)

在Vim中,如果您将光标放在第一个单词的开头并执行dWWP,那么它将具有所需的效果。这是一个细分:

dW   delete the current word, including the comma and the following whitespace
W    move to the start of the next word
P    insert the deleted text before the cursor

如果在要交换的对之后还有其他参数,这将有效 - 如果只有两个参数或者您想要交换最后两个参数,则需要修改它,因为它将在结束括号后粘贴文本

或者你可以使用正则表达式替换:

:%s/(\([^,]\+\),\s*\([^,)]\+\)/(\2, \1/ 

这将在open括号后找到前两个参数并交换它们。

<强>更新

搜索vim.org时发现了swap parameters插件,该插件可以完全按照您的意愿执行,并且可以处理上述任何一种方法都无法解决的情况。

答案 1 :(得分:18)

我不知道vi的答案,但在Emacs中,transpose-sexps C-M-t )将交换光标两侧的两个参数。实际上transpose-words M-t )是我的第一个猜测,但这留下了引号。

答案 2 :(得分:1)

您需要转置emacs命令。但它仅限于不猜测它在列表中的转置,它只考虑文本(它不能猜测列表的第1个,第2个字)。试试这个。

将光标放在逗号为true之后。使用M-x transpose-words。默认情况下,它将从该点转换下一个单词。快捷方式是M-t

您可以使用C-u 2 M-t进行转置,然后使用下一个单词。

现在回答你的问题。如果您想将true,向后移动1个单词,请使用C-u -1 M-t,向后移动2个单词C-u -2 M-t

我不是VIM的人。对不起那就好了。

答案 3 :(得分:0)

如果您想将此作为重构而不仅仅是文本操作,我建议查看Xrefactory,这是Emacsen的重构工具(C / Java免费,C ++商业版)。

答案 4 :(得分:0)

转置上一个(Ctrl-t p)和下一个(Ctrl-t n)参数...添加 跟随你的.vimrc文件:

map <C-t>p ?,\\|(<CR>wd/,\\|)<CR>?,\\|(<CR>"_dw?,\\|(<CR>a, <C-c>?,<CR>P/,<CR>w
map <C-t>n ?,\\|(<CR>wv/,<CR>d"_dw/\\,\\|)<CR>i, <C-r>"<C-c>?,<CR>?,\\|(<CR>w