2010-08-16 51 views
11

例如獎勵積分,如果我有這樣一些代碼:是否有一個很好的Vi(m)命令來調用函數調用中的參數?爲Emacs

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

是否有一個很好的命令移動真到了第一或第二的位置離開逗號完好?

P.S作爲獎金我的朋友想知道這是否也適用於Emacs。

+1

雖然這是HTTP的副本://堆棧溢出。com/q/1270278/719547,這裏有不同而且很好的答案,而且已經有幾年了,所以我不確定什麼是投票結束禮節。無論如何,請檢查該問題。我發佈了[一個答案](http://stackoverflow.com/a/21487681/719547)那裏有一個插件來處理這個問題。 – 2014-01-31 18:46:11

回答

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/ 

開括號後,這個會發現前兩個參數和交換他們。

更新

一個搜索vim.org的發現swap parameters插件,它應該做的正是你想要的,可以處理的情況,要麼上述方法不能。

+0

非常好,但是這不會在第二個參數上起作用。 – carl 2010-08-16 07:05:35

+0

如果您想與最後一個參數交換,您需要先取得逗號。例如。將光標放在「def」後面的逗號中,輸入'dt,'刪除第二個逗號和第三個參數,然後選擇'ep'或't)p'到最後一個參數的末尾並粘貼。我很想知道一個簡單的方法來交換第一個和最後一個參數,這是我目前正在尋找的煩人案例,所以感謝插件參考。 – 2012-05-15 23:26:55

18

我不知道vi的答案,但在Emacs中,transpose-sexpsC-M-t)將交換光標兩側的兩個參數。其實transpose-wordsM-t)是我的第一個猜測,但是留下了引號。

+1

transpose-sexps也適用於bar((1 + 2),「hi」)這樣的參數,但仍然無法處理bar(1 + 2,「hi」)。當然我懷疑任何簡單的東西都可以解決任意複雜參數列表的一般情況。 – 2010-08-17 14:04:32

1

您需要一個轉置emacs命令。但它僅限於不考慮它在列表中的移位,它只考慮文本(它不能猜測列表的第1個,第2個詞)。嘗試這個。

將光標保持在逗號之後。使用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的傢伙。所以很抱歉。

0

如果你想做這個重構,而不僅僅是文本操作,我會建議尋找Xrefactory,Emacsen的重構工具(免費的C/Java,C++商業版)。

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 
相關問題