Come posso eliminare il file corrente in vim?


85

Come posso eliminare dal disco il file attualmente aperto da vim? Sarebbe bello chiudere anche il buffer.

Vedo che puoi usare NERDTree per questo , ma non uso questo plugin.

Risposte:


102

Usare uno strumento esterno come rm (1) va bene, ma Vim ha anche la sua delete()funzione per eliminare i file. Questo ha il vantaggio di essere portatile.

:call delete(expand('%'))

Un modo alternativo per esprimerlo è :call delete(@%), che utilizza il %registro (file corrente) (suggerimento di @accolade).

Per eliminare completamente il buffer corrente, sia la rappresentazione del file su disco che il buffer Vim, aggiungere :bdelete:

:call delete(expand('%')) | bdelete!

Probabilmente vorrai mapparlo in base alle tue preferenze.


7
Grazie! La seguente mappa del .vimrc sembra funzionare: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Potresti aggiungere la tua risposta.
fotanus

13
Quella mappatura non è l'ideale. Non vogliamo infrangere il rcomando! Meglio aggiungere il prefisso alla mappatura <Leader>....
glts

2
L'ho mappato a Ctrl + Canc usando nnoremap <C-Del> :call delete(expand('%'))<CR>ma non chiudo il buffer nel caso in cui accadesse per sbaglio; allora hai ancora la possibilità di salvarlo.
Evgeni Sergeev

3
:call delete(@%)|q!← Variante breve (se non vuoi mapparla). (Il buffer rimane :lse può essere ripristinato in :bquesto modo; mantiene il nome del file e le opzioni del buffer, ma non il contenuto del file.)
Aaron Thoma

2
@accolade, mi piace il tuo trucco, ma dovresti usarlo :call delete(@%)|bd!e usarlo :ls!con :bper far rivivere.
Bart Louwers

88

Dai un'occhiata a Elimina file con un comando Vim . La sezione Commenti dovrebbe avere quello che stai cercando:

Fondamentalmente, Rm cancellerà il file corrente; RM cancellerà il file corrente e chiuderà il buffer (senza salvare) in una volta sola.

In alternativa, puoi semplicemente emettere un comando di shell per rimuovere il file corrente:

:!rm %

1
È qualcosa di così semplice che quasi non riesco a credere di dover creare uno script per questo. Grazie.
fotanus

3
cancellando con !rm %, c'è un modo per evitare l'avviso quando vim torna nel buffer?
fotanus

1
Con alcuni caratteri speciali nel nome del file, questo comando non funzionerebbe, come se il nome del file fosse 20130711-contacts # 285.vcf, che ha spazio, verrebbe visualizzato 'rm: can't remove `20130711-contacts': No such file or directory '
Saeed

4
@ saeed144, nel caso di spazi in un nome di file (o altri caratteri che non si desidera interpretato a livello di shell), ti consigliamo di circondare il nome del file ( %) con le citazioni: !rm "%".
David Cain

8
PERICOLO DATI AVVERTENZA! Con solo %(percorso file (" nome file " nella terminologia vim) come originariamente invocato, potenzialmente relativo, ad esempio solo il nome del file) invece di %:p(percorso file assoluto) corri un piccolo rischio di eliminare invece un file con lo stesso nome in un'altra directory, se ti sei dimenticato di :cdesserci. Pertanto consiglio vivamente di utilizzarlo al %:pposto di %se lo mappi comunque.
Aaron Thoma

25

A volte un plugin può essere una soluzione interessante anche per un semplice problema. In questo caso siamo fortunati perché c'è eunuch.vim dell'onnipotente Tim Pope.

Nelle sue stesse parole fornisce eunuch.vim

Vim sugar per i comandi della shell UNIX che ne hanno più bisogno. Elimina o rinomina un buffer e il file sottostante allo stesso tempo. Carica un findo un locatenell'elenco di correzione rapida. E così via.

Perfetto. Ha ciò di cui abbiamo bisogno, oltre ad alcuni strumenti aggiuntivi se siamo su un sistema UNIX.

Il comando che stai cercando è

:Remove!

Di nuovo, rimappa se ne hai bisogno molto, ad es :nnoremap <Leader>rm :Remove!<CR>.


Stavo cercando un modo per fare a meno dei plugin, quindi accetterò l'altra tua risposta. Il plugin sembra buono :-)
fotanus

Questo plugin è abbastanza conveniente se avete bisogno di modi di Vim mv, mkdir, find, ecc altamente suggerisce.
Ehtesh Choudhury

5

Mi piace poter eliminare i file da vim, ma sono anche paranoico all'idea di eliminare accidentalmente lavori importanti che, per un motivo o per l'altro, non sono ancora sotto il controllo della versione. Trovo utile combinare le informazioni precedenti di @glts e @accolade con questa risposta su come utilizzare il confirmcomando per il prompt prima di uscire da vim.

Mettendoli insieme, ho aggiunto una funzione al mio ~/.vimrc, che richiede prima di eliminare il file e chiudere il buffer, e l'ho mappato a una combinazione di tasti:

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()

fun! DeleteFileAndCloseBuffer()
  let choice = confirm("Delete file and close buffer?", "&Do it!\n&Nonono", 1)
  if choice == 1 | call delete(expand('%:p')) | q! | endif
endfun

Se sei un tasto meno paranoico di me, puoi aggiungere <CR>alla prima riga

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()<CR>

e devi solo premere Invio una volta.


1
Consiglio vivamente di usarlo al expand('%:p')posto di @%quando lo script comunque. (Anche se sono lusingato che tu abbia incorporato il mio suggerimento :) il vantaggio della brevità è marginale in uno script. Ancora più importante %:p:) espanderà il nome del file in un percorso assoluto completo (che potrebbe già essere o meno). Con solo %corri un piccolo rischio di eliminare un file con lo stesso nome in un'altra directory, se ti sei dimenticato di :cdesserci.
Aaron Thoma

1
Grazie per averlo inventato! Ho aggiornato di conseguenza la mia risposta.
joelostblom

0

Puoi farlo con due passaggi:

  1. salva come nuovo file

    : w nuovo nomefile

  2. eliminare il vecchio file

    ! rm oldfilename


0

Questa potrebbe essere un'opinione impopolare, ma il tuo file tree explorer (Netrw / NerdTree) sarà il modo più semplice e sicuro per eliminare un file. Anche se OP non utilizza NerdTree, il plugin integrato Netrw funzionerà altrettanto bene.

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.