Аргументы функций подкачки


19

При рефакторинге кода было бы полезно поменять аргументы функций.

Изменение, например:

func(foo[0], bar(), baz.spam)

в

func(baz.spam, foo[0], bar())

Есть ли способ поменять местами аргументы влево / вправо, оставив в скобках функции и запятые?


Обратите внимание, что это может стать довольно сложным, если вы хотите учесть аргументы, которые сами по себе являются вызовами функций, со своими собственными аргументами - например: func(baz->spam, foo[0], bar(a, b, c))- поддержка этих случаев, вероятно, потребует некоторого более полного анализа

Ответы:


23

Без плагинов

| указывает на позицию курсора

func(foo[0], bar(), |baz.spam)

шаги:

  1. dt) удалит baz.spam
  2. Ff переместит курсор на символ f в foo[0]
  3. vt,p удалит foo [0] и заменит его на baz.spam
  4. $P вставит фу [0] перед паренсом
  5. Повторите шаги 1-4 для всех остальных.

С плагинами

  • vim-argumentsmension by Peter Rincker : Предоставляет текстовые объекты для перемещения по аргументам функции (сопоставления по умолчанию: <,и >,).
  • vim-exchange от Tom McDonald : предоставляет удобные сопоставления для обмена двумя вариантами выбора (сопоставления по умолчанию: cxв обычном режиме и Xв визуальном режиме).
  • vim-sideway от Andrew Radev : переместить аргументы функции (и другие элементы, разделенные чем-то) влево и вправо (отображения по умолчанию:) NA.
  • vim-swap by machakann : Изменение порядка элементов с разделителями (сопоставления по умолчанию: g<и g>).

6
решение без плагинов очень специфично для случая ...
elyashiv

3
@elyashiv идея в том, что вы можете использовать подобную технику для любых аргументов функции. По сути, выдерните слово, визуально выберите другое слово, вставьте, с помощью которого Vim вернет удаленный символ в регистр, а затем вставьте туда, откуда вы впервые вытащили.
Акшай

1
+1 за vim-боком! В последнем разделе описана очень приятная функция: cia «изменить аргумент». ❤️
Мартейн Курто

5

Я представляю 3 метода. Первые два являются частными случаями, которые требуют меньше нажатий клавиш. Последний является общим. |представляет позицию курсора.


Поменяйте местами соседние аргументы (не работает для последних двух)

function func(foo[0], |bar(), baz.spam, qux->norf)

шаги:

  1. dW удалить текущее слово (аргумент)
  2. W перейти к первому символу следующего аргумента
  3. P вставить перед курсором

Поменяйте местами два последних аргумента

function func(foo[0], bar()|, baz.spam, qux->norf)

шаги:

  1. dt, удалить до следующей запятой
  2. E перейти к последнему символу следующего аргумента
  3. P вставить перед курсором

Поменяйте местами любые два аргумента

function func(|foo[0], bar(), baz.spam, qux->norf)

шаги:

  1. vt,d визуально удалить до запятой
  2. W несколько раз, пока вы не достигнете аргумента, с которым хотите обменяться
  3. gP вставить перед курсором и поместить курсор на символ после вставленного содержимого
  4. dt,удалить до следующей запятой. заменить ,, )если это последний аргумент
  5. `< вернуться к началу последней визуальной области (курсор будет помещен на запятую)
  6. P вставить перед курсором

Редактировать: как указано @ aharris88, ОП хочет, чтобы последний аргумент был первым и переместил все остальные правильно.

Поверните аргументы вправо

function func(foo[0], bar(), baz.spam|, qux->norf)

шаги:

  1. dw удалять ,␣
  2. dt) удалить последний аргумент
  3. %p перейти к открывающим скобкам и вставить последний аргумент
  4. a,␣ введите запятую и пробел
  5. <Esc> вернуться в нормальный режим

Или, если вы не хотите выходить из обычного режима:

  1. "rdwудалить ,␣в регистрr
  2. dt) удалить последний аргумент
  3. %p перейти к открывающим скобкам и вставить последний аргумент
  4. "rp вставить содержимое реестра r

Бонус: GIF для каждого случая: swap1 , swap2 , swap3 и rotate


Хотя этот ответ меняет аргументы, он не отвечает на вопрос о том, как перенести последний аргумент в начало.
ахаррис88

@ aharris88, ты прав. Я отредактировал свой ответ.
Гонсалу Рибейру,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.