Wenn ich aufrufe, vim foo/bar/somefile
aber foo/bar
noch nicht existiere, weigert sich Vim zu speichern.
Ich weiß, dass ich :!mkdir foo/bar
von Vim zu einer Shell wechseln oder etwas tun könnte, aber ich bin faul :) Gibt es eine Möglichkeit, Vim dazu zu bringen, dies automatisch zu tun, wenn der Puffer gespeichert wird?
mkdir -p %:h
ist besser, weil es für verschachtelte nicht vorhandene Pfade funktioniert, keinen Fehler auslöst, wenn der Pfad bereits vorhanden ist, und%:h
der vollständige Pfad der aktuellen Datei ist. Ich weiß jedoch nicht, wie ich dies automatisch aufrufen soll. Normalerweise geschieht dies mit automatischen Befehlen, aber dasBufWritePre
Ereignis scheint hier nicht zu funktionieren.write
und fordert das Systemmkdir -p
aufdirname
andere Weise, wo es zuW
... ich bin zu faul für die Syntax zu suchen und es als eine Antwort zu schreiben ... Sorry:w
,mkdir -p %:h
gefolgt vom Bau:write
Antworten:
Beachten Sie die Bedingungen:
expand("<afile>")!~#'^\w\+:/'
Verhindert, dass vim Verzeichnisse für Dateien wie erstellt,ftp://*
und!isdirectory
verhindert teure mkdir-Aufrufe.Update : Etwas bessere Lösung, die auch nach nicht leeren Buftypen sucht und Folgendes verwendet
mkdir()
:quelle
call mkdir(expand('%:h'), 'p')
könnte tragbarer sein.Basierend auf den Vorschlägen zu meiner Frage habe ich Folgendes erhalten:
Dies definiert den
:W
Befehl. Im Idealfall würde Ich mag alle haben:w!
,:wq
,:wq!
,:wall
usw. die gleiche Arbeit, aber ich bin nicht sicher , ob es ohne grundsätzlich Neuimplementierung sie alle mit benutzerdefinierten Funktionen möglich ist.quelle
:W
, wenn ich ihn benutze , wird mein Bildschirm fast leer. Ich werde versuchen, meine vorherigen Optionen zu entfernen und Feedback zu geben.Ich habe dies zu meinem ~ / .vimrc hinzugefügt
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/
Wenn ich das Verzeichnis erstellen muss, in dem ich mich
:mk.
befinde, tippe ich es durch "! Mkdir -p / path / to / my / file /" und kann den Befehl überprüfen, bevor ich ihn aufrufe.quelle
Ich habe
:saveas!
das Verzeichnis erstellt, wenn es fehlt: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbquelle
Dieser Code fordert Sie auf, das Verzeichnis mit
:w
oder einfach zu erstellen:w!
:quelle
Ich glaube, ich habe es geschafft, dies in drei Zeilen zu tun und zu kombinieren, was andere zu dieser Antwort sagen.
Dies scheint den Trick zu tun:
Es wird versucht, den Ordner beim Speichern eines Puffers automatisch zu erstellen. Wenn etwas Schlimmes passiert (dh Berechtigungsprobleme), wird es einfach heruntergefahren und das Schreiben der Datei schlägt fehl.
Wenn jemand offensichtliche Mängel sieht, schreibe bitte einen Kommentar. Ich bin nicht sehr versiert in Vimscript.
EDIT: Notizen dank ZyX
quelle
%
in solchen Skripten. Vim wird keine besonderen Symbole entkommen: zum Beispiel, wenn Sie eine Datei mit dem Namen bearbeiten/mnt/windows/Documents and Settings/User/_vimrc
werden vier neue Verzeichnisse am Ende mit:/mnt/windows/Documents
,./and
,./Settings
und./Settings/User
. Und das brauchen Sie übrigens:execute
hier nicht.system()
Funktion für völlig stille Shell-Aufrufe, aber Sie benötigen nicht beide:execute
und%:p:h
::silent !mkdir -p %:p:h
funktioniert genau so, wie Sie es geschrieben haben (obwohl Sie es:redraw!
am Ende benötigen , ist es in diesem Fall:execute
praktisch), aber es ist besser zu verwendencall system('mkdir -p '.shellescape(expand('%:p:h')))
. Verwenden Sie:execute '!command' shellescape(arg, 1)
(mit dem zweiten Argument für shellescape), wenn Sie stattdessen Pony verwenden müssensystem()
. Verwenden Sie Pony, wenn das Escape-Argument Zeilenumbrüche enthält.:source ~/.vimrc
) (dies istaugroup
und wozuautocmd!
), verschrottete Ansicht nach dem Starten der Shell Befehle (das ist es, wofürredraw!
), das Erstellen von Garbage-Verzeichnissen bei Verwendung von Pseudodateien (im ersten abgeschnittenen Code wird dies überprüft, indem nur der Dateiname mit einem Muster abgeglichen wird, aber im zweiten überprüfe ich auch&buftype
) und nutzloser Shell-Aufruf im case-Verzeichnis existiert (isdirectory()
Bedingung).%
Erweiterung, als dass man sie jemals jemandem empfehlen könnte. Pseudodateien werden in einer Vielzahl von Plugins verwendet (z. B. Flüchtling oder mein Aurum), daher lohnt es sich, sich darum zu kümmern. Die Beschaffung von vimrc ist ebenfalls eine gängige Praxis. Sie können alles im vimrc haben, was Sie wollen, schlagen Sie es einfach nicht als Antwort vor. Die Verwendung der:silent! call mkdir(expand('%:p:h'), 'p')
Variante löst zwei der Punkte, die ich erwähnt habe, und den dritten, den ich nicht erwähnt habe:!mkdir
Wird unter Windows nicht funktionieren.