Например, если у меня есть какой-то код вроде:
foo = bar("abc", "def", true, callback);
Есть ли хорошая команда для перехода в 1-ю или 2-ю позицию, оставляя запятыми нетронутыми?
PS в качестве бонуса мой друг хочет знать, работает ли это и в Emacs.
Если в 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 , который должен делать именно то, что вы хотите, и может обрабатывать ситуации, которые невозможно реализовать ни одним из вышеперечисленных методов.
Вам нужна команда 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. Так что извините за это.
Я не знаю ответа для vi, но в Emacs, transpose-sexps
(C-M-t) поменяет местами два аргумента по обе стороны от курсора. На самом деле transpose-words
(M-t) было моим первым предположением, но это оставляет кавычки позади.
Если вы хотите сделать это как рефакторинг, а не просто как манипуляции с текстом, я бы посоветовал изучить Xrefactory , инструмент рефакторинга для Emacsen (бесплатно для C / Java, коммерческий для C ++).