Tauschen Sie Funktionsargumente aus


19

Beim Refactoring von Code wäre es nützlich, Funktionsargumente austauschen zu können.

Ändern für zB:

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

in

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

Gibt es eine Möglichkeit, Argumente nach links / rechts zu tauschen, wobei die Klammern und Kommas der Funktionen beibehalten werden?


Beachten Sie , dies könnte durchaus beteiligt werden , wenn Sie für Argumente Konto möchten , die sich Funktionsaufrufe mit ihren eigenen Argumente sind - zB: func(baz->spam, foo[0], bar(a, b, c))- diese Fälle unterstützen wahrscheinlich einige umfassendere Analyse einbeziehen würde.

Antworten:


23

Ohne Plugins

| zeigt die Cursorposition an

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

Schritte:

  1. dt) wird gelöscht baz.spam
  2. Ff Bewegt den Cursor auf das Zeichen f in foo[0]
  3. vt,p löscht foo [0] und ersetzt es durch baz.spam
  4. $P füge das foo [0] vor den parens ein
  5. Wiederholen Sie die Schritte 1 bis 4 für alle anderen.

Mit Plugins

  • vim-argumentative von Peter Rincker : Stellt Textobjekte zum Bewegen von Funktionsargumenten bereit (Standardzuordnungen: <,und >,).
  • vim-exchange von Tom McDonald : Bietet praktische Zuordnungen zum Austauschen von zwei Auswahlen (Standardzuordnungen: cxim normalen Modus und Xim visuellen Modus).
  • vim-sideways von Andrew Radev : Verschiebt Funktionsargumente (und andere durch etwas begrenzte Elemente) nach links und rechts (Standardzuordnungen:) NA.
  • vim-swap von machakann : Durch Trennzeichen getrennte Elemente neu anordnen (Standardzuordnungen: g<und g>).

6
Die nicht-Plugin-Lösung ist sehr spezifisch für den Fall ...
Elyashiv

3
@elyashiv die Idee ist, dass Sie eine ähnliche Technik für alle Funktionsargumente verwenden können. Grundsätzlich ein Wort ziehen, ein anderes Wort visuell auswählen, einfügen, wodurch Vim das gelöschte Zeichen in das Register zieht, und dann einfügen, von wo aus Sie zuerst gezogen haben.
Akshay

1
+1 für vim-sideways! Der letzte Abschnitt beschreibt eine sehr schöne Funktion: cia "Änderung des Arguments". ❤️
Martijn Courteaux

5

Ich präsentiere 3 Methoden. Die ersten beiden sind Sonderfälle, für die weniger Tastenanschläge erforderlich sind. Der letzte ist generisch. |repräsentiert die Cursorposition.


Benachbarte Argumente tauschen (funktioniert nicht für die letzten beiden)

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

Schritte:

  1. dW Löscht das aktuelle Wort (Argument)
  2. W gehe zum ersten Zeichen des nächsten Arguments
  3. P Einfügen vor dem Cursor

Tauschen Sie die letzten beiden Argumente aus

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

Schritte:

  1. dt, lösche bis zum nächsten Komma
  2. E Gehe zum letzten Zeichen des nächsten Arguments
  3. P Einfügen vor dem Cursor

Tauschen Sie zwei beliebige Argumente aus

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

Schritte:

  1. vt,d visuell bis Komma löschen
  2. W mehrmals, bis Sie das Argument erreichen, mit dem Sie tauschen möchten
  3. gP Einfügen vor dem Cursor und Platzieren des Cursors auf dem Zeichen nach dem Einfügen des Inhalts
  4. dt,lösche bis zum nächsten Komma. Ersetzen Sie ,durch, )wenn dies das letzte Argument ist
  5. `< gehe zurück zum Anfang des letzten sichtbaren Bereichs (der Cursor wird auf das Komma gesetzt)
  6. P Einfügen vor dem Cursor

Edit: Wie von @ aharris88 gezeigt, möchte das OP, dass das letzte Argument das erste ist und alle anderen nach rechts bewegt.

Argumente nach rechts drehen

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

Schritte:

  1. dw löschen ,␣
  2. dt) letztes Argument löschen
  3. %p Springe zu den öffnenden Klammern und füge das letzte Argument ein
  4. a,␣ füge ein Komma und ein Leerzeichen ein
  5. <Esc> kehren Sie in den normalen Modus zurück

Oder, wenn Sie den normalen Modus niemals verlassen möchten:

  1. "rdw,␣in ein Register löschenr
  2. dt) letztes Argument löschen
  3. %p Springe zu den öffnenden Klammern und füge das letzte Argument ein
  4. "rp Inhalt des Registers einfügen r

Bonus: ein GIF für jeden Fall: Swap1 , Swap2 , Swap3 und drehen


Diese Antwort tauscht zwar Argumente aus, beantwortet jedoch nicht die Frage, wie das letzte Argument an den Anfang verschoben werden kann.
Aharris88

@ aharris88, du hast recht. Ich habe meine Antwort bearbeitet.
Gonçalo Ribeiro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.