Zamień argumenty funkcji

19

Przy refaktoryzacji kodu przydatna byłaby możliwość zamiany argumentów funkcji.

Zmiana np .:

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

w

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

Czy istnieje jakiś sposób zamiany argumentów w lewo / w prawo, utrzymując nawiasy funkcyjne i przecinki na miejscu?


Zauważ, że może to być dość zaangażowane, jeśli chcesz uwzględnić argumenty, które same są wywołaniami funkcji, z własnymi argumentami - np .: func(baz->spam, foo[0], bar(a, b, c))- obsługa tych przypadków prawdopodobnie wymagałaby bardziej kompleksowej analizy.

ideasman42
źródło

Odpowiedzi:

23

Bez wtyczek

| wskazuje pozycję kursora

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

Kroki:

  1. dt) usunie baz.spam
  2. Ff przesunie kursor do znaku f in foo[0]
  3. vt,p usunie foo [0] i zastąpi go baz.spam
  4. $P wklei foo [0] przed parens
  5. Powtórz kroki 1-4 dla pozostałych.

Z wtyczkami

  • vim-argumentative autorstwa Peter Rincker : Udostępnia obiekty tekstowe do poruszania się po argumentach funkcji (domyślne odwzorowania: <,i >,).
  • vim-exchange by Tom McDonald : Zapewnia przydatne mapowania do wymiany dwóch opcji (Domyślne mapowania: cxw trybie normalnym i Xtrybie wizualnym).
  • vim-sideways autor: Andrew Radev : Przenieś argumenty funkcji (i inne elementy rozdzielane przez coś) w lewo i prawo (domyślne odwzorowania:) NA.
  • vim-swap by machakann : Zmień kolejność elementów rozdzielanych (Domyślne odwzorowania: g<i g>).
akshay
źródło
6
rozwiązanie inne niż wtyczka jest bardzo specyficzne dla przypadku ...
elyashiv
3
@elyashiv chodzi o to, że możesz użyć podobnej techniki dla dowolnych argumentów funkcji. Zasadniczo, szarpnij słowo, wizualnie wybierz inne słowo, wklej, z którego Vim szarpnie usuniętą postać do rejestru, a następnie wklej tam, gdzie pierwszy z niej szarpnąłeś.
akshay,
1
+1 dla vima-sideways! Ostatnia sekcja opisuje bardzo fajną funkcję: cia „zmienić argument”. ❤️
Martijn Courteaux
5

Przedstawiam 3 metody. Pierwsze dwa są szczególnymi przypadkami, które wymagają mniejszej liczby naciśnięć klawiszy. Ostatni jest ogólny. |reprezentuje pozycję kursora.


Zamień sąsiednie argumenty (nie działa dla dwóch ostatnich)

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

Kroki:

  1. dW usuń bieżące słowo (argument)
  2. W przejdź do pierwszego znaku następnego argumentu
  3. P wklej przed kursorem

Zamień dwa ostatnie argumenty

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

Kroki:

  1. dt, usuń do następnego przecinka
  2. E przejdź do ostatniego znaku następnego argumentu
  3. P wklej przed kursorem

Zamień dowolne dwa argumenty

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

Kroki:

  1. vt,d wizualnie usuwaj do przecinka
  2. W kilka razy, aż dojdziesz do argumentu, który chcesz zamienić
  3. gP wklej przed kursorem i umieść kursor na znaku po wklejonej zawartości
  4. dt,usuń do następnego przecinka. zastąp ,przez, )jeśli jest to ostatni argument
  5. `< wróć do początku ostatniego obszaru wizualnego (kursor zostanie umieszczony w przecinku)
  6. P wklej przed kursorem

Edycja: jak wskazał @ aharris88, OP chce, aby ostatni argument był pierwszy, a wszystkie pozostałe przesunąć w prawo.

Obróć argumenty w prawo

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

Kroki:

  1. dw usunąć ,␣
  2. dt) usuń ostatni argument
  3. %p przejdź do nawiasów otwierających i wklej ostatni argument
  4. a,␣ wstaw przecinek i spację
  5. <Esc> powrócić do trybu normalnego

Lub, jeśli nie chcesz nigdy wychodzić z trybu normalnego:

  1. "rdwusuń ,␣do rejestrur
  2. dt) usuń ostatni argument
  3. %p przejdź do nawiasów otwierających i wklej ostatni argument
  4. "rp wklej zawartość rejestru r

Bonus: GIF w każdym przypadku: swap1 , swap2 , swap3 i obracanie

Gonçalo Ribeiro
źródło
Chociaż ta odpowiedź zamienia argumenty, nie odpowiada na pytanie, jak przenieść ostatni argument na początek.
aharris88
@ aharris88, masz rację. Zredagowałem swoją odpowiedź.
Gonçalo Ribeiro