Comment obtenir un aperçu de la commande de substitution?

9

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 cdrapeau 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?

Vitor Eiji
la source
2
qui est un élément de liste de souhaits dans le tracker vim-bug (désolé ne le trouve pas actuellement)
Christian Brabandt
2
Pour ce que ça vaut, j'utilise généralement la substitution sur la première ligne pour remplacer sans le %, 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 ...
statox
2
@ChristianBrabandt Je l'ai trouvé . C'est pour l'instant avec une priorité non classée ...
Vitor Eiji
2
@VitorEiji ce n'était pas celui auquel je pensais. Mais cela n'a pas vraiment d'importance, car ce n'est pas possible actuellement. Neovim fournit l'option 'inccommand', qui pourrait fonctionner (ou pas, je ne le fais pas vraiment maintenant)
Christian Brabandt
Le mal prévient la substitution; Mais je ne sais pas comment ça se passe.
Geremia

Réponses:

2

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:

  1. Rechercher des zones: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Commencer à enregistrer une macro qq .
  3. Appliquer :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Arrêter l'enregistrement de la macro q
  5. Soit annuler ( u), soit passer au résultat de recherche suivant (n ).
  6. Appliquer la macro @q .
  7. Répétez les étapes 5 et 6 si nécessaire.

Évidemment pas tout à fait ce que vous cherchiez, mais c'est généralement ce que je fais.

Tumbler41
la source
c'est super! Je n'ai jamais réalisé que lorsque vous effectuez une recherche avec /elle, elle se comporte également comme une sélection visuelle - c'est bien.
the_velour_fog
@the_velour_fog " /... 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 utilise nvous amène à l'occurrence suivante.
Tumbler41
1
Si vous ne spécifiez pas de modèle, :s/pattern/replacementil utilisera la dernière chaîne de recherche, donc à l'étape 3, vous pouvez réellement appliquer :s//betterFunction(\1, \3)/gpour enregistrer une saisie.
Haegin
@ Tumbler41 ah, merci pour la clarification. Oui, je fais également cette technique de recherche de base , puis j'applique la macro , je remplis généralement l'argliste en premier et j'utilise :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/.../..../gcl'opération et commencer à voler
the_velour_fog