Substituto de múltipla escolha?

15

Normalmente, um substituto com a copção me dá duas opções: (y) es ou (n) o. É possível ter várias opções sim numeradas para escolher?

Exemplo

Arquivo

person: Alice
dog: Tobby
person: Bob

Padrão 1 :%s/person:/woman:/c

Padrão 2 :%s/person:/man:/c

Os padrões 1 e 2 têm o mesmo padrão de pesquisa, mas diferentes padrões de substituição. Quero unificá-los em um padrão com a opção de pressionar (1) para a substituição 1, (2) para a substituição 2 ou (n) para nenhuma substituição.

Konrad Höffner
fonte

Respostas:

19

A implementação de :s//cé fixa; o que você está procurando é substituir por uma expressão Vimscript ( :help sub-replace-expr). Você pode consultar um dígito via getchar()ou solicitar números mais longos via input():

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

Você pode inserir um número mais alto ( 3no seu exemplo) para não fazer substituição.


Se você precisar disso com frequência, faria sentido definir uma Query()função personalizada para isso. Lá, você também pode adicionar um :redraw, para ver as substituições que já aconteceram.

Ingo Karkat
fonte
O comando parece problemático. Somente depois de adicionar o comando check ele funciona::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Mas adicionar o ccomando resultará em que preciso de duas etapas para substituir uma string, o que acho desnecessário.
Lerner Zhang
1

Obrigado por todos os votos positivos à minha pergunta original! Agora incorporei um :SubstituteChoicescomando no meu plugin PatternsOnText , que fornece uma implementação robusta. O exemplo na pergunta seria resolvido via:

:%SubstituteChoices/person:/woman:/man:/
Ingo Karkat
fonte