salir - vim linux
¿Alguna forma de eliminar en vim sin sobrescribir tu último tirón? (13)
Esta pregunta ya tiene una respuesta aquí:
Me encanta vim, pero una gotcha común es:
- tirar una línea
- Ve a donde quieras pegarlo
- borrar lo que hay
- pega tu yank, solo para descubrir que pega lo que acabas de eliminar
Obviamente el flujo de trabajo es borrar primero, tirar de segundo. Pero sería muy agradable si no tuviera que hacerlo. ¿Alguien tiene un truco para esto? ¿Vim tiene un búfer de pegado que funciona bien o hay una configuración .vimrc que puedo cambiar?
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).
Tienes que aprender a "cortar" en vim.
Antes de eliminar, especifique cualquier registro diferente al "
. Consejo: revise sus registros con :reg
ahora, selecciona un nuevo registro presionando "
antes de cualquier comando (en el modo de comando, obviamente)
- seleccione lo que desea "cortar" (o en el paso 2 especifique un rango)
- Cambie el registro a cualquier cosa (
1
aquí) y elimine:"1d
o"1x
o incluso"1c
- ir a nuevo lugar, borrar un poco más
- 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: borre 5 cosas diferentes de un lugar, y cada pieza va a un destino diferente ... solo coloque una en "1
otra en "2
y así sucesivamente ... vaya a cada destino y pegar.
Encuentro todos estos combos clave engorroso. En su lugar, escribí una función para activar y desactivar el comportamiento de "efectos secundarios" de vim de sobrescribir buffers de operaciones de eliminación. De esa manera, puedes simplemente desactivarlo, eliminarlo libremente y volver a activarlo cuando hayas terminado.
Vea mi respuesta aquí: https://.com/a/12649560/778118
Para usarlo solo ponlo en tu .vimrc
Escribí este plugin (yankstack.vim) para resolver este problema. Te da algo como el anillo de muerte de Emacs para vim. Puedes tirar o borrar varias cosas, hacer un pegado y luego ir y venir a través de tu historial de texto matado / tirado. Encuentro que es más fácil que tener que recordar en qué registro metí algo.
En mi .vimrc, tengo estas asignaciones:
nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste
lo que me permitió presionar ALT-p o ALT-SHIFT-p para recorrer mi historial de pegado.
Otra posibilidad es:
jala tus líneas como lo harías normalmente
vaya a donde desee pegarlos, ingrese al modo de línea visual ( V
)
Selecciona las líneas que quieres reemplazar.
pulsa p
para pegar tus líneas.
esto también tiene el beneficio adicional de que el búfer se "intercambia" con el contenido reemplazado
Para su pregunta específica, como se le preguntó , ¿no podría simplemente cambiar el orden de los últimos 2 pasos?
- línea de tirón ( igual )
- mover a nueva ubicación ( mismo )
- pegar línea tirada ( era el paso 4 )
- eliminar la línea que no quieres ( era el paso 3 )
Por supuesto, normalmente utilizo un registro con nombre para este tipo de cosas, pero a veces la solución es más simple de lo que primero se me ocurre.
Pasar al registro _
, el agujero negro.
Para borrar una línea sin pegarla en los registros:
"_dd
Ver también :help registers
.
Probablemente sea más seguro, si desea pegar algo una y otra vez, jalarlo en un registro "nombrado".
"aY
Yanks una línea en el registro. Pégalo con "ap
.
Podría usar los registros: "<register><command>
P.ej:
Esto coloca una línea en el registro a
, borra una línea diferente y luego las pastas registran a
"ayy` (move) `dd"aP
Si eres un usuario malvado, puedes considerar volver a asignar X para hacer el equivalente de "_d. Sin embargo, perfeccionar la implementación fue un poco difícil 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 manera análoga a dd, al igual que X $ a d $, X0 a d0, etc.
Si tiene curiosidad por saber cómo funciona, "95" representa el "_ registro, por lo que simplemente desvía su llamada para eliminarla como si" _ hubiera sido el registro presionado.
Su línea tirada todavía debe estar en el registro 0. Igual que
"0p
para pegar la línea (y eliminar cuando quieras)
También puede probar el siguiente script: ReplaceWithRegister at vim.org/scripts/
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:
Utilizo la siguiente asignación para facilitar la eliminación del registro en el agujero negro:
nnoremap R "_d
De esta manera, dd
convierte en Rd
y d$
convierte en R$
. Tenga en cuenta que R
normalmente está obligado a entrar en el modo de reemplazo, pero descubrí que nunca usé eso, por lo que fue la clave más fácil de recordar para una característica de "eliminar realmente".
" 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