tutorial texto salir insertar español editar como comandos comando vim replace vim-registers

salir - ¿En Vim hay una forma de eliminar sin poner texto en el registro?



vim linux (20)

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 mismo entra en el registro que borra el bloque que acabo de borrar. Así que tengo el hábito de tirar, luego insertar, luego borrar lo que no quería, pero con grandes bloques de código, se complica al intentar mantener separados el bloque insertado y el bloque para eliminar.

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

  • ¿Hay alguna forma de eliminar texto sin ponerlo en el registro?
  • hay una manera de decir, por ejemplo, "reemplazar la siguiente palabra" o "reemplazar hasta el siguiente párrafo"
  • ¿O es la mejor manera de usar de alguna manera la función de registro múltiple?

A menudo me equivoco cuando sigo las órdenes de ''y''ank luego'' "_d''elete 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.


Bueno, primero haz este comando:

:h d

Entonces te darás cuenta de que puedes borrar en un registro específico. De esa manera no alterarás lo que está en tu registro predeterminado.


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

Por ejemplo, eliminamos "foo" y eliminamos "barra". ¡El registro 0 todavía contiene "foo"! Por lo tanto, "foo" se puede pegar usando "0p


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


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

Luego, puede eliminar las líneas reemplazables normalmente y pegar el texto copiado usando "*p .



Es útil tener un mapeo 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''), simplemente puede seleccionar el texto que desea reemplazar y 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


Las dos soluciones que utilizo en los contextos correctos son;

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

Lo uso 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 el enlace de teclas <ctrl>+<p> para reemplazar el registro numerado anterior con el que acaba de pegar.

Básicamente, se trata de pegar como lo haría, pero cuando se da cuenta de que ya ha sobrescrito el registro predeterminado, perderá lo que realmente quería pegar, ¡puede <CP> encontrar y reemplazar el historial de YankRing!

Uno de esos debe tener complementos ...


Para ''reemplazar palabra'', intente cw en modo normal.

Para ''reemplazar párrafo'', pruebe la cap en modo normal.


Para aquellos de ustedes que están interesados ​​principalmente en no sobrescribir el registro sin nombre al reemplazar un texto a través de la selección virtual y pegar.

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

xnoremap <expr> p ''pgv"''.v:register.''y''

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

Pasa la selección primero, luego se selecciona de nuevo la selección con el nuevo texto (gv). Ahora el registro que se usó por última vez en el modo visual (normalmente el registro sin nombre, pero también funciona sin efectos secundarios si utiliza otro registro para pegar). Y luego tirar el nuevo valor al registro de nuevo.

PD: Si necesita una variante más simple que funcione también con la simulación vim de plugin de intellj idea, puede tomar esta (desventaja: sobrescribir el registro sin nombre incluso si se dio otro registro para pegar):

vnoremap p pgvy


Para el ejemplo específico que dio, si entiendo la pregunta, 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)


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.


Para enfatizar lo que dijo EBGreen :

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

Si desea copiar 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, por último, echa un vistazo a cW y cW para cambiar una palabra, incluyendo un espacio al final. (El uso de W mayúscula incluye puntuación.)


Para los usuarios de Dvorak, un método muy conveniente es simplemente eliminar el texto innecesario en el "1 registro en lugar del" _ registro de agujero negro, solo porque puede presionar "+ 1 con la misma pulsación de cambio y un movimiento rosado rápido desde 1 es la tecla inmediatamente arriba "en Dvorak (PLUS d está en la otra mano, lo que hace que todo el comando sea tan rápido como el infierno).

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


Para los usuarios de emacs-evil, la función (evil-paste-pop) puede activarse después de pegar, y alternar entre las entradas anteriores en el kill-ring. Suponiendo que lo hayas vinculado a <Cp> (predeterminado en Spacemacs), deberías pulsar p seguido de tantos <Cp> como sea necesario.


Pongo 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 le doy un tirón al registro del portapapeles, y no tengo que preocuparme por lo que sucede con el registro predeterminado. Un beneficio adicional es que puedo pegar desde otras aplicaciones con una molestia mínima. Estoy perdiendo algo de funcionalidad, lo sé, pero de todos modos no puedo hacer un seguimiento de más de un registro / portapapeles.


Sí. Es un poco más complicado que eliminar primero el texto "antiguo", pero:

Empiezo con ...

line1 line2 line3 line4 old1 old2 old3 old4

Cambio + v selecciono línea 1, línea 2, 3 y 4, y las elimino con el comando d

Luego borro las viejas 1-4 líneas de la misma manera.

Entonces hazlo

"2p

Eso pegará la segunda última línea tirada (línea 1-4). "3p hará el tercero desde el último, y así sucesivamente ..

Así que termino con

line1 line2 line3 line4

Referencia: documentación de Vim en el registro numerado.


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

Lo que desea hacer es usar el modo visual para seleccionar la fuente, luego jalar, luego usar el modo visual nuevamente para seleccionar el alcance del destino y luego pegar en el texto desde el búfer predeterminado.

Ejemplo:

En un archivo de texto con:

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

con la siguiente secuencia: ggVjyGVkp terminarás con:

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

Explicado:

  • gg : ir a primera línea
  • V : inicia el modo visual con líneas enteras
  • j : bajar una línea (con la selección iniciada en las líneas anteriores, aumenta la selección una línea hacia abajo)
  • y : yank al búfer predeterminado (las dos líneas seleccionadas, y automáticamente sale del modo visual)
  • G : ir a la última línea
  • V : iniciar modo visual (igual que antes)
  • k : subir una línea (como antes, con el modo visual habilitado, esto aumenta la selección una línea hacia arriba)
  • p : pegar (con la selección en las dos últimas líneas, reemplazará esas líneas con lo que haya en el búfer - las 2 primeras líneas en este caso)

Esto tiene el pequeño inconveniente que pone el último bloque en el búfer, por lo que de alguna manera no se desea para los pegados repetidos de la misma cosa, así que querrá guardar la fuente en un búfer nombrado con algo como "ay (a un búfer llamado "a") y pegue con algo como "ap (pero luego, si está programando, probablemente no quiera pegar varias veces sino crear una función y llamarla, ¿correcto? ¿ DERECHO ?).

Si solo estás usando vi, entonces tendrás que usar marcas invisibles en lugar del modo visual :he mark para obtener más información sobre esto, lo siento, pero no soy muy bueno con estas marcas invisibles, estoy bastante contaminado con modo visual


Todas las operaciones de extracción y eliminación se escriben en el registro sin nombre de forma predeterminada. Sin embargo, el yank 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 aún está allí en el registro 0 . El truco de registro de "_dd ( "_dd ) mencionado en las otras respuestas funciona porque evita sobrescribir el registro sin nombre, pero no es necesario.

Hace referencia a un registro utilizando comillas dobles, por lo que puede pegar el texto más reciente y tirado de esta manera:

"0p

Esta es una excelente referencia:


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

El registro 0 siempre contiene el último yank (como Rafael , alex2k8 e idbrii ya han mencionado). Desafortunadamente, seleccionar el registro 0 todo el tiempo puede ser bastante molesto, por lo que sería bueno si p usa "0 por defecto. Esto se puede lograr al colocar 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 evita 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 bucle for. Lo mismo se hace para P .

De esta manera, se conserva el comportamiento estándar, excepto por los trazos p y P implícitos, que ahora usan el registro 0 de manera predeterminada.

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

noremap <LEADER>d "0d noremap <LEADER>D "0D

La clave del líder 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 varias teclas es bastante corto. Es posible que desee aumentarla para tener más tiempo al seleccionar un registro. Ver :help timeoutlen para más detalles, estoy usando:

set timeout timeoutlen=3000 ttimeoutlen=100