Wybór wielokrotnego wyboru?

15

Zwykle zamiennik z copcją daje mi dwie opcje: (y) es lub (n) o. Czy jest możliwe wybranie kilku numerowanych opcji tak?

Przykład

Plik

person: Alice
dog: Tobby
person: Bob

Wzór 1 :%s/person:/woman:/c

Wzór 2 :%s/person:/man:/c

Wzory 1 i 2 mają ten sam wzorzec wyszukiwania, ale różne wzorce zastępcze. Chcę ujednolicić je w jeden wzór z opcją naciśnięcia (1) dla zamiany 1, (2) dla zamiany 2 lub (n) dla braku zamiany.

Konrad Höffner
źródło

Odpowiedzi:

19

Implementacja :s//cjest ustalona; to, czego szukasz, to zastąpienie wyrażeniem Vimscript ( :help sub-replace-expr). Możesz wysłać zapytanie o jedną cyfrę za pomocą getchar()lub poprosić o dłuższe numery za pomocą input():

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

Możesz wprowadzić wyższą liczbę ( 3w twoim przykładzie), aby nie dokonywać zamiany.


Jeśli potrzebujesz tego często, warto zdefiniować niestandardową Query()funkcję do tego celu. Tam możesz również dodać :redraw, aby zobaczyć zamienniki, które już miały miejsce.

Ingo Karkat
źródło
Polecenie wydaje się problematyczne. Dopiero po dodaniu polecenia sprawdzania działa::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Ale dodanie cpolecenia spowoduje, że potrzebuję dwóch kroków, aby zastąpić ciąg, co moim zdaniem jest niepotrzebne.
Lerner Zhang
1

Dziękuję za wszystkie głosy poparcia dla mojego pierwotnego pytania! Włączyłem teraz :SubstituteChoicespolecenie do mojej wtyczki PatternsOnText , która zapewnia niezawodną implementację. Przykład w pytaniu zostałby rozwiązany poprzez:

:%SubstituteChoices/person:/woman:/man:/
Ingo Karkat
źródło