seleccionar un rango de líneas desde la línea de comando

8

Necesito (visual) seleccionar un rango de líneas desde la línea de comando.

Por ejemplo, el siguiente comando :?^\s*for?+,/^\s*end/- pimprime todas las líneas contenidas entre una fory end(de forma exclusiva). En lugar de realizar la operación de impresión, me gustaría cambiar al modo visual con esas líneas resaltadas. Busqué en el manual pero no pude encontrar un comando como ese.

nicmus
fuente
¿Quieres decir "exclusivo"?
Rico
¡tienes razón! Edité la pregunta
nicmus

Respuestas:

7

Los límites de una selección de modo visual están definidos por las marcas <y >.

Por lo tanto, el siguiente comando ingresará al modo visual con las líneas 5 a 10 (inclusive) seleccionadas:

 :5mark < | 10mark > | normal gvV
  • :5mark < establece el inicio de la selección en la línea 5,
  • :10mark > establece el final de la selección en la línea 10,
  • gv entra en modo visual con el área definida arriba seleccionada,
  • V realiza la selección en línea.

Puede pasar cualquier rango de Vim al :markcomando: lo siguiente ingresará al modo visual usando las expresiones regulares fooy barpara definir los límites del área de selección:

:execute search("foo") . "mark <" | execute search("bar") . "mark >" | normal gvV

El siguiente comando es una versión más simple de lo anterior, pero depende de la posición del cursor:

/foo/mark < | /bar/mark > | normal gvV

Para más explicaciones, ver:

Rico
fuente
¡Gracias! ?^\s*for?+ mark < | /^\s*end/- mark > | norm gv
Resolví
@nicmus Ah sí, eso es más simple para su uso específico. He actualizado mi respuesta.
Rico
Solo por el bien de cualquier futuro lector que pueda estar preguntándose, el comentario de +y -en @ nicmus está ajustando los rangos para que la selección no incluya las líneas que coinciden con las expresiones regulares. (Ver :help range)
Rico
El .operador de concatenación realmente me rechazó, así que aquí hay un ejemplo si alguien siente lo mismo: :execute "l" . "s"producirá la misma salida que :ls.
toraritte