Wie kann ich die aktuelle Datei in vim löschen?

85

Wie kann ich die aktuell geöffnete Datei aus vim von der Festplatte löschen? Wäre schön auch den Puffer zu schließen.

Ich sehe, dass Sie NERDTree dafür verwenden können , aber ich verwende dieses Plugin nicht.

fotanus
quelle

Antworten:

102

Die Verwendung eines externen Tools wie rm (1) ist in Ordnung, aber Vim verfügt auch über eine eigene delete()Funktion zum Löschen von Dateien. Dies hat den Vorteil, tragbar zu sein.

:call delete(expand('%'))

Eine alternative Möglichkeit, dies auszudrücken, ist :call delete(@%)die Verwendung des %Registers (aktuelle Datei) (Tipp von @accolade).

Um den aktuellen Puffer vollständig zu löschen, fügen Sie sowohl die Dateidarstellung auf der Festplatte als auch den Vim-Puffer hinzu :bdelete:

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

Sie möchten dies wahrscheinlich nach Ihren Wünschen zuordnen.

glitzert
quelle
7
Vielen Dank! Die folgende Karte in der .vimrc scheint zu funktionieren : nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Vielleicht möchten Sie Ihre Antwort hinzufügen.
Fotanus
13
Diese Zuordnung ist nicht ideal. Wir wollen den rBefehl nicht brechen ! Stellen Sie Ihrem Mapping besser ein Präfix voran <Leader>....
glitzert
2
Ich habe es mit Strg + Entf zugeordnet, nnoremap <C-Del> :call delete(expand('%'))<CR>aber ich schließe den Puffer nicht, falls es versehentlich passiert. dann haben Sie noch eine Chance, es zu speichern.
Evgeni Sergeev
3
:call delete(@%)|q!← Kurze Variante (wenn Sie sie nicht zuordnen möchten). (Der Puffer bleibt in :lsund kann auf :bdiese Weise wiederbelebt werden; er behält die Dateinamen- und Pufferoptionen bei, aber nicht den Dateiinhalt.)
Aaron Thoma
2
@accolade, ich mag dein Trick, aber Sie müssten verwenden :call delete(@%)|bd!und die Verwendung :ls!mit :bwieder zu beleben.
Bart Louwers
87

Schauen Sie sich Dateien mit einem Vim-Befehl löschen an . Der Kommentarbereich sollte das enthalten, wonach Sie suchen:

Grundsätzlich löscht Rm die aktuelle Datei. RM löscht die aktuelle Datei und beendet den Puffer (ohne zu speichern) auf einmal.

Alternativ können Sie einfach einen Shell-Befehl ausgeben, um die aktuelle Datei zu entfernen:

:!rm %
David Cain
quelle
1
Es ist so einfach, dass ich fast nicht glauben kann, dass ich dafür ein Skript erstellen muss. Vielen Dank.
Fotanus
3
Gibt !rm %es eine Möglichkeit, die Warnung zu vermeiden, wenn vim zum Puffer zurückkehrt?
Fotanus
1
Mit einigen Sonderzeichen im Dateinamen würde dieser Befehl nicht funktionieren. Wenn der Dateiname 20130711-Kontakte # 285.vcf lautet und Leerzeichen enthält, wird "rm: 20130711-Kontakte können nicht entfernt" angezeigt: Keine solche Datei oder Verzeichnis '
Saeed
4
@ saeed144 Bei Leerzeichen in einem Dateinamen (oder anderen Zeichen, die nicht auf Shell-Ebene interpretiert werden sollen) möchten Sie den Dateinamen ( %) mit Anführungszeichen umgeben : !rm "%".
David Cain
8
DATENGEFAHR WARNUNG! %Wenn nur (Dateipfad (" Dateiname " in der vim-Terminologie)) wie ursprünglich aufgerufen, möglicherweise relativ, z. B. nur der Dateiname) anstelle von %:p(absoluter Dateipfad) verwendet wird, besteht ein geringes Risiko, dass stattdessen eine gleichnamige Datei in einem anderen Verzeichnis gelöscht wird. wenn du vergessen hast hast du dort :cded. Daher empfehle ich dringend, %:panstatt zu verwenden, %wenn Sie es trotzdem zuordnen.
Aaron Thoma
25

Manchmal kann ein Plugin auch für ein einfaches Problem eine attraktive Lösung sein. In diesem Fall haben wir Glück, denn es gibt eunuch.vim vom allmächtigen Tim Pope.

In seinen eigenen Worten bietet eunuch.vim

Vim Zucker für die UNIX-Shell-Befehle, die es am dringendsten benötigen. Löschen oder benennen Sie gleichzeitig einen Puffer und die zugrunde liegende Datei um. Laden Sie a findoder a locatein die Quickfix-Liste. Und so weiter.

Perfekt. Es hat das, was wir brauchen, sowie einige zusätzliche Tools, wenn wir auf einem UNIX-System arbeiten.

Der Befehl, den Sie suchen, ist

:Remove!

Ordnen Sie es erneut zu, wenn Sie es häufig benötigen, z :nnoremap <Leader>rm :Remove!<CR>.

glitzert
quelle
Ich habe nach einer Möglichkeit gesucht, auf Plugins zu verzichten, daher werde ich Ihre andere Antwort akzeptieren. Das Plugin sieht gut aus :-)
fotanus
Dieses Plugin ist ziemlich praktisch , wenn man vim Weisen benötigen mv, mkdir, findetc. empfehlen.
Ehtesh Choudhury
4

Ich mag es, Dateien aus vim heraus löschen zu können, aber ich bin auch paranoid, wenn ich versehentlich wichtige Arbeiten lösche, die aus dem einen oder anderen Grund noch nicht unter Versionskontrolle stehen. Ich finde es nützlich, die vorherigen Informationen von @glts und @accolade mit dieser Antwort zu kombinieren, wie der confirmBefehl zum Auffordern verwendet werden kann, bevor vim beendet wird.

Als ich diese zusammenstellte, fügte ich meinem eine Funktion hinzu ~/.vimrc, die vor dem Löschen der Datei und dem Schließen des Puffers zur Eingabe auffordert, und ordnete sie einer Tastenkombination zu:

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

Wenn Sie einen Tastendruck weniger paranoid sind als ich, können Sie <CR>an die erste Zeile anhängen

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

und müssen nur einmal die Eingabetaste drücken.

joelostblom
quelle
1
Ich empfehle dringend, es zu verwenden, expand('%:p')anstatt @%es trotzdem zu schreiben. (Obwohl ich geschmeichelt bin, dass Sie meinen Hinweis aufgenommen haben :) Der Vorteil der Kürze ist in einem Skript marginal. Noch wichtiger ist, %:pdass :) den Dateinamen auf einen vollständigen absoluten Pfad erweitert (der möglicherweise bereits vorhanden ist oder nicht). Mit nur %Ihnen besteht ein geringes Risiko, stattdessen eine gleichnamige Datei in einem anderen Verzeichnis zu löschen, wenn Sie vergessen haben, dass Sie dort bearbeitet :cdhaben.
Aaron Thoma
1
Danke, dass du das rausgeschmissen hast! Ich habe meine Antwort entsprechend aktualisiert.
Joelostblom
0

Sie können dies in zwei Schritten tun:

  1. als neue Datei speichern

    : w neuer Dateiname

  2. Löschen Sie die alte Datei

    ! rm alter Dateiname

Ranger Way
quelle
0

Dies mag eine unpopuläre Meinung sein, aber Ihr Dateibaum-Explorer (Netrw / NerdTree) wird der einfachste und sicherste Weg sein, eine Datei zu löschen. Auch wenn OP NerdTree nicht verwendet, funktioniert das eingebaute Plugin Netrw genauso gut.

Alex Mckay
quelle