Sostituto a scelta multipla?


15

Normalmente, un sostituto con l' copzione mi dà due opzioni: (y) es o (n) o. È possibile avere più opzioni numerate sì tra cui scegliere?

Esempio

File

person: Alice
dog: Tobby
person: Bob

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

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

I modelli 1 e 2 hanno lo stesso modello di ricerca ma modelli di sostituzione diversi. Voglio unificarli in un modello con l'opzione di premere (1) per la sostituzione 1, (2) per la sostituzione 2 o (n) per nessuna sostituzione.

Risposte:


19

L'implementazione di :s//cè fissa; quello che stai cercando è la sostituzione con un'espressione Vimscript ( :help sub-replace-expr). È possibile eseguire una query con una sola cifra tramite getchar()o richiedere numeri più lunghi tramite input():

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

Puoi inserire un numero più alto ( 3nel tuo esempio) per non effettuare sostituzioni.


Se ne hai bisogno spesso, avrebbe senso definire una Query()funzione personalizzata per quello. Lì puoi anche aggiungere un :redraw, in modo da vedere le sostituzioni che sono già avvenute.


Il comando sembra problematico. Solo dopo aver aggiunto il comando check funziona::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang

Ma aggiungere il ccomando comporterà che ho bisogno di due passaggi per sostituire una stringa, che penso sia inutile.
Lerner Zhang,

1

Grazie per tutti i voti alla mia domanda originale! Ora ho incorporato un :SubstituteChoicescomando nel mio plugin PatternsOnText , che fornisce un'implementazione solida. L'esempio nella domanda sarebbe risolto tramite:

:%SubstituteChoices/person:/woman:/man:/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.