tutorial mac help comandos vim

mac - Vim: inserta los mismos caracteres en varias líneas



vim pdf (12)

A veces quiero editar un cierto bloque visual de texto en varias líneas.

Por ejemplo, tomaría un texto que se ve así:

name comment phone email

Y haz que se vea 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 del bloque presionando V y luego j 4 veces.
  2. Sangrar con > .
  3. Regresa una letra con h .
  4. Ir al modo de bloque visual con ctrl v .
  5. Seleccione abajo 4 filas presionando j 4 veces. En este punto, ha seleccionado un bloque visual de 4x1 de espacios en blanco (4 filas, 1 columna).
  6. Presione c . Note esto bastante sangrado a la izquierda por una columna.
  7. Escriba un " vendor_" sin la cotización. Fíjate en el espacio extra que teníamos 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. Sangre a la inversa con < .

No necesito sangrar si hay al menos una columna de espacio 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 aclarar, ¿hay una manera de hacer lo que hice arriba sin crear el espacio en blanco necesario con sangría?

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 bloque visual vertical sobre el . , luego reinsértelo nuevamente durante el modo de inserción, es decir, escriba .whatever. . Esperemos que ahora puedas ver el inconveniente de este método. Estoy limitado a seleccionar solo una columna de texto que sea igual en posición vertical .


  1. Mueva el cursor al n en name .
  2. Entrar en modo de bloqueo visual ( ctrl v ).
  3. Presiona j tres veces (o 3j ).
  4. Presione I (mayúscula i).
  5. Escriba vendor_ .
  6. Presione esc .

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


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

    • I : Insertar antes de lo seleccionado.
    • A : Anexar después de lo seleccionado.
    • C : Reemplaza lo que está seleccionado.
  3. Escribe el nuevo texto.

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

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

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

:%norm IXYZ

¿Que esta pasando aqui?

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

Entonces pulsas enter, y se ejecuta.

Específico a su solicitud:

:%norm Ivendor_

También puedes elegir un rango particular:

:2,4norm Ivendor_

O ejecutar sobre un rango visual seleccionado:

:''<,''>norm Ivendor_


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

  1. Mueve el cursor donde quieras comenzar.
  2. Presiona I
  3. Escriba el prefijo que desee (por ejemplo, vendor_ )
  4. Presione esc .
  5. Presiona j para bajar una linea
  6. Tipo . para repetir la última edición, insertando automáticamente el prefijo de nuevo
  7. Alternar rápidamente entre j y .

Considero 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 fácilmente presionando j extra s.

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


Quería comentar muchas 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 incómodo. Así es como lo hice.

  1. Abrir 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 comienzo de línea con "#", ¿cómo?

:35,77s/^/#/

Nota: los números son inclusivos, 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 lenguajes 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


Supongamos que tiene este archivo:

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

Desea agregar "vendedor_" 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 pedirá confirmación. Puedes dejar eso si no quieres 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

Puede simplemente seleccionar el bloque visual "Mundo" en ambas líneas.

Teclee c para el cambio: ahora estará en el modo de inserción.

Inserta las cosas que quieras y pulsa escapar.

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


Usaría una macro para registrar mis acciones, luego la repetiría.

  1. Ponga su cursor en la primera letra del nombre.
  2. Pulse qq para iniciar la grabación en el búfer q .
  3. Presione i para entrar en el modo de inserción, y escriba vector_ , luego vector_ ESC para salir del modo de inserción.
  4. Ahora pulsa 0 para volver al principio de la línea.
  5. Ahora pulsa j para bajar.
  6. Ahora pulsa q nuevo para detener la grabación.

Ahora tienes una bonita macro.

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


Actualizado enero 2016

Si bien la respuesta aceptada es una gran solución, esta es en realidad una cantidad ligeramente menor de pulsaciones de teclas y se escala mejor; se basa en principio en la respuesta aceptada.

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

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

Si tiene los 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 se puede cambiar a # G, donde # es el número de línea deseado.

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


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


:%s/^/vendor_/

¿O me estoy perdiendo algo?


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