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.

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.


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:/
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.