Аргументи заміни функції


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 вставить foo [0] перед паролями
  5. Повторіть кроки 1-4 для будь-яких інших.

З плагінами

  • ВІМ-аргументовану від Peter Rincker : Надає текстові об'єкти для переміщення аргументів функції (відображення по замовчуванням: <,а >,).
  • vim-exchange від Tom McDonald : надає зручні карти для обміну двома виборами (відображення за замовчуванням: cxу звичайному режимі та Xу візуальному режимі).
  • vim-side від Андрія Радева : переміщення аргументів функції (та інших предметів, розмежованих на щось) ліворуч та праворуч (відображення за замовчуванням:) NA.
  • vim-swap від machakann : упорядкування розділених елементів (відображення за замовчуванням: g<і g>).

6
рішення, яке не стосується плагінів, дуже специфічне для випадку ...
elyashiv

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

1
+1 для vim-sideway! Останній розділ описує дуже приємну особливість: 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 та обертання


Хоча ця відповідь обміняється аргументами, вона не відповідає на питання, що полягає в тому, як перемістити останній аргумент на початок.
aharris88

@ aharris88, ти маєш рацію. Я відредагував свою відповідь.
Гонсало Рібейро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.