2013-05-21 22 views

Antwort

74

ein externes Tool wie rm (1) ist in Ordnung, aber Vim hat auch seine eigenen delete() Funktion zum Löschen von Dateien. Dies hat den Vorteil, dass es tragbar ist.

:call delete(expand('%')) 

Eine alternative Weise, dies auszudrücken, ist :call delete(@%), die die % (aktuelle Datei) Register (Spitze durch @accolade) verwendet.

Um den aktuellen Puffer vollständig zu reinigen, sowohl die Dateidarstellung auf der Festplatte und den Vim-Puffer, hängen :bdelete:

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

Sie werden wahrscheinlich wollen diese nach Ihren Wünschen kartieren.

+6

Danke! Die folgende Map in der .vimrc scheint zu funktionieren: 'nnoremap rm: call delete (expand ('%')) \ | bdelete! '. Vielleicht möchten Sie Ihre Antwort hinzufügen. – fotanus

+11

Diese Zuordnung ist nicht ideal. Wir wollen den Befehl ['r'] (http://vimdoc.sourceforge.net/htmldoc/change.html#r) nicht brechen! Bessere Präfixe für das Mapping mit [' ...'] (http://vimdoc.sourceforge.net/htmldoc/map.html#mapleader). – glts

+0

ist nicht ideal, auch weil es einfach ist, die Datei zu löschen und den Puffer ohne Absicht zu schließen !! Aber ich brauchte das nur als vorübergehende Lösung. – fotanus

56

Werfen Sie einen Blick auf Delete files with a Vim command. Die Comments Sektion sollte das haben, wonach Sie suchen:

Im Grunde wird Rm die aktuelle Datei löschen; RM löscht die aktuelle Datei und beendet den Puffer (ohne zu speichern) auf einmal.

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

:!rm % 
+0

Es ist so einfach, dass ich fast nicht glauben kann, dass ich dafür ein Skript erstellen muss. Vielen Dank. – fotanus

+3

Löschen mit '! Rm%', gibt es eine Möglichkeit, die Warnung zu vermeiden, wenn vim zurück zum Puffer kommt? – fotanus

+1

Mit einigen Sonderzeichen im Dateinamen, würde dieser Befehl nicht funktionieren, wie wenn der Dateiname 20130711-Kontakte # 285.vcf ist, der Platz hat, würde es sagen: "rm: kann nicht entfernen 20130711-Kontakte": Keine solche Datei Oder Verzeichnis ' – Saeed

20

Manchmal kann ein Plugin selbst 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 eunuch.vim bietet

Vim Zucker für die UNIX-Shell-Befehle, die es am meisten brauchen. Löschen oder benennen Sie einen Puffer und die zugrunde liegende Datei gleichzeitig um. Laden Sie eine find oder eine locate in die Quickfix-Liste. Und so weiter.

Perfekt. Es hat, was wir brauchen, plus einige zusätzliche Werkzeuge, wenn wir auf einem UNIX-System sind.

Der Befehl Sie suchen, ist

:Remove! 

Wieder ist es neu zuordnen, wenn Sie es eine Menge benötigen, beispielsweise .

+0

Ich habe nach einem Weg gesucht, ohne Plugins auskommen zu können, also werde ich deine andere Antwort akzeptieren. Das Plugin sieht gut aus :-) – fotanus

+0

Dieses Plugin ist sehr praktisch, wenn Sie vim Wege von 'mv',' mkdir', 'find' usw. brauchen. Sehr zu empfehlen. –

0

Sie können es mit zwei Schritten tun:

  1. speichern als neue Datei

    : w newfilename

  2. die alte Datei

    löschen! rm oldFileName

2

Ich mag Dateien in vim löschen zu können, aber ich bin auch paranoid versehentlich wichtige Arbeit, die für einen oder anderen Grund zu löschen, noch nicht unter Versionskontrolle ist. Ich finde es nützlich, die vorherigen Informationen von @glts und @accolade mit this answer zu kombinieren, wie man den Befehl confirm verwendet, um vor dem Beenden von vim aufzufordern.

diese zusammen Einlochen, fügte ich eine Funktion meiner ~/.vimrc, die die Datei und Schließen des Puffers zu löschen fordert vor, und es zu einer Tastenkombination zugeordnet:

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 bin, Sie <CR> auf die erste Zeile

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

und haben anhängen kann nur einmal Rückkehr zu drücken.

+1

Ich empfehle dringend die Verwendung von 'expand ('%: p')' anstelle von '@%', wenn Sie es trotzdem skripten. (Ich fühle mich geschmeichelt, dass Sie meinen Hinweis eingebaut haben :) Die Kürze ist in einem Skript marginal. Was noch wichtiger ist:) '%: p' wird den Dateinamen auf einen vollständigen absoluten Pfad erweitern (was vielleicht schon geschehen ist). Mit nur '%' liegst du ein kleines Risiko des Löschens einer Datei mit dem gleichen Namen in einem anderen Verzeichnis, wenn du dich '' cd'ed vergessen hast. –

+1

Danke, dass du das gemacht hast! Ich habe meine Antwort entsprechend aktualisiert. –

Verwandte Themen