2009-08-13 6 views
21

Quelle est la manière la plus efficace d'échanger deux paramètres pour un appel de méthode dans Vim?vim fu, échange de paramètres pour un appel de méthode

Par exemple, je veux changer:

call "hello mister 123", 2343 

à:

call 2343, "hello mister 123" 

(Supposons que le curseur se trouve au début de la ligne.)

Idéalement l'astuce fonctionne pour des choses comme

call "hello, world" , "goodbye, world" 
+0

est-il séparé par des virgules seulement? et seulement une virgule à chaque ligne? – nightingale2k1

+0

les paramètres sont toujours séparés par des virgules, mais les chaînes de caractères peuvent parfois contenir des virgules. –

+0

:% s: appel \ (". *" \), \ (. * \): Appel \ 2, \ 1: g – nightingale2k1

Répondre

16

Ce regex fera pour vos exemples:

:s/\vcall ("[^"]+"|[^,]+)\s*,\s*("[^"]+"|[^,]+)/call \2, \1/ 

Cette regex devra devenir progressivement plus méchant si vous avez échappé à des guillemets et des choses dans l'un de vos paramètres.

En réalité, je voudrais juste mettre en surbrillance un paramètre (en mode visuel), appuyez sur d, mettez en surbrillance l'autre paramètre, et appuyez sur p; Vim va bien coller ce qui est dans le registre, en écrasant ce que vous avez mis en surbrillance, et échanger le texte supprimé dans le registre. Puis déplacez le curseur et appuyez à nouveau sur p. Mettez en surbrillance, d, mettre en évidence, p, déplacer le curseur, p est une combinaison commune, dans mon écrémage au moins.

Donc, avec le curseur au début de la ligne, premier exemple:

wva"dlvawpF,P 

Signification Dépasser le mot « appel » (w), mettez en surbrillance une chaîne entre guillemets (va"), supprimer (d) , déplacez un espace vers la droite (l), mettez un mot en surbrillance (vaw), collez (p), déplacez-le vers la virgule (F,), collez-le avant (P).

Deuxième exemple:

wva"dlva"p_f,P 

Ce n'est pas difficile une fois que vous vous habituer aux commandes de mouvement.

+0

La partie "en réalité" est la partie qui a attiré mon attention. Merci de nous avoir guidés! :) – aikeru

1

Si vos arguments sont entre parenthèses, comme ici:

function ($argument1 = null, 'argument2') { 
    ... 
} 

Placez le curseur à l'intérieur de la parenthèse et:

va(:s/\\%V(\\@<=\\s*\\(.\\+\\),\\s*\\(.\\+\\)\\%V\\s*/\\2, \\1/g 
5

Check out sideways.vim, un plug-in par @AndrewRadev. Il peut gérer les paramètres de déplacement et d'autres éléments de liste délimités, avec quelques fonctionnalités intéressantes comme le déplacement de listes imbriquées en une seule unité. Il gère également les appels de méthode Ruby sans parenthèses. Très utile.

Questions connexes