Ответ 1
Здесь script, предназначенный для замены параметров в скриптах python, вы можете его адаптировать.
Каков наиболее эффективный способ обмена двумя параметрами для вызова метода в Vim?
Например, я хочу изменить:
call "hello mister 123", 2343
в
call 2343, "hello mister 123"
(Предположим, что курсор находится в начале строки.)
В идеале трюк работает для таких вещей, как
call "hello, world" , "goodbye, world"
Здесь script, предназначенный для замены параметров в скриптах python, вы можете его адаптировать.
Это регулярное выражение сделает это для ваших примеров:
:s/\vcall ("[^"]+"|[^,]+)\s*,\s*("[^"]+"|[^,]+)/call \2, \1/
Это регулярное выражение должно становиться все более неприятным, если вы избегаете кавычек и таких вещей в одном из ваших параметров.
В действительности, я бы выделил один параметр (в визуальном режиме), нажмите d
, выделите другой параметр и нажмите p
; Vim красиво вставляет то, что в регистре, перезаписывает то, что вы выделили, и свопите удаленный текст в регистр. Затем переместите курсор и снова нажмите p
. Выделите, d
, выделить, p
, переместить курсор, p
- это общая комбинация, по крайней мере, в моем обрезании.
Итак, с курсором в начале строки, первый пример:
wva"dlvawpF,P
Значение переместится через слово "вызов" (w
), выделите строку с кавычками (va"
), удалите ее (d
), переместите одно пространство вправо (l
), выделите слово (vaw
), вставить (p
), переместить назад в запятую (F,
), вставить перед ним (p
).
Второй пример:
wva"dlva"p_f,P
Это не сложно, если вы привыкнете к командам перемещения.
Отметьте sideways.vim, плагин @AndrewRadev. Он может обрабатывать движущиеся параметры и другие элементы с ограниченным списком вокруг, с некоторыми хорошими функциями, такими как перемещение вложенных списков в виде одного элемента. Он также обрабатывает вызовы методов в стиле Ruby без круглых скобок. Очень удобно.
Если ваши аргументы находятся между скобками, например:
function ($argument1 = null, 'argument2') {
...
}
поместите курсор в любом месте скобки и:
va(:s/\\%V(\\@<=\\s*\\(.\\+\\),\\s*\\(.\\+\\)\\%V\\s*/\\2, \\1/g
:%s:call \(".*"\)\s\?,\(.*\):call \2,\1:g