¿Alguna forma de borrar en vim sin sobrescribir tu último yanqui? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Me encanta vim, pero un gotcha común es:

  • tira de una línea
  • vaya a donde le gustaría pegarlo
  • eliminar lo que hay
  • pega tu yanqui, solo para descubrir que pega lo que se acaba de eliminar

Obviamente el flujo de trabajo es eliminar primero, yank segundo. Pero sería reeeeeaaaaaaalllly agradable si no tener a. Alguien tiene un truco para esto? ¿Vim tiene un búfer de pasta que funciona bien, o hay un .¿puedo cambiar la configuración de vimrc?

 245
Author: Sagar Jain, 2010-09-03

13 answers

Pasa al registro _, el agujero negro.

Para borrar una línea sin pegarla en los registros:

"_dd

Véase también :help registers.

Probablemente sea más seguro, si quieres pegar algo una y otra vez, tirarlo en un registro "con nombre".

"aY

Lanza una línea en el registro a. Pégalo con "ap.

 289
Author: dash-tom-bang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-24 19:27:19

Su línea arrancada aún debe estar en el registro 0. También

"0p

Para pegar la línea (y borrar cuando quieras)

 164
Author: mb14,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-06 13:24:43

Todas las operaciones de yank y delete se escriben en el registro sin nombre por defecto. Sin embargo, el yanqui más reciente y el borrado más reciente siempre se almacenan (por separado) en los registros numerados. El registro 0 contiene el yanqui 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 yanqui más reciente en el registro sin nombre, pero todavía está allí en el registro 0. El blackhole-register trick ("_dd) mencionado en las otras respuestas funciona porque evita sobrescribir el registro sin nombre, pero no es necesario.

Usted hace referencia a un registro usando comillas dobles, por lo que pegar el texto más reciente se puede hacer de la siguiente manera:

"0p

Esta es una excelente referencia:

 78
Author: Wayne Burkett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-25 12:45:56

Otra posibilidad es:

Tira de tus líneas como lo harías normalmente

Vaya a donde desea pegarlos, ingrese al modo de línea visual (V)

Seleccione las líneas que desea reemplazar

Pulsa p para pegar tus líneas.

Esto también tiene el beneficio añadido, que el búfer es "intercambiado" con el contenido reemplazado

 38
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-04 11:00:43

Utilizo la siguiente asignación para facilitar un poco la eliminación del registro del agujero negro:

nnoremap R "_d

De esta manera, dd se convierte en Rd y d$ se convierte en R$. Tenga en cuenta que R normalmente está obligado a entrar en el modo de reemplazo, pero descubrí que nunca lo usé, por lo que fue la clave más fácil de recordar para una función "realmente eliminar".

 23
Author: Jörn Horstmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-04 10:56:05
" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp
 8
Author: Pencilcheck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 00:32:59

Escribí este plugin (yankstack.vim) para resolver este problema. Te da algo como Emacs kill ring para vim. Puede tirar o eliminar varias cosas, hacer un pegado y luego ir y venir a través de su historial de texto tirado/muerto. Me parece más fácil que tener que recordar en qué registro tiré algo.

En mi .vimrc, tengo estas asignaciones:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

Que me permiten presionar ALT - p o ALT-SHIFT-p para ir y venir a través de mi pasta historia.

 5
Author: max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-03 10:59:56

Para su pregunta específica, como se le preguntó, ¿no podría simplemente cambiar el orden de los últimos 2 pasos?

  • línea de yanqui (misma)
  • mover a una nueva ubicación (mismo)
  • pegar la línea arrancada (fue paso 4)
  • eliminar la línea que no desea (fue paso 3)

Concedido, suelo usar un registro con nombre para este tipo de cosas, pero a veces la solución es más simple de lo que primero viene a la mente.

 4
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-04 08:29:52

También puede probar el siguiente script: ReplaceWithRegister at vim.org/scripts /

 1
Author: dmedvinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-15 16:47:08

Encuentro todos estos combos de teclas engorrosos. En su lugar, escribí una función para activar y desactivar el comportamiento de "efectos secundarios" de vim de sobrescribir los búferes de las operaciones de eliminación. De esa manera, puedes desactivarlo, eliminarlo libremente y volver a activarlo cuando hayas terminado.

Ver mi respuesta aquí: https://stackoverflow.com/a/12649560/778118

Para usarlo simplemente póngalo en su .vimrc

 1
Author: Magnus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:37

Puedes usar registros: "<register><command>

Ej:

Esto tira de una línea en register a, elimina una línea diferente, y luego pega register a

"ayy` (move) `dd"aP
 1
Author: DarkDust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-09 20:27:51

Si eres un usuario malvado, puedes considerar reasignar X para hacer el equivalente de "_d. Sin embargo, perfeccionar la implementación fue un poco complicado para mí. Sin embargo, encontré que

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

Se integra muy bien. Por ejemplo, escribir XX funcionará de forma análoga a dd, al igual que X to a d d, X0 a d0, etc...

Si tiene curiosidad sobre cómo funciona, "95" representa el "_ register, por lo que simplemente redirige su llamada para eliminar como si "_ hubiera sido el registro presionado.

 0
Author: RussellStewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-26 21:55:44

El truco es que sabes que quieres agarrar algo y moverte, y estás usando el primer registro 'perezoso' (que se reemplaza por lo que acabas de eliminar).

Necesitas aprender a "cortar" en vim.

Antes de eliminar, especifique cualquier registro diferente del ". Consejo: echa un vistazo a tus registros con :reg

Ahora, seleccione un nuevo registro presionando " antes de cualquier comando (en modo comando, obviamente)

  1. seleccione lo que desea " cortar" (o en el paso 2 especifique un rango)
  2. Cambie el registro a cualquier cosa (1 aquí) y elimine: "1d o "1x o incluso "1c
  3. ir a un nuevo lugar, borrar un poco más
  4. ahora está listo para pegar lo que cortó y almacenó en el registro 1: "1p o "1P

Hecho. esto también tiene la ventaja de resolver el caso de uso: eliminar 5 cosas diferentes de un lugar, y cada pieza va a un destino diferente... solo pon uno en "1 otro en "2 y así sucesivamente... ir a cada destino y pegar.

 0
Author: gcb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-14 21:17:34