2010-09-03 6 views
229

Me encanta vim, pero uno de gotcha común es:¿Alguna forma de eliminar en vim sin sobreescribir su último tirón?

  • tirón una línea
  • ir a donde le gustaría para pegarlo
  • borrar lo que hay
  • pegar su tirón, sólo para descubrir que pega lo que acaba de eliminar

Obviamente, el flujo de trabajo es eliminar primero, yank segundo. Pero sería reeeeeaaaaaalllly nice si no lo hice tiene a. ¿Alguien tiene un truco para esto? ¿Vim tiene un buffer de pegado que funciona bien, o hay una configuración .vimrc que puedo cambiar?

+3

Vi purists me odiarán por esto, pero también podría usar el comportamiento * mswin *. Te permite usar Ctrl-C y Ctrl-V para copiar y pegar. Utiliza su propio registro, por lo que puede 'yy' y' dd' tanto como desee. Para usar este comportamiento, agregue estas líneas a su * .vimrc *: 'fuente $ VIMRUNTIME/mswin.vim' y' behave mswin'. –

+6

@Cristian - usa el registro '*'. Puede usar comandos vim para tirar de movimientos arbitrarios al portapapeles del sistema, p. '" * y/foo 'se moverá al siguiente" foo "en el portapapeles de Windows. (Con mswin/Ctrl-C, primero deberá pasar al modo visual) –

+0

@ dash-tom-bang: sí , No estaba recordando qué registro era. –

Respuesta

272

Pase al registro _, el agujero negro.

Para eliminar una línea sin que se pegue en los registros:

"_dd 

Ver también :help registers.

Probablemente sea más seguro, si desea pegar algo una y otra vez, arrastrarlo a un registro "nombrado".

"aY 

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

+9

Ja, no sabía sobre el registro de agujero negro. Gracias por la iluminación – DarkDust

+12

El registro del agujero negro es un camino por recorrer aquí, pero a veces encuentro: Vp una buena alternativa, ya que es más corta. Tenga en cuenta que el registro sin nombre se completará con el texto seleccionado previamente. –

+3

+1 por mencionar el registro de agujero negro. –

1

Usted podría utilizar registros: "<register><command>

Ejem:

Esto da un tirón una línea en el registro a, borra una línea diferente, y luego pastas registran a

"ayy` (move) `dd"aP 
+7

Conocido como "registros" para vim. "Buffers" significa algo más. – lessthanideal

4

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 (misma)
  • traslado a la nueva ubicación (misma)
  • pasta de línea de un tirón (era el paso 4)
  • de borrado de líneas que no desea (era el paso 3)

De acuerdo, generalmente uso una med registrarse para este tipo de cosas, pero a veces la solución es más simple de lo que primero se me viene a la mente.

+1

En la misma línea, podría reemplazar los últimos dos pasos con "seleccionar la línea o líneas para eliminar con' V' "y luego" pegar sobre ellas con 'p'". –

+0

^que, como la gente ha tenido que comentar muchas otras respuestas de este sabor, viene con la advertencia de que el registro de tirón se cambia para contener las líneas que acabas de reemplazar. no es fatal para cada situación, pero vale la pena señalar –

23

utilizo el siguiente mapeo de hacer borrar al agujero negro registrar un poco más fácil:

nnoremap R "_d 

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

+3

Preferiría 'nnoremap d" _d' por lo que 'dd' permanece' dd' y del mismo modo 'd $' etc. – abhishek77in

+2

si lo hiciera, no se convertiría en "_d" _d (no es lo que quieres)? – vitiral

38

otra posibilidad es:

tire sus líneas como lo haría normalmente

ir a donde desee pegar ellos, entrar en el modo de línea visual (V)

seleccionar las líneas que desea reemplace

pulse p para pegar sus líneas.

esto también tiene el beneficio añadido, que la memoria intermedia se "intercambian" con el contenido reemplazados

+0

Un gran consejo: esto es definitivamente algo que necesito a veces. Sin embargo, encuentro que 'X' y' P' (manteniendo presionada la tecla shift) tienden a hacer un mejor trabajo con las nuevas líneas –

+4

. 'es en realidad un obstáculo, ya que le impide repetir su operación de pegar nuevamente. Como se mencionó en el ejemplo superior ** [aquí] (http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text) **. Alternativamente, ** [esta pregunta] (http://stackoverflow.com/questions/12625722/vim-toggling-buffer-overwrite-behavior-when-deleting/) ** sugiere una reasignación que es probablemente la más elegante: 'vnoremap p" _dp' y 'vnoremap P" _dP' Creo que esta es la mejor solución en combinación con su 'v' – mikew

+0

El beneficio y O sugerido es exactamente lo que el OP no quiere, y exactamente por qué hizo esta pregunta en primer lugar. – fiatjaf

158

Su línea arrancado todavía debe estar en el registro 0 . lo mismo ocurre con

"0p 

para pegar la línea (y borra siempre que lo desee)

+1

Esto funciona realmente bien. – Kris

+5

[': help" 0'] (http://vimdoc.sourceforge.net/htmldoc/change.html#quote0): "El registro 0 numerado contiene el texto del comando yank más reciente, a menos que el comando especifique otro registro con '" x'. " –

+2

¡Esta es probablemente la solución más simple pero efectiva! Descubrí que todo lo que necesito es el tirón más reciente en 99% de los casos. ¡Y este truco simplemente rasca la comezón! –

4

escribí this plugin (yankstack.vim) para resolver t Su problema. Te da algo como Emacs's kill ring para vim. Puede arrastrar o eliminar varias cosas, hacer un pegado y luego avanzar y retroceder en el historial de texto extraído/eliminado. Encuentro que es más fácil que tener que recordar en qué registro me tiré algo.

En mi .vimrc, tengo estas asignaciones:

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

la que me Hit ALT-p o ALT-SHIFT-p para el ciclo de ida y vuelta a través de mi historia pasta.

1

Encuentro todas estas combinaciones de teclas engorrosas. En su lugar, escribí una función para alternar entre el comportamiento de "efecto secundario" de vim de sobreescribir búferes de operaciones de eliminación. De esta forma, puede desactivarlo, eliminarlo libremente y luego volver a encenderlo cuando haya terminado.

Véase mi respuesta aquí: https://stackoverflow.com/a/12649560/778118

Para usarlo sólo hay que poner en su .vimrc

72

Todo tirón y eliminar las operaciones de escritura al registro sin nombre por defecto. 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 tiene el tirón más reciente. Los registros 1-9 contienen las 9 eliminaciones más recientes (siendo el más reciente el 1).

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 utilizando comillas dobles, por lo que pegar el texto más recientemente un tirón se puede hacer así:

"0p 

Ésta es una excelente referencia:

+8

Esta es, de lejos, la mejor respuesta aquí. Gracias. – Stickley

+0

Siempre me he preguntado por qué era tan impredecible que el texto de registro que había tirado o eliminado terminaría en, y por qué a veces se sobrescribía y otras veces no. Gracias por esta información! – frankster

+6

Tenga en cuenta que el 1-9 registros solo acostumbrarse cuando el tirón o la eliminación es al menos o ne línea larga. http://vimdoc.sourceforge.net/htmldoc/change.html#quote_number –

0

Si es un usuario malvado, puede considerar reasignar X para hacer el equivalente a "_d. Sin embargo, perfeccionar la implementación fue Es 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á análogamente a dd, al igual que X $ a d $, X0 a d0, etc. ...

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

0

El truco es que sabes que quieres agarrar algo y moverte, y estás usando el primer registro "flojo" (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: echa un vistazo a sus registros con :reg

ahora, se selecciona un nuevo registro pulsando " antes de cualquier comando (en modo comando, obviamente)

  1. seleccionar lo que quiere "cortar" (o en el paso 2 especificar un rango)
  2. Cambiar registro a nada (1 aquí) y borrar: "1d o "1x o incluso "1c
  3. ir al nuevo lugar, eliminar algunos más
  4. Ahora ya está listo para pegar lo que se corta y se almacena 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 se dirige a un destino diferente ... simplemente ponga una en "1 otra en "2 y así sucesivamente ... vaya a cada destino y pegue.

7
" 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 
Cuestiones relacionadas