En Vim, ¿cómo puedo insertar efectivamente los mismos caracteres en múltiples líneas?

A veces quiero editar un cierto bloque visual de texto en múltiples líneas.

Por ejemplo, tomaría un texto que se parece a esto:

name comment phone email 

Y haz que parezca así

 vendor_name vendor_comment vendor_phone vendor_email 

Actualmente, la forma en que lo haría ahora es …

  1. Seleccione las 4 líneas de fila de bloque presionando V y luego j 4 veces.
  2. Sangría con > .
  3. Regrese una letra con h .
  4. Ir a bloquear el modo visual con ctrl v .
  5. Seleccione abajo 4 filas presionando j 4 veces. En este punto, ha seleccionado un bloque visual 4×1 de espacios en blanco (4 filas, 1 columna).
  6. Presione c . Observe esto bastante indentado a la izquierda por una columna.
  7. Escriba un " vendor_" sin la cita. Observe el espacio extra que tuvimos que devolver.
  8. Presione esc . Esta es una de las pocas veces que uso esc para salir del modo de inserción. ctrl c solo editaría la primera línea.
  9. Repita el paso 1.
  10. Sangría a la inversa con < .

No necesito sangría si hay al menos una columna de espacios en blanco antes de las palabras. No necesitaría el espacio en blanco si no tuviera que borrar el bloque visual con c .

Pero si tengo que borrar, ¿hay alguna manera de hacer lo que hice arriba sin crear los espacios en blanco necesarios con indentación?

Además, ¿por qué la edición de varias líneas a la vez solo funciona al salir del modo de inserción con esc sobre ctrl c ?

Editar:

Aquí hay un ejemplo más complicado

 name = models.CharField( max_length = 135 ) comment = models.TextField( blank = True ) phone = models.CharField( max_length = 135, blank = True ) email = models.EmailField( blank = True ) 

a

 name = models.whatever.CharField( max_length = 135 ) comment = models.whatever.TextField( blank = True ) phone = models.whatever.CharField( max_length = 135, blank = True ) email = models.whatever.EmailField( blank = True ) 

en este ejemplo, realizaría el locking visual vertical sobre el . , luego vuelva a insertarlo durante el modo de inserción, es decir, escriba .whatever. . Espero que ahora puedas ver el inconveniente de este método. Estoy limitado a seleccionar solo una columna de texto que sea igual en una posición vertical .

  1. Mueva el cursor al n en el name .
  2. Ingrese al modo de bloque visual ( ctrl v ).
  3. Presiona j tres veces.
  4. Presione I (capital i).
  5. Escriba en el vendor_ .
  6. Presione esc .

mini-screencast que demuestra el método

Debe usarse una mayúscula en lugar de una minúscula i porque la letra minúscula i se interpreta como el inicio de un objeto de texto , que es bastante útil por sí mismo, por ejemplo, para seleccionar un dentro de un bloque de etiqueta ( it ):

mini-screencast que muestra la utilidad del objeto de texto it

Otro enfoque es usar el . ( dot ) comando en combinación con I.

  1. Mueva el cursor hacia donde desea comenzar
  2. Presione I
  3. Escriba el prefijo que desea (por ejemplo, vendor_ )
  4. Presione esc .
  5. Presiona j para bajar una línea
  6. Tipo . para repetir la última edición, insertando automáticamente el prefijo nuevamente
  7. Alterna rápidamente entre j y .

Encuentro que esta técnica es a menudo más rápida que el modo de bloque visual para pequeñas cantidades de adiciones y tiene el beneficio adicional de que si no necesita insertar el texto en cada línea en un rango, puede omitirlas presionando j adicional. s.

Tenga en cuenta que para un gran número de adiciones contiguas, el enfoque de bloque o macro probablemente será superior.

Usaría una macro para registrar mis acciones y luego repetirla.

  1. Coloca el cursor sobre la primera letra en el nombre.
  2. Presione qq para comenzar a grabar en el búfer q .
  3. Pulse i para entrar en modo insertar, y escriba vector_ , luego vector_ ESC para salir del modo insertar.
  4. Ahora presione 0 para volver al comienzo de la línea.
  5. Ahora presiona j para bajar.
  6. Ahora presione q nuevamente para detener la grabación.

Ahora tienes un buen macro.

Escriba 3@q para ejecutar su macro 3 veces para hacer el rest de las líneas.

 :%s/^/vendor_/ 

¿O me estoy perdiendo algo?

  1. Seleccione las líneas que desea modificar usando Ctrl V.
  2. Prensa:

    • I : Insertar antes de lo que se seleccionó.
    • A : Agregar después de lo que está seleccionado.
    • C : Reemplace lo que está seleccionado.
  3. Escriba el nuevo texto.

  4. Presione Esc para aplicar los cambios a todas las líneas seleccionadas.

Actualizado en enero de 2016

Si bien la respuesta aceptada es una gran solución, en realidad se trata de pulsaciones de tecla ligeramente menores y de escalas mejores, basadas en principio en la respuesta aceptada.

  1. Mueva el cursor al n en el name .
  2. Ingrese al modo de bloque visual ( ctrl v ).
  3. Presione 3j
  4. Presione I
  5. Escriba en el vendor_ .
  6. Presione esc .

ilustración visual

Tenga en cuenta que esto tiene menos teclas que la respuesta aceptada (compare el paso 3). Solo contamos el número de acciones j para realizar.

Si tiene números de línea habilitados (como se ilustra arriba), y conoce el número de línea al que desea moverse, entonces el paso 3 puede cambiarse a # G donde # es el número de línea deseado.

En nuestro ejemplo anterior, este sería 4G . Sin embargo, cuando se trata solo de unos pocos números de línea, un conteo explícito funciona bien.

Supongamos que tiene este archivo:

 something name comment phone email somethine else and more ... 

Desea agregar “proveedor_” delante de “nombre”, “comentario”, “teléfono” y “correo electrónico”, independientemente de dónde aparezcan en el archivo .

 :%s/\< \(name\|comment\|phone\|email\)\>/vendor_\1/gc 

La bandera c le solicitará confirmación. Puede soltar eso si no desea el aviso.

También puede tener un caso de uso en el que desee eliminar un bloque de texto y reemplazarlo.

Me gusta esto

 Hello World Hello World 

A

 Hello Cool Hello Cool 

Puedes simplemente seleccionar el bloque visual “Mundo” en ambas líneas.

Escriba c para cambio: ahora estará en modo insertar.

Inserta las cosas que quieres y toca escapar.

Ambos se reflejan verticalmente. Funciona igual que ‘I’, excepto que reemplaza el bloque con el nuevo texto en lugar de insertarlo.

Quería comentar un montón de líneas en un archivo de configuración en un servidor que solo tenía vi (no nano), por lo que el método visual también era engorroso Así es como lo hice.

  1. Abra el archivo vi file
  2. Mostrar números de línea :set number! o :set number
  3. Luego use los números de línea para reemplazar el inicio de línea con “#”, ¿cómo?

:35,77s/^/#/

Nota: los números son inclusivos, las líneas del 35 al 77, ambas incluidas serán modificadas.

Para descomentar / deshacer eso, simplemente use :35,77s/^#//

Si desea agregar una palabra de texto como comentario después de cada línea de código, también puede usar:

:35,77s/$/#test/ (para idiomas como Python)

:35,77s/;$/;\/\/test/ (para idiomas como Java)

créditos / referencias:

  1. https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

 Use Ctrl+V to enter visual block mode Move Up/Down to select the columns of text in the lines you want to comment. Then hit Shift+i and type the text you want to insert. Then hit Esc, wait 1 second and the inserted text will appear on every line 
 1. ctrl + v to go to visual block 2. select the lines using up and down arrow 3. enter small 3i ( presess SMALL I three times) 4. I (Press capital I, That will take you into insert mode) 4. Write the text you want to add 5. esc 6. press down arrow 

Esta es una pregunta antigua, pero quiero proporcionar una alternativa que pueda ser más flexible:

Ejemplo: para ingresar el texto XYZ al comienzo de la línea

:%norm IXYZ

¿Que esta pasando aqui?

  • % == Ejecutar en cada línea
  • norm == Ejecute las siguientes teclas en modo normal
  • I == Insertar al comienzo de la línea
  • XYZ == El texto que desea ingresar

Luego presionas enter, y se ejecuta.

Específico a su solicitud:

:%norm Ivendor_

También puede elegir un rango particular:

:2,4norm Ivendor_

O ejecuta sobre un rango visual seleccionado:

:'< ,'>norm Ivendor_