¿Cómo eliminar (no cortar) en Vim?

145

¿Cómo puedo eliminar una línea sin ponerla en mi búfer predeterminado?

Ejemplo:

line that will be copied.

line that I want to be substitued with the previous one.

Lo que estoy tratando de hacer:

yy
dd
p

Pero Vim reemplaza la cadena copiada reciente con la eliminada (cortada). Sé que puedo usar tampones como, "1yy, dda continuación "1p, pero siempre me olvido de poner la cadena de copiado de una memoria intermedia entonces necesito para pegar el contenido de mi primera (línea que se va a copiar) y elimine lo que quiero (línea que yo quiero para ser sustituido con el anterior.)

¿Cómo puedo realmente eliminar un texto en Vi (m) sin copiarlo?

Otra pregunta relacionada es ¿cómo puedo reenviar eliminar una palabra en modo de inserción? Quiero algo similar a Ctrl+ w.

MaikoID
fuente

Respuestas:

130

Utilice la opción "Registro agujero negro", "_a algo realmente borrado: "_d.
Use "_dPpara pegar algo y mantenerlo disponible para pegarlo más.

Para la segunda pregunta, podrías usar <C-o>dw. <C-o>se utiliza para ejecutar un comando normal sin salir del modo de inserción .

Puede configurar sus propias asignaciones para guardar la escritura, por supuesto. Tengo estos:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
romainl
fuente
Gracias, respondes mis dos preguntas. Pero no entendí cómo estos comandos noremap me ayudarán. ¿Estoy perdiendo la función de corte, verdad?
MaikoID
3
No, dtodavía "corta" y paún "pega", mientras que <leader>delimina de forma real y <leader>pdesecha el texto seleccionado y pega el contenido del registro predeterminado. <leader>pme permite pegar el mismo texto varias veces sin tener que usar registros con nombre.
romainl
119

El registro de agujeros negros "_ hará el truco, pero hay una mejor solución:

Cuando ingresa la línea de regreso con el pcomando, está pegando el contenido del registro predeterminado (volátil) "", que ha sido sobrescrito por dd. Pero aún puede pegar desde el registro de extracción (no volátil) "0, que no se sobrescribirá con el comando eliminar dd.

Entonces, estos son los comandos que desea usar según su ejemplo:

yy
dd
"0p
linda maquina
fuente
1
Genial, esta debería ser la respuesta aceptada. Es mucho más fácil especificar manualmente un registro cada vez que quiero pegar que seguir especificando un registro cada vez que borro algo.
JShorthouse
44

Esa es una de las cosas que no me gusta de vim ... Terminé mapeando ddel registro de agujeros negros en mi .vimrc y la vida ha sido buena desde:

nnoremap d "_d
vnoremap d "_d
kprobst
fuente
66
entonces, ¿cómo se corta?
VitalyB
11
v/Vcon xtambién se corta. Y cortar con xtambién es coherente con Ctrl + xcualquier sistema operativo.
WesternGun
22

producirán los siguientes mapeos:

  • d => "eliminar"
  • líder d => "cortar"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

Además, es una buena práctica tener la tecla "líder" configurada en coma, por ejemplo:

let mapleader = ","
let g:mapleader = ","

estos 2 fragmentos harán que ", d" sea su nuevo comando de corte.

Si desea utilizar estas asignaciones junto con una configuración de portapapeles del sistema compartido, consulte más detalles en https://github.com/pazams/d-is-for-delete

pazams
fuente
Desearía poder votar esta respuesta más de una vez: estaba usando la respuesta de kprobst pero luego para cortar una línea, tuve que usar una yyddque era un poco insostenible en mis dedos ;-).
Tahir Hassan
1
Intellij idea actuando tan raro después de esto. dd no hace nada. , d no hace nada
s1n7ax
Me gusta mucho la solución. Una cosa que no funcionó para mí es cortar líneas ,dd. Después de agregarlo nnoremap <leader>dd ""ddcomenzó a funcionar
Alexey
8

Puede usar "_dpara evitar que las cosas sobrescriban su texto arrancado. Puede almacenar texto eliminado o eliminado en cualquier registro que desee ", y _es el registro 'agujero negro', donde envía cosas que no le importan.

Para más información puede escribir :help "_o:help deleting

Alex
fuente
-1
yy
Vx
p

Cuando xesté en modo visual, eliminará la selección, por lo tanto, si desea eliminar una línea completa, primero presione Vpara seleccionar la línea en modo visual y luego presione xpara eliminar la selección.

Atemu
fuente
3
Esto copia la línea eliminada en el portapapeles, que es exactamente lo que OP quiere evitar.
aVeryStableGenius
¡Gracias! De alguna manera, esto funciona perfectamente en el complemento Evil de Emacs
Pedro Penna