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


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:/
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.