Множественный выбор заменителя?

15

Обычно замена с cопцией дает мне две опции: (y) es или (n) o. Можно ли иметь несколько пронумерованных вариантов выбора да?

пример

файл

person: Alice
dog: Tobby
person: Bob

Образец 1 :%s/person:/woman:/c

Образец 2 :%s/person:/man:/c

Шаблоны 1 и 2 имеют одинаковый шаблон поиска, но разные шаблоны замены. Я хочу объединить их в один шаблон с возможностью нажатия (1) для замены 1, (2) для замены 2 или (n) без замены.

Конрад Хеффнер
источник

Ответы:

19

Реализация :s//cисправлена; то, что вы ищете, это замена с выражением Vimscript ( :help sub-replace-expr). Вы можете запросить однозначную цифру через getchar()или запросить более длинные цифры через input():

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

Вы можете ввести большее число ( 3в вашем примере), чтобы не выполнять замену.


Если вам это нужно часто, имеет смысл определить для этого пользовательскую Query()функцию. Там вы также можете добавить :redraw, чтобы увидеть замены, которые уже произошли.

Инго Каркат
источник
Команда кажется проблематичной. Только после того, как я добавил команду проверки, она работает::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Но добавление cкоманды приведет к тому, что мне понадобится два шага для замены строки, что я считаю ненужным.
Лернер Чжан
1

Спасибо за все ответы на мой оригинальный вопрос! Теперь я включил :SubstituteChoicesкоманду в мой плагин PatternsOnText , который обеспечивает надежную реализацию. Пример в вопросе будет решен через:

:%SubstituteChoices/person:/woman:/man:/
Инго Каркат
источник