Multiple-Choice-Ersatz?

15

Normalerweise cgibt mir ein Ersatz mit der Option zwei Optionen: (j) es oder (n) o. Ist es möglich, mehrere nummerierte Ja-Optionen zur Auswahl zu haben?

Beispiel

Datei

person: Alice
dog: Tobby
person: Bob

Muster 1 :%s/person:/woman:/c

Muster 2 :%s/person:/man:/c

Muster 1 und 2 haben dasselbe Suchmuster, aber unterschiedliche Ersetzungsmuster. Ich möchte sie zu einem Muster zusammenfassen, indem ich (1) für Ersatz 1, (2) für Ersatz 2 oder (n) für keinen Ersatz drücke.

Konrad Höffner
quelle

Antworten:

19

Die Implementierung von :s//cist behoben; Was Sie suchen, ist das Ersetzen durch einen Vimscript-Ausdruck ( :help sub-replace-expr). Sie können eine einstellige Nummer abfragen getchar()oder längere Nummern abfragen über input():

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

Sie können eine höhere Zahl eingeben ( 3in Ihrem Beispiel), um keinen Ersatz durchzuführen.


Wenn Sie dies häufig benötigen, ist es sinnvoll, eine benutzerdefinierte Query()Funktion dafür zu definieren . Dort können Sie auch ein hinzufügen :redraw, damit Sie die bereits erfolgten Ersetzungen sehen.

Ingo Karkat
quelle
Der Befehl scheint problematisch. Erst nachdem ich den Check-Befehl hinzugefügt habe, funktioniert es::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Das Hinzufügen des cBefehls führt jedoch dazu, dass ich zwei Schritte benötige, um eine Zeichenfolge zu ersetzen, die ich für unnötig halte.
Lerner Zhang
1

Vielen Dank für alle positiven Bewertungen zu meiner ursprünglichen Frage! Ich habe jetzt einen :SubstituteChoicesBefehl in mein PatternsOnText-Plugin eingefügt , der eine robuste Implementierung bietet. Das Beispiel in der Frage würde gelöst werden über:

:%SubstituteChoices/person:/woman:/man:/
Ingo Karkat
quelle