Realizar ciertas operaciones sin borrar el registro

30

Con frecuencia, en los archivos de configuración puedo copiar y pegar un bloque de líneas, luego quiero hacer pequeños cambios en ese bloque. Después de pegar, uso xpara eliminar los caracteres que quiero eliminar, luego paso a pegar el siguiente bloque. Excepto que xpone los caracteres eliminados en el portapapeles, así que tengo que volver a copiar el bloque de líneas.

¿Hay alguna manera de hacer esto sin entrar en modo de inserción?

durron597
fuente
Jasper encontró preguntas similares en Stack Overflow : [¿Alguna forma de eliminar en vim sin sobrescribir su último tirón? [duplicado]] ( stackoverflow.com/questions/3638542/… ) y en vim ¿hay alguna forma de eliminar sin poner texto en el registro?
Gilles 'SO- deja de ser malvado'

Respuestas:

35

Sus opciones son:

  1. Usa el registro de agujeros negros _. Por ejemplo, para eliminar una línea que escribiría "_dd. Esto se elimina sin afectar el portapapeles.
  2. Nombre explícitamente un registro para el yank original. Por ejemplo, para tirar de una línea en un registro con nombre, escribiría y "ayyluego para pegar, escribiría"ap
  3. Utilice los registros de extracción para recuperar la extracción original. Puede tirar, luego eliminar según sea necesario, luego, cuando vaya a pegar, escriba"0p
  4. Use un complemento como vim-easyclip para proporcionar un operador de corte que sea distinto del operador de eliminación (divulgación completa: escribí eso)

Corre :help registerspara obtener más detalles sobre los primeros 3

Steve Vermeulen
fuente
44
Entonces, ¿para xqué usarlo "_xentonces?
durron597
1
Eso es correcto.
Steve Vermeulen
2
@ durron597 si está eliminando un carácter a la vez x, probablemente debería aprender a eliminar eliminaciones como las dt)que elimina hasta el próximo paréntesis cercano d2Wque elimina las siguientes dos fichas separadas por espacios en blanco. Entonces podrías hacer algo como "_di{dentro de una región arriostrada, que es algo que hago todo el tiempo. En modo normal, esto significa " eliminar todo dentro de esta región arriostrada en el agujero negro "
OregonTrail
Agregado nnoremap x "_xa mi ~/.vimrc(explicación aquí: stackoverflow.com/questions/54255/… ).
Victoria Stuart
11

xno pone cosas en el portapapeles, las coloca en un registro . Si no le dice en qué registro colocarlo, lo coloca en el registro sin nombre, que por supuesto sobrescribe los contenidos anteriores. Entonces, en lugar de eso, dígale qué registro usar:, " REGISTER xdonde REGISTER es cualquier letra individual. Luego usa el mismo prefijo de registro de cotización ppara pegar desde ese registro. (Nota: las minúsculas reemplazan su contenido; las mayúsculas se agregan).

También hay dos registros especiales "0y "1. "0es el ytexto yanked ( ) más reciente , que permanecerá incluso si elimina algún texto con otro comando (like x). "1es el texto eliminado más recientemente, siempre que ese texto no sea pequeño (una línea). Entra un pequeño texto eliminado "-.

Finalmente, como señala Steve Vermeulen, puede decirle a vim que no guarde el texto eliminado especificando el registro de agujeros negros "_.

El comando de ayuda relevante es :help registers.

derobert
fuente
3

El :letcomando le permitirá redefinir un registro con nombre. En la línea de comando de vim, presionando Control+ R dos veces 1 y luego el nombre del registro pegará el contenido del registro en el comando. Luego, puede modificar lo que está pegado y guardar el registro con sus modificaciones.

Ejemplo:

  • En modo normal, en una línea que contiene el texto "Foo Bar", al escribir "fyytira de toda la línea ( yy) en el fregistro ( "f).
  • Escribe :let @f=', y Control+ r, Control+ rnuevamente, entonces f, y deberías verlo pegar en "Foo Bar", por lo que tu línea de comando ahora se lee :let @f='Foo Bar, con el cursor al final.
  • Ahora puede usar las flechas y eliminar teclas para editar lo que acaba de pegar, como :let @f='foo bar baz.
  • Termine la cita: :let @f='foo bar baz'y golpee Enter.

Ahora ha redefinido el contenido del fregistro para que sea "foo bar baz".

(¡Esto también funciona para macros! :help letPara más información).


1 Control + le rpermite insertar un registro cuando ya está en modo de inserción, como si estuviera escribiendo los caracteres. Usar esta secuencia dos veces es importante porque "el texto se inserta literalmente, no como si estuviera escrito. Esto difiere cuando el registro contiene caracteres como <BS>". - el insert.txt vimdoc,:help i_CTRL-R_CTRL-R

alxndr
fuente
0

En relación con el registro de agujeros negros "_mencionado por @derobert, puede encontrar un screencast útil en http://vimcasts.org/episodes/meet-the-yank-register/

Vim utiliza los términos eliminar, tirar y colocar, en lugar de la terminología más estándar de cortar, copiar y pegar. Comenzando con la misma letra, poner y pegar son fácilmente intercambiables. Una vez que te acostumbras a la palabra yank, se convierte en sinónimo de copy. Pero el uso de Vim de la palabra 'eliminar' es problemático. En la mayoría de los contextos, la palabra eliminar solo significa eliminar. Pero la operación de eliminación de Vim copia el texto en un registro y luego lo elimina del documento. En otras palabras, la operación de eliminación de Vim se comporta como un corte.

Marlon León
fuente
2
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones y, una vez que tenga suficiente reputación , podrá comentar cualquier publicación .
jamessan
Traté de comentar sobre la publicación original pero no pude. La única alternativa que tuve fue la que elegí @jamessan
Marlon León
0

Complemento Reemplazar con registro

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Sugiere el mapeo gr.

  1. tirón
  2. seleccione visualmente el texto que desea reemplazar y presione gr
  3. pasar al siguiente bloque que desea reemplazar

Alternativamente, use gr<text object>para hacerlo sin una selección visual. dot-repeat es compatible cuando se instalan los complementos repeat.vimde Tim Pope e visualrepeat.vimIngo Karkat.

Hotschke
fuente