Substitut à choix multiples?

15

Normalement, un substitut avec l' coption me donne deux options: (y) es ou (n) o. Est-il possible de choisir parmi plusieurs options oui numérotées?

Exemple

Fichier

person: Alice
dog: Tobby
person: Bob

Modèle 1 :%s/person:/woman:/c

Modèle 2 :%s/person:/man:/c

Les motifs 1 et 2 ont le même motif de recherche mais des motifs de remplacement différents. Je veux les unifier en un modèle avec l'option d'appuyer sur (1) pour le remplacement 1, (2) pour le remplacement 2 ou (n) pour aucun remplacement.

Konrad Höffner
la source

Réponses:

19

L'implémentation de :s//cest fixe; ce que vous recherchez est le remplacement par une expression Vimscript ( :help sub-replace-expr). Vous pouvez interroger un seul chiffre via getchar()ou demander des numéros plus longs via input():

:%s/person:/\=get(['woman', 'man'], getchar() - char2nr(1), submatch(0)) . ':'/
:%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/

Vous pouvez entrer un nombre plus élevé ( 3dans votre exemple) pour n'effectuer aucun remplacement.


Si vous en avez besoin souvent, il serait judicieux de définir une Query()fonction personnalisée pour cela. Là, vous pouvez également ajouter un :redraw, afin de voir les remplacements qui se sont déjà produits.

Ingo Karkat
la source
La commande semble problématique. Ce n'est qu'après avoir ajouté la commande de vérification que cela fonctionne::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Mais ajouter la ccommande entraînera la nécessité de deux étapes pour remplacer une chaîne, ce qui, je pense, est inutile.
Lerner Zhang
1

Merci pour tous les votes positifs à ma question d'origine! J'ai maintenant incorporé une :SubstituteChoicescommande dans mon plugin PatternsOnText , qui fournit une implémentation robuste. L'exemple dans la question serait résolu via:

:%SubstituteChoices/person:/woman:/man:/
Ingo Karkat
la source