¿Cómo lograr una selección de diferente longitud de textos en diferentes líneas?

10

supongo que tengo los siguientes textos:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Quiero hacer la selección como a continuación:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Intenté usar cv para crear un bloque visual, pero después de crear la selección en la primera columna y presionar "f:" (quise expandir la selección a la marca de dos puntos en cada línea como arriba), lo que obtengo es:

aaa-dd-e: "aaa",:
bb-x"bb",
c-9:"c"

la selección se detiene en el primer colon y crea un rectángulo.

Aaron Shen
fuente
66
¿Qué quieres lograr con esa selección? Podría haber otra forma
Arjen Dijkstra
Si está separado por carácter, puede intentar realinear el bloque primero y luego seleccionarlo. Ver: Alinear texto solo en el primer separador en VIM
kenorb

Respuestas:

6

La selección es generalmente un medio para un fin, más aún en Vim, donde la selección a menudo no es necesaria en primer lugar.

Suponiendo que todavía desea poner comillas alrededor de los nombres de propiedad en su archivo no JSON para convertirlo en JSON adecuado:

  1. seleccione las líneas para modificar, en cuanto a carácter o en línea, no importa,
  2. :'<,'>norm I"^[f:i"( '<,'>se inserta automáticamente para usted y ^[se obtiene con <C-v><Esc>).

Si tiene el hermoso complemento surround, el paso 2 se convierte en:

:'<,'>norm ^vt:S"

Con una sustitución, el paso 2 podría convertirse en:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
fuente
Ustedes tienen razón, ahora encuentro que la selección visual probablemente sea innecesaria. con la ayuda o :g/regex/norm, simplemente puedo lograr lo que quiera hacer.
Aaron Shen
¿Hay alguna manera de que pueda poner todo el bloque seleccionado en el portapapeles del sistema y pegarlo en otro archivo?
Aaron Shen
Por supuesto. Suponiendo que su Vim se compila con el soporte del portapapeles que puede hacer "+yo "*y, según el portapapeles al que desee apuntar. Hay muchas preguntas relacionadas por aquí.
romainl
14

Vim solo admite selecciones rectangulares en bloques, con la excepción del borde derecho irregular cuando presiona $.

Hay complementos (como vim múltiples cursores ) que pueden emular múltiples selecciones, pero también debería ser capaz de alcanzar su objetivo real (que desafortunadamente no mencionó) con comandos puros de Vim, por ejemplo :globaly :substitute(si puede formular un regular expresión que coincide con la selección en cada línea), o repitiendo macros (si hay un movimiento particular que cubre la selección en cada línea).

Ingo Karkat
fuente
¿Qué pasa si quiero cortar esas líneas y pegarlas en otro búfer?
Aaron Shen
1

Solo para lanzar otro sombrero al ring, si realmente quieres usar la selección visual, puedes usar el complemento Tabular para alinear los dos puntos, luego haz tu selección visual.

Si toma su texto original:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs alineará todo después del colon, como a continuación

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Y luego puedes hacer tu selección de bloque visual.

Sin embargo, como han dicho otros, la selección visual probablemente no sea necesaria en esta situación. El uso normo la sustitución probablemente puede lograr lo que desea sin preocuparse por las selecciones visuales.

Zach Ingbretsen
fuente
1

¡He encontrado una solución a este problema que es sorprendentemente simple! ¡Inicie el modo de bloque visual desde la parte inferior de la selección del texto que desea copiar y seleccione hacia arriba! Expandirá el bloque a medida que sube, mientras que si resalta hacia abajo parece hacer que la selección sea más pequeña.

Arthur Bowers
fuente
Pero de esta manera siempre será un bloque rectangular, ¿verdad? Mientras lo leo, esto no es lo que quiere el OP (mencionan que probaron el modo de bloqueo visual).
Martin Tournoij
No. Siempre será un bloque rectangular si todas las líneas tienen la misma longitud. Descubrí que comenzar desde la parte inferior y resaltar hacia arriba y luego presionar $ para ir al final de la línea dará como resultado todas las líneas resaltadas resaltadas al final de la línea.
Arthur Bowers