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

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

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

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

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

11
задан Vadim Kotov 14 August 2017 в 12:51
поделиться

4 ответа

Если в 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/ 

Это найдет первые два аргумента после открытой скобки и поменяет их местами.

update :

При поиске на vim.org был обнаружен плагин swap parameters , который должен делать именно то, что вы хотите, и может обрабатывать ситуации, которые невозможно реализовать ни одним из вышеперечисленных методов.

19
ответ дан 3 December 2019 в 01:38
поделиться

Вам нужна команда transpose 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. Так что извините за это.

1
ответ дан 3 December 2019 в 01:38
поделиться

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

18
ответ дан 3 December 2019 в 01:38
поделиться

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

0
ответ дан 3 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: