Есть ли хорошая команда Vi (m) для транспонирования аргументов в вызове функции? Бонусные баллы за Emacs - PullRequest
11 голосов
/ 16 августа 2010

Например, если у меня есть какой-нибудь код вроде:

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

Есть ли хорошая команда для перехода в 1-ю или 2-ю позицию true, оставляя запятыми нетронутыми?

PS в качестве бонусамой друг хочет знать, работает ли это и в Emacs.

Ответы [ 5 ]

19 голосов
/ 16 августа 2010

В 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 обнаружил плагин Параметры обмена , который должен делать именно то, что вам нужно, и может обрабатывать ситуации, которые ни один из перечисленных выше методов не может.

18 голосов
/ 16 августа 2010

Я не знаю ответа для vi, но в Emacs transpose-sexps ( C-M-t ) поменяет два аргумента по обе стороны от курсора. На самом деле transpose-words ( М-т ) было моим первым предположением, но это оставляет кавычки.

1 голос
/ 16 августа 2010

Вам нужна команда транспонирования 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 голосов
/ 31 октября 2013

Транспонирование предыдущего (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
0 голосов
/ 16 августа 2010

Если вы хотите сделать это как рефакторинг, а не просто как манипулирование текстом, я бы посоветовал изучить Xrefactory , инструмент рефакторинга для Emacsen (бесплатный для C / Java, коммерческий для C ++).

...