Come eliminare (non tagliare) in Vim?


145

Come posso eliminare una linea senza inserirla nel mio buffer predefinito?

Esempio:

line that will be copied.

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

Cosa sto cercando di fare:

yy
dd
p

Ma Vim sostituisce la recente stringa copiata con quella eliminata (tagliata). So che posso usare tamponi come, "1yy, ddallora "1p, ma mi dimentico sempre di mettere la stringa copiata in un buffer poi ho bisogno di incollare miei contenuti prima (linea che verrà copiato) e quindi eliminare quello che voglio (linea che voglio da sostituire con il precedente.)

Come posso veramente cancellare un testo in Vi (m) senza copiarlo?

Un'altra domanda correlata è come posso inoltrare eliminare una parola in modalità inserimento? Voglio qualcosa di simile a Ctrl+ w.


Risposte:


130

Utilizzare il "registro buco nero", "_per davvero cancellare qualcosa: "_d.
Usa "_dPper incollare qualcosa e tenerlo disponibile per ulteriori incollaggi.

Per la seconda domanda, potresti usare <C-o>dw. <C-o>viene utilizzato per eseguire un comando normale senza uscire dalla modalità di inserimento .

Naturalmente puoi impostare i tuoi mapping per salvare la digitazione. Ho questi:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP

grazie, rispondi a entrambe le mie domande. Ma non ho capito come mi aiuteranno questi comandi noremap. Sto perdendo la funzione di taglio, giusto?
MaikoID

3
No, d"taglia" pancora e "incolla" ancora, mentre <leader>delimina per davvero e <leader>pgetta via il testo selezionato e incolla il contenuto del registro predefinito. <leader>pmi permette di incollare lo stesso testo più volte senza dover usare registri con nome.
romainl

119

Il registro del buco nero "_ farà il trucco, ma esiste una soluzione migliore:

Quando si immette nuovamente la riga con il pcomando, si incolla il contenuto del registro predefinito (volatile) "", che è stato sovrascritto da dd. Ma puoi ancora incollare dal registro (non volatile) yank"0 , che non verrà sovrascritto dal comando delete dd.

Quindi questi sono i comandi che vuoi usare come nel tuo esempio:

yy
dd
"0p

1
Fantastico, questa dovrebbe essere la risposta accettata. È molto più semplice specificare manualmente un registro ogni volta che voglio incollare che continuare a specificare un registro ogni volta che elimino qualcosa.
JShorthouse,

44

Questa è una delle cose che non mi sono piaciute di vim ... Ho finito per mappare ddil registro del buco nero nel mio .vimrc e la vita è stata buona da allora:

nnoremap d "_d
vnoremap d "_d

6
allora come tagli?
VitalyB

11
v/Vcon xè anche tagliato. E tagliare con xè anche coerente con Ctrl + xqualsiasi sistema operativo.
WesternGun

22

le seguenti mappature produrranno:

  • d => "elimina"
  • leader d => "taglio"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

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

Inoltre, è una buona pratica avere il tasto "leader" impostato su virgola, ad esempio:

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

questi 2 frammenti renderanno ", d" il tuo nuovo comando di taglio.

Se si desidera utilizzare questi mapping insieme con una configurazione degli Appunti di sistema condivisa, vedere ulteriori dettagli su https://github.com/pazams/d-is-for-delete


Vorrei poter votare questa risposta più di una volta: stavo usando la risposta di kprobst ma poi per tagliare una linea, ho dovuto usare yyddche era un po 'insostenibile per le mie dita ;-).
Tahir Hassan,

1
intellij idea recitazione così strana dopo questo. dd non fa nulla. , d non fa nulla
s1n7ax

Mi piace molto la soluzione. Una cosa che non ha funzionato per me - è tagliare le linee con ,dd. Dopo nnoremap <leader>dd ""ddaverlo aggiunto ha iniziato a funzionare
Alexey il

8

È possibile utilizzare "_dper impedire alle cose di sovrascrivere il testo strappato. Puoi archiviare il testo strappato o cancellato in qualsiasi registro desideri ", ed _è il registro del "buco nero", dove invii cose che non ti interessano.

Per ulteriori informazioni è possibile digitare :help "_o:help deleting


-1
yy
Vx
p

In modalità visiva, xeliminerà la selezione, quindi se si desidera eliminare un'intera linea, premere prima Vper selezionare la linea in modalità visiva, quindi premere xper eliminare la selezione.


3
Questo copia la linea cancellata negli appunti che è esattamente ciò che OP vuole evitare.
aVeryStableGenius

Grazie! In qualche modo funziona perfettamente con il plugin Evac di Emacs
Pedro Penna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.