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 ...
- Seleccione las 4 líneas de fila de un bloque presionando Vy luego jcuatro veces.
- Sangría con >.
- Regrese una carta con h.
- Ir a bloquear el modo visual con Ctrlv.
- Seleccione hacia abajo cuatro filas presionando jcuatro veces. En este punto, ha seleccionado un bloque visual de espacios en blanco de 4x1 (cuatro filas y una columna).
- Presione C. Observe esto prácticamente sangrado a la izquierda por una columna.
- Escriba un
" vendor_"
sin la cita. Observe el espacio extra que tuvimos que volver a poner. - Presione Esc. Esta es una de las pocas veces que uso Escpara salir del modo de inserción. Ctrlcsolo editaría la primera línea.
- Repita el paso 1.
- Sangrar 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 c.
Pero si tengo que borrar, ¿hay alguna forma de hacer lo que realicé anteriormente 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 Escover Ctrlc?
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 bloqueo visual vertical sobre el .
, y luego lo volvería a insertar durante el modo de inserción, es decir, tipo .whatever.
. Esperemos que ahora pueda ver el inconveniente de este método. Estoy limitado a seleccionar solo una columna de texto que sean todas iguales en posición vertical .
:s/models\./\0whatever./
\0
por&
.Respuestas:
n
adentroname
.I
(mayúscula i).vendor_
. Nota: Solo actualizará la pantalla en la primera línea, hasta que Escse presione (6.), momento en el cual se actualizarán todas las líneas.Se
I
debe usar una mayúscula en lugar de una minúsculai
, porque la minúsculai
se interpreta como el comienzo de un objeto de texto , que es bastante útil por sí solo, por ejemplo, para seleccionar dentro de un bloque de etiquetas (it
):fuente
j
o^L
. Deberías ver que Vim no estaba ocupado después de todo; solo estaba esperando. En segundo lugar, intente cambiar'timeout'
a un valor inferior, como80
(en lugar del predeterminado1000
) y observe que se agota el tiempo de espera más rápidamente.timeoutlen
no lo estimeout
.A
lugar deI
, que se insertará después del bloque seleccionado en lugar de antes. Sin embargo, si sus líneas tienen longitudes diferentes, eso no funcionará; Me gusta usar una sustitución que coincida con el final de cada línea para eso, por ejemplo, seleccionar algunas líneas y usarlas:s/$/inserted/
.Otro enfoque es usar el comando .(
dot
) en combinación con I.vendor_
)Encuentro que esta técnica es a menudo más rápido que el modo de bloque visual para un pequeño número de adiciones y tiene la ventaja añadida de que si no es necesario insertar el texto en cada línea en un rango que puede saltar fácilmente pulsando adicionales j's .
Tenga en cuenta que para un gran número de adiciones contiguas, el enfoque de bloque o macro probablemente será superior.
fuente
Prensa:
Escribe el nuevo texto.
fuente
Esc
para los novatos de VIM como yo: ¡me tomó un tiempo darme cuenta de que los cambios se propagan "más tarde"!v
? Puedo hacerloCtrl+V --> A
, perov
al seleccionar el texto no funciona,A
solo se agrega a esa línea. ¿No son ambos selección? Además, muy extraño:A
solo se agrega al final de la línea SI extiendo el bloque visual hasta el final de la línea; de lo contrario, se agrega donde termina el bloque visual para cada línea. Es como si no reconociera una diferencia entrea
yA
.c
lugar deC
, pero funcionó perfectamente bien. GraciasUsaría una macro para registrar mis acciones y luego la repetiría.
Ahora tienes una buena macro.
Escriba 3@qpara ejecutar su macro tres veces para hacer el resto de las líneas.
fuente
¿O me estoy perdiendo algo?
fuente
vender_
prefijo no es deseado.1,4s/^/vendor_/
V
y escribir:
. Prefijará la expresión ed con la:'<,'>
que se aplicará la ed solo a la selección con:'<,'>s/^/vendor_/
Actualizado en enero de 2016
Si bien la respuesta aceptada es una gran solución, en realidad es un poco menos pulsaciones de teclas y se escala mejor, en principio en función de la respuesta aceptada.
n
adentroname
.I
.vendor_
.Tenga en cuenta que esto tiene menos pulsaciones de teclas que la respuesta aceptada proporcionada (compare el Paso 3). Solo contamos la cantidad de j acciones a realizar.
Si tiene habilitados los números de línea (como se ilustra arriba) y conoce el número de línea al que desea moverse, entonces el paso 3 se puede cambiar a # Gdonde # 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.
fuente
Quería comentar muchas líneas en algún 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.
vi file
:set number!
o:set number
:35,77s/^/#/
Nota: los números son inclusivos, las líneas de la 35 a la 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 lenguajes como Python):35,77s/;$/;\/\/test/
(para lenguajes como Java)créditos / referencias:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
fuente
También puede tener un caso de uso en el que desea eliminar un bloque de texto y reemplazarlo.
Me gusta esto
A
Puede simplemente bloquear visualmente seleccionar "Mundo" en ambas líneas.
Escriba cpara el cambio: ahora estará en modo de inserción.
Inserta las cosas que quieras y presiona escapar.
Ambos se reflejan verticalmente. Funciona igual que 'I', excepto que reemplaza el bloque con el nuevo texto en lugar de insertarlo.
fuente
Supongamos que tiene este archivo:
Desea agregar "proveedor_" delante de "nombre", "comentario", "teléfono" y "correo electrónico", independientemente de dónde aparezcan en el archivo .
La
c
bandera le pedirá confirmación. Puede soltar eso si no desea la solicitud.fuente
Una alternativa que puede ser más flexible:
Ejemplo: para ingresar el texto XYZ al comienzo de la línea
¿Que esta pasando aqui?
%
== Ejecutar en cada líneanorm
== Ejecute las siguientes teclas en modo normalI
== Insertar al comienzo de la líneaXYZ
== El texto que desea ingresarLuego golpeas Enter, y se ejecuta.
Específico a su solicitud:
También puede elegir un rango particular:
O ejecutar sobre un rango visual seleccionado:
fuente
ctrl-v ctrl-[
para insertar un "Esc escapado", que lo devuelve al "modo normal" con el propósito de su comando normal. Acabo de probar esto con'<,'>norm Iaa^[ysiw"
, ¿dónde^[
está el Esc escapado?fuente
fuente