Замінник декількох виборів?


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, щоб ви побачили заміни, які вже відбулися.


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

Але додавання cкоманди призведе до того, що мені потрібно два кроки для заміни рядка, що, на мою думку, непотрібне.
Лернер Чжан

1

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

:%SubstituteChoices/person:/woman:/man:/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.