2010-08-16 6 views
11

Par exemple, si j'ai un code comme:Y a-t-il une bonne commande Vi (m) pour transposer des arguments dans un appel de fonction? Les points bonus pour Emacs

foo = bar("abc", "def", true, callback); 

Y at-il une commande agréable de se déplacer fidèle à la 1ère ou la 2ème position en laissant les virgules intactes?

P.S en prime mon ami veut savoir si cela fonctionne aussi chez Emacs.

+1

Bien que ce soit un double de http: // stackoverflow.com/q/1270278/719547, il y a des réponses différentes et bonnes ici, et il ya des années, donc je ne suis pas sûr de ce que l'étiquette de vote à fermer est. Dans tous les cas, vérifiez cette question. J'ai posté [une réponse] (http://stackoverflow.com/a/21487681/719547) à propos d'un plugin qui gère cela. –

Répondre

19

Dans Vim si vous placez le curseur au début du premier mot et faites dWWP alors il aura l'effet désiré. Voici une ventilation:

dW delete the current word, including the comma and the following whitespace 
W move to the start of the next word 
P insert the deleted text before the cursor 

Cela fonctionnera s'il y a d'autres paramètres après la paire à permutées - il devra être modifié s'il n'y a que deux paramètres ou que vous souhaitez échanger les deux derniers paramètres, depuis il va coller le texte après le crochet de fermeture.

Sinon, vous pouvez utiliser une substitution regex:

:%s/(\([^,]\+\),\s*\([^,)]\+\)/(\2, \1/ 

Ce trouvera les deux premiers arguments après la parenthèse ouverte et de les échanger.

mise à jour:

Une recherche de vim.org trouvé le plugin swap parameters, qui devrait faire exactement ce que vous voulez et peut gérer des situations ou l'autre des méthodes ci-dessus ne peuvent pas.

+0

Très bien, mais cela ne fonctionnera pas sur le 2ème en dernier argument. – carl

+0

Si vous voulez échanger avec le dernier argument, vous devez saisir la virgule avant. Par exemple. avec le curseur sur la virgule suivant '" def "', tapez 'dt,' pour supprimer la deuxième virgule et le troisième argument, puis 'ep' ou' t) p' pour aller à la fin du dernier argument et coller. J'aimerais savoir un moyen facile d'échanger les premiers et derniers paramètres cependant, c'est le cas ennuyeux que je recherche pour le moment, merci pour le plugin ref. –

18

Je ne sais pas la réponse pour vi, mais dans Emacs, transpose-sexps (C-M-t) échangeront deux arguments de chaque côté du curseur. En fait transpose-words (M-t) était ma première supposition, mais cela laisse les citations derrière.

+1

transpose-sexps fonctionnera aussi pour des arguments comme bar ((1 + 2), "hi"), mais ne peut toujours pas gérer la barre (1 + 2, "hi"). Bien sûr, je doute que quelque chose de simple puisse résoudre le cas général des listes d'arguments arbitrairement complexes. –

1

Vous avez besoin d'une commande transpose emacs. Mais c'est limité à ne pas deviner que sa transposition en listes, il ne considère que le texte (il ne peut pas deviner le 1er, 2ème mot de la liste). Essaye ça.

Gardez votre curseur après la virgule de true. Utilisez M-x transpose-words. Par défaut, il transpose avec le mot suivant du point. Le raccourci est M-t.

Vous pouvez utiliser C-u 2 M-t pour transposer avec le second mot suivant.

Voici venu votre question. Si vous voulez déplacer true, vers l'arrière 1 mot, utilisez C-u -1 M-t, et pour l'arrière 2 mots C-u -2 M-t.

Je ne suis pas un gars VIM. Donc, désolé.

0

Si vous voulez faire cela comme un refactoring, pas simplement comme manipulation de texte, je suggérerais de regarder dans Xrefactory, un outil de refactoring pour Emacsen (gratuit pour C/Java, commercial pour C++).

0

Transposer précédent (Ctrl-t p) et suivant (Ctrl-t n) l'argument ... ajouter le suivant dans votre fichier vimrc:

map <C-t>p ?,\\|(<CR>wd/,\\|)<CR>?,\\|(<CR>"_dw?,\\|(<CR>a, <C-c>?,<CR>P/,<CR>w 
map <C-t>n ?,\\|(<CR>wv/,<CR>d"_dw/\\,\\|)<CR>i, <C-r>"<C-c>?,<CR>?,\\|(<CR>w