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.

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.


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:/
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.