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

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

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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

Вам нужна команда transpose emacs. Но его ограничение не догадывается, что его перенос в списках он рассматривает только текст (он не может угадать первое, второе слово списка). Попробуйте это.

Сохраняйте курсор после запятой. Используйте 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. Так жаль, что это.

Ответ 4

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

Ответ 5

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