Échanger des arguments de fonction


19

Lors de la refactorisation de code, il serait utile de pouvoir échanger des arguments de fonction.

Changer par exemple:

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

dans

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

Existe-t-il un moyen de permuter les arguments vers la gauche / droite, en gardant les parenthèses et les virgules de fonction en place?


Remarque, cela pourrait devenir très compliqué si vous voulez prendre en compte les arguments qui sont eux-mêmes des appels de fonction avec leurs propres arguments - par exemple: func(baz->spam, foo[0], bar(a, b, c))- la prise en charge de ces cas impliquerait probablement une analyse plus complète.

Réponses:


23

Sans plugins

| indique la position du curseur

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

Pas:

  1. dt) va supprimer baz.spam
  2. Ff déplace le curseur sur le caractère f dans foo[0]
  3. vt,p supprimera foo [0] et le remplacera par baz.spam
  4. $P va coller le foo [0] avant les parens
  5. Répétez les étapes 1 à 4 pour les autres.

Avec des plugins

  • vim-argumentative de Peter Rincker : fournit des objets texte pour se déplacer dans les arguments de fonction (mappages par défaut: <,et >,).
  • vim-exchange par Tom McDonald : Fournit des mappages pratiques pour échanger deux sélections (Mappages par défaut: cxen mode normal et Xen mode visuel).
  • vim-sideways par Andrew Radev : Déplacer les arguments de la fonction (et d'autres éléments délimités par quelque chose) à gauche et à droite (mappages par défaut:) NA.
  • vim-swap by machakann : Réorganiser les éléments délimités (mappages par défaut: g<et g>).

6
la solution non-plugin est très spécifique pour le cas ...
elyashiv

3
@elyashiv l'idée est que vous pouvez utiliser une technique similaire pour tous les arguments de fonction. Fondamentalement, tirez un mot, sélectionnez visuellement un autre mot, collez, dont Vim tirera le caractère supprimé dans le registre, puis collez d'où vous avez tiré la première fois.
akshay

1
+1 pour vim-sideways! La dernière section décrit une fonctionnalité très intéressante: cia "changer d'argument". ❤️
Martijn Courteaux

5

Je présente 3 méthodes. Les deux premiers sont des cas particuliers, qui nécessitent moins de frappes. Le dernier est générique. |représente la position du curseur.


Permuter les arguments adjacents (ne fonctionne pas pour les deux derniers)

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

Pas:

  1. dW supprimer le mot actuel (argument)
  2. W aller au premier caractère de l'argument suivant
  3. P coller devant le curseur

Échangez les deux derniers arguments

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

Pas:

  1. dt, supprimer jusqu'à la prochaine virgule
  2. E aller au dernier caractère de l'argument suivant
  3. P coller devant le curseur

Échangez deux arguments

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

Pas:

  1. vt,d supprimer visuellement jusqu'à la virgule
  2. W plusieurs fois jusqu'à ce que vous atteigniez l'argument avec lequel vous souhaitez échanger
  3. gP coller avant le curseur et placer le curseur sur le caractère après le contenu collé
  4. dt,supprimer jusqu'à la prochaine virgule. remplacer ,par )si c'est le dernier argument
  5. `< revenir au début de la dernière zone visuelle (le curseur sera placé à la virgule)
  6. P coller devant le curseur

Edit: comme indiqué par @ aharris88, l'OP veut que le dernier argument soit le premier et déplace tous les autres à droite.

Faire pivoter les arguments vers la droite

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

Pas:

  1. dw supprimer ,␣
  2. dt) supprimer le dernier argument
  3. %p passer aux parenthèses ouvrantes et coller le dernier argument
  4. a,␣ insérer une virgule et un espace
  5. <Esc> revenir en mode normal

Ou, si vous ne voulez jamais quitter le mode normal:

  1. "rdwsupprimer ,␣dans un registrer
  2. dt) supprimer le dernier argument
  3. %p passer aux parenthèses ouvrantes et coller le dernier argument
  4. "rp coller le contenu du registre r

Bonus: un GIF pour chaque cas: swap1 , swap2 , swap3 et rotation


Bien que cette réponse permute les arguments, elle ne répond pas à la question, qui est de savoir comment déplacer le dernier argument au début.
aharris88

@ aharris88, vous avez raison. J'ai édité ma réponse.
Gonçalo Ribeiro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.