En Vim, ¿hay alguna manera de eliminar sin poner texto en el registro?

Usando Vim a menudo quiero reemplazar un bloque de código con un bloque que acabo de tirar.

Pero cuando borro el bloque de código que se va a reemplazar, ese bloque va al registro que borra el bloque que acabo de tirar. Así que tengo el hábito de tirar, luego insertar y luego eliminar lo que no quería, pero con grandes bloques de código, esto se complica al tratar de mantener el bloque insertado y el bloque para eliminar por separado.

Entonces, ¿cuál es la forma más ágil y rápida de reemplazar el texto en Vim?

  • ¿Hay alguna manera de eliminar texto sin ponerlo en el registro?
  • ¿Hay alguna manera de decir, por ejemplo, “reemplazar la próxima palabra” o “reemplazar hasta el próximo párrafo”?
  • o es la mejor manera de utilizar de alguna manera la función de registro múltiple?

Para eliminar algo sin guardarlo en un registro, puede usar el “registro de agujero negro”:

 "_d 

Por supuesto, también puede usar cualquiera de los otros registros que no contengan nada que le interese.

Sí. Es un poco más intrincado que borrar el texto “anterior” primero, pero:

Comienzo con …

 line1 line2 line3 line4 old1 old2 old3 old4 

Cambio + v seleccione la línea 1, línea 2, 3 y 4, y elimínelos con el comando d

Luego elimino las antiguas líneas 1-4 de la misma manera.

Entonces hazlo

 "2p 

Eso pegará las penúltimas líneas tiradas (línea 1-4). "3p hará el tercero de la última, y ​​así sucesivamente …

Así que termino con

 line1 line2 line3 line4 

Referencia: documentación de Vim en el registro numerado

Documentos VIM: El registro 0 numerado contiene el texto del comando yank más reciente, a menos que el comando especifique otro registro con [“x].

Por ejemplo, tiramos de “foo” y eliminamos “barra” – ¡el registro 0 todavía contiene “foo”! Por lo tanto, “foo” se puede pegar con "0p

Es útil tener una asignación fácil que le permite reemplazar la selección actual con el búfer.

Por ejemplo, cuando pones esto en tu .vimrc

 vmap r "_dP // it's a capital 'p' on the end 

luego, después de copiar algo en el registro (es decir, con ‘y’), puede simplemente seleccionar el texto que desea reemplazar y simplemente presionar ‘r’ en su teclado. La selección será sustituida por su registro actual.

Explicación:

 vmap - mapping for visual mode "_d - delete current selection into "black hole register" P - paste 

Puse lo siguiente en mi vimrc:

 noremap y "*y noremap Y "*Y noremap p "*p noremap P "*P vnoremap y "*y vnoremap Y "*Y vnoremap p "*p vnoremap P "*P 

Ahora salgo y lo coloco en el registro del portapapeles, y no me importa lo que ocurra con el registro predeterminado. Un beneficio adicional es que puedo pegar desde otras aplicaciones con una molestia mínima. Estoy perdiendo alguna funcionalidad, lo sé, pero de todos modos no puedo seguir más de un registro / portapapeles.

Para el ejemplo específico que diste, si entiendo la pregunta, entonces esto podría funcionar:

 *Highlight what you want to put somewhere else *delete (d) *Highlight the code that you want it to replace *paste (p) 

Todas las operaciones de extracción y eliminación escriben en el registro sin nombre de forma predeterminada. Sin embargo, la eliminación más reciente y la eliminación más reciente siempre se almacenan (por separado) en los registros numerados. El registro 0 contiene el tirón más reciente. Los registros 1-9 contienen las 9 eliminaciones más recientes (siendo 1 la más reciente).

En otras palabras, una eliminación sobrescribe el tirón más reciente en el registro sin nombre, pero todavía está allí en el registro 0 . El truco de registro de agujeros negros ( "_dd ) mencionado en las otras respuestas funciona porque evita sobrescribir el registro sin nombre, pero no es necesario.

Hace referencia a un registro usando comillas dobles, por lo que pegar el último texto extraído se puede hacer así:

 "0p 

Esta es una excelente referencia:

Para enfatizar lo que dijo EBGreen :

Si pega mientras selecciona texto, el texto seleccionado se reemplaza por el texto pegado.

Si desea copiar algo de texto y luego pegarlo en varias ubicaciones, use "0p para pegar. El registro numerado 0 contiene el texto del comando yank más reciente.


Además, puede enumerar los contenidos de todos sus registros:

 :registers 

Ese comando hace que sea más fácil averiguar qué registro desea al hacer algo como la respuesta de dbr . También verá los registros /,%, #. (Ver también :help registers )


Y finalmente, revise cW y cW para cambiar una palabra incluyendo y sin incluir un espacio al final. (Usar mayúscula W incluye puntuación).

Si estás usando Vim, entonces tendrás el modo visual, que es como seleccionar, pero con los modos de separación que son la base de vi / vim.

Lo que quiere hacer es usar el modo visual para seleccionar la fuente, luego tirar, luego usar el modo visual de nuevo para seleccionar el scope del destino, y luego pegar en el texto del buffer predeterminado.

Ejemplo:

En un archivo de texto con:

 1 |  qwer
 2 |  asdf
 3 |  zxcv
 4 |  Poiu

con la siguiente secuencia: ggVjyGVkp terminará con:

 1 |  qwer
 2 |  asdf
 3 |  qewr
 4 |  asdf

Explicado:

  • gg : ir a la primera línea
  • V : inicia el modo visual con líneas enteras
  • j : desciende una línea (con la selección iniciada en las líneas anteriores, crece la selección una línea hacia abajo)
  • y : acceda al buffer por defecto (las dos líneas seleccionadas, y automáticamente sale del modo visual)
  • G : ir a la última línea
  • V : iniciar el modo visual (igual que antes)
  • k : suba una línea (como antes, con el modo visual habilitado, esto hace que la selección se alinee)
  • p : paste (con la selección en las dos últimas líneas, reemplazará esas líneas con lo que haya en el buffer – las 2 primeras líneas en este caso)

Esto tiene el pequeño inconveniente de poner el último bloque en el búfer, por lo que de alguna manera no es deseable para repetidos pegados de la misma cosa, por lo que querrá guardar el origen en un buffer nombrado con algo como "ay (a un buffer llamado “a”) y pegar con algo como "ap (pero luego, si está progtwigndo, probablemente no desee pegar varias veces, sino crear una función y llamarla, ¿verdad? ¿A LA DERECHA ?).

Si solo está usando vi, entonces tendrá que usar marcas invisibles en lugar del modo visual :he mark más sobre esto, lo siento pero no soy muy bueno con esta marca invisible, estoy bastante contaminado con modo visual.

Para ‘reemplazar palabra’, prueba cw en modo normal.

Para ‘reemplazar el párrafo’, intente cap en modo normal.

Una solución mínimamente invasiva para los perezosos:

El registro 0 siempre contiene el último tirón (como ya han mencionado Rafael , alex2k8 e idbrii ). Desafortunadamente, seleccionar el registro 0 todo el tiempo puede ser bastante molesto, por lo que sería bueno si p usa "0 de manera predeterminada. Esto se puede lograr colocando las siguientes líneas en su .vimrc :

 noremap p "0p noremap P "0P for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] execute 'noremap "'.s:i.'p "'.s:i.'p' execute 'noremap "'.s:i.'P "'.s:i.'P' endfor 

La primera línea asigna cada trazo p a "0p .” Sin embargo, esto impide que p acceda a otros registros. Por lo tanto, todos los trazos p con un registro seleccionado explícitamente se asignan a la expresión de línea de comando equivalente dentro del ciclo for. Lo mismo se hace para P .

De esta forma, se conserva el comportamiento estándar, a excepción de los trazos implícitos p y P , que ahora usan el registro 0 por defecto.

Sugerencia 1: El comando de corte ahora es "0d lugar de simplemente d . Pero como soy perezoso, esto es demasiado largo para mí;) Por lo tanto, estoy usando la siguiente asignación:

 noremap d "0d noremap D "0D 

La tecla principal es \ por defecto, por lo que puede cortar texto fácilmente escribiendo \d o \D

Sugerencia 2: el tiempo de espera predeterminado para las asignaciones de teclas múltiples es bastante corto. Es posible que desee boostlo para tener más tiempo al seleccionar un registro. Ver :help timeoutlen para más detalles, estoy usando:

 set timeout timeoutlen=3000 ttimeoutlen=100 

Bueno, primero haz este comando:

 :hd 

Entonces se dará cuenta de que puede eliminar en un registro específico. De esta forma, no alterará lo que está en su registro predeterminado.

El texto eliminado, mientras está en el modo de inserción, no entra en el registro predeterminado.

Las dos soluciones que uso en los contextos correctos son;

  • resalte lo que desea reemplazar utilizando el modo VISUAL Vims y luego pegue el registro.

Uso esto principalmente por costumbre, ya que solo encontré la segunda solución mucho más tarde, por ejemplo

 yiw " yank the whole word viwp " replace any word with the default register 
  • YankRing . Con este complemento puede usar la combinación de teclas +

    para reemplazar el registro numerado anterior por el que acaba de pegar.

Básicamente, vas a pegar como lo harías, pero cuando te das cuenta de que desde entonces has sobrescrito el registro predeterminado, perdiendo así lo que realmente querías pegar, ¡puedes encontrar y encontrarlo en el historial de YankRing!

Uno de esos debe tener complementos …

En la versión de Windows (probablemente también en Linux), puede arrastrar el búfer de copiar / pegar del sistema usando "*y (es decir, antes de su comando yank con comillas dobles y asterisco).

A continuación, puede eliminar las líneas reemplazables normalmente y pegar el texto copiado con "*p .

A menudo me equivoco cuando sigo los comandos para ‘y’ luego ” _d’eletear en un agujero negro y luego ‘p’aste. Prefiero’ y’ank, luego borro lo que quiera, luego ” 0p ‘de el registro 0, que es donde se inserta el último texto copiado.

Encontré un mapeo muy útil para su propósito:

 xnoremap p "_dP 

El texto eliminado se coloca en “registro de agujero negro” y el texto extraído permanece.

Fuente: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

Para los usuarios de Dvorak, un método muy conveniente es simplemente eliminar texto innecesario en el registro de “1 registro en lugar de” _ agujero negro, aunque solo sea porque se puede presionar “+ 1 con el mismo desplazamiento y un movimiento rápido desde 1 la tecla inmediatamente arriba “en Dvorak (PLUS d es en cambio, lo que hace que todo el comando sea rápido como el infierno).

Entonces, por supuesto, el registro “1” podría usarse para otras cosas por su conveniencia, pero a menos que tenga un propósito más común que reemplazar el texto, diría que es un buen uso del registro.

Para aquellos de ustedes que están interesados ​​en no sobrescribir el registro sin nombre cuando reemplazan un texto a través de la selección virtual y lo pegan.

Puede usar la siguiente solución, que es fácil y funciona mejor para mí:

xnoremap p 'pgv"'.v:register.'y'

Es a partir de las respuestas (y comentarios) aquí: Cómo pegar sin sobreescribir el registro

Primero pasa la selección, luego se selecciona nuevamente la selección con el nuevo texto (gv). Ahora el registro que se utilizó por última vez en modo visual (normalmente el registro sin nombre pero también funciona sin efecto secundario si usa otro registro para pegar). Y luego tire el nuevo valor al registro nuevamente.

PD: si necesita una variante más simple que también funcione con intellj idea plugin vim-simulation puede tomar ésta (inconveniente: sobrescribir el registro sin nombre incluso si se dio otro registro para pegar):

vnoremap p pgvy