Très souvent, je me trouve dans le besoin d'effectuer une substitution qui aura des correspondances éparses sur un grand fichier et avec des expressions de recherche et de remplacement non triviales.
Par exemple, disons que j'ai des appels de fonction comme okFunction(arg1, arg2 arg3)
. Les arguments différeront avec chaque appel de fonction, bien sûr. Disons maintenant que j'ai découvert une meilleure fonction qui n'a pas besoin arg2
. Je peux facilement ajuster tout le fichier avec
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Bien que conceptuellement simple, je ne suis pas sûr d'avoir la bonne syntaxe dans ce modèle assez long. Le c
drapeau aide vraiment ici, mais le problème est que lors de la demande de confirmation, vim ne montrera pas avec quoi le match sera remplacé. Je veux dire, cela montrera l'expression de remplacement, mais pas le résultat évalué. Si je confirme la substitution avec y
, vim passera immédiatement au match suivant et je ne serai pas en mesure de voir si j'ai fait des erreurs.
J'ai trouvé le plugin vim-over qui résout partiellement le problème, mais uniquement si tous les mathes sont visibles à l'écran lorsque vous tapez la commande. Une fois que vous appuyez sur Entrée, le comportement est exactement le même que celui décrit ci-dessus et je n'ai pas d'aperçu.
Alors, existe-t-il un moyen pour que vim évalue l'expression de remplacement lors de la demande de confirmation sur les commandes de substitution?
la source
%
, vérifiez que le résultat correspond à ce que j'attendais, puis utilisez la substitution avec%
(ce n'est que quelques touches:):<up><c-b>%
. De toute évidence, une option d'aperçu serait beaucoup plus efficace que cela. Bien qu'aucun correctif ne soit disponible, on pourrait peut-être envelopper la substitution dans une fonction vimscript avec ce type d'option mais cela semble beaucoup de travail ...Réponses:
Une solution de contournement est les macros. Mettez en surbrillance toutes les zones problématiques et effectuez la substitution sur une ligne à la fois. Décidez ensuite si vous le souhaitez ou non. Une fois que vous avez terminé
n
à la zone suivante.Pour votre cas en particulier:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
), soit passer au résultat de recherche suivant (n
).@q
.Évidemment pas tout à fait ce que vous cherchiez, mais c'est généralement ce que je fais.
la source
/
elle, elle se comporte également comme une sélection visuelle - c'est bien./
... se comporte comme une sélection visuelle." En fait, ce n'est pas le cas. La raison pour laquelle cela fonctionne est parce:s//
qu'agit sur la ligne actuelle et utilisen
vous amène à l'occurrence suivante.:s/pattern/replacement
il utilisera la dernière chaîne de recherche, donc à l'étape 3, vous pouvez réellement appliquer:s//betterFunction(\1, \3)/g
pour enregistrer une saisie.:vimgrep /pattern/ ##
puis j'applique la macro , de cette façon s'il s'avère que mon modèle correspond réellement et que la macro est trop fastidieuse, je peux ensuite rapidement revenir à:argdo %s/.../..../gc
l'opération et commencer à voler