Sustituto de opción múltiple?

15

Normalmente, un sustituto con la copción me da dos opciones: (y) es o (n) o. ¿Es posible tener varias opciones numeradas de sí para elegir?

Ejemplo

Archivo

person: Alice
dog: Tobby
person: Bob

Patrón 1 :%s/person:/woman:/c

Patrón 2 :%s/person:/man:/c

Los patrones 1 y 2 tienen el mismo patrón de búsqueda pero diferentes patrones de reemplazo. Quiero unificarlos en un patrón con la opción de presionar (1) para reemplazar 1, (2) para reemplazar 2 o (n) para no reemplazar.

Konrad Höffner
fuente

Respuestas:

19

La implementación de :s//ces fija; lo que está buscando es el reemplazo con una expresión Vimscript ( :help sub-replace-expr). Puede consultar una vía de un solo dígito getchar()o solicitar números más largos a través de input():

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

Puede ingresar un número mayor ( 3en su ejemplo) para no realizar ningún reemplazo.


Si necesita esto a menudo, tendría sentido definir una Query()función personalizada para eso. Allí, también puede agregar un :redraw, para que vea los reemplazos que ya han sucedido.

Ingo Karkat
fuente
El comando parece problemático. Solo después de agregar el comando de verificación funciona::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Pero agregar el ccomando dará como resultado que necesito dos pasos para reemplazar una cadena, lo que creo que no es necesario.
Lerner Zhang
1

¡Gracias por todos los votos a mi pregunta original! Ahora he incorporado un :SubstituteChoicescomando en mi complemento PatternsOnText , que proporciona una implementación robusta. El ejemplo en la pregunta se resolvería a través de:

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