Jeśli wywołam, vim foo/bar/somefile
ale foo/bar
jeszcze nie istnieje, Vim odmówi zapisania.
Wiem, że mógłbym przełączyć się na powłokę lub zrobić :!mkdir foo/bar
z Vima, ale jestem leniwy :) Czy jest sposób, aby Vim robił to automatycznie, gdy zapisuje bufor?
mkdir -p %:h
jest lepsza, ponieważ działa w przypadku zagnieżdżonych nieistniejących ścieżek, nie zgłasza błędu, gdy ścieżka już istnieje i%:h
jest pełną ścieżką do bieżącego pliku. Jednak nie wiem, jak wywołać to automatycznie. Zwykle odbywa się to za pomocą automatycznych poleceń, aleBufWritePre
zdarzenie wydaje się nie działać tutaj.write
i wywołuje systemmkdir -p
wdirname
przeciwnym razie,W
:w
abymkdir -p %:h
następnie builting:write
Odpowiedzi:
Zwróć uwagę na warunki:
expand("<afile>")!~#'^\w\+:/'
uniemożliwi vimowi tworzenie katalogów dla plików takich jakftp://*
i!isdirectory
zapobiegnie kosztownym wywołaniom mkdir.Aktualizacja : nieznacznie lepsze rozwiązanie, które również sprawdza niepusty typ buforu i używa
mkdir()
:źródło
call mkdir(expand('%:h'), 'p')
może być bardziej przenośny.W oparciu o sugestie do mojego pytania, oto co otrzymałem:
To definiuje
:W
polecenie. Idealnie, chciałbym mieć wszystko:w!
,:wq
,:wq!
,:wall
etc działają tak samo, ale nie jestem pewien, czy jest to możliwe bez zasadzie reimplementing je wszystkie z funkcji niestandardowych.źródło
:W
, mój ekran staje się prawie pusty. Spróbuję usunąć moje poprzednie opcje i przekażę opinię.Dodałem to do mojego ~ / .vimrc
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/
Jeśli muszę utworzyć katalog, w
:mk.
którym się znajduję, wpisuję go i zastępuje go ciągiem „! Mkdir -p / ścieżka / do / mój / plik /” i umożliwia mi przejrzenie polecenia przed jego wywołaniem.źródło
I made
:saveas!
utworzenia katalogu jeśli brakuje: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbźródło
Ten kod poprosi Cię o utworzenie katalogu za pomocą
:w
lub po prostu zrób to za pomocą:w!
:źródło
Myślę, że udało mi się to zrobić w trzech wierszach, łącząc to, co inni mówią o tej odpowiedzi.
Wydaje się, że to działa:
Próbuje utworzyć folder automatycznie podczas zapisywania buforu. Jeśli wydarzy się coś złego (np. Problemy z uprawnieniami), po prostu się zamknie i pozwoli na niepowodzenie zapisu pliku.
Jeśli ktoś zauważy oczywiste wady, napisz komentarz. Nie jestem biegły w skryptach vimscript.
EDYCJA: Uwagi dzięki ZyX
źródło
%
w takich skryptach. Vim nie zamierza uciec żadnych specjalnych symboli, na przykład: jeśli edytujesz plik o nazwie/mnt/windows/Documents and Settings/User/_vimrc
skończy się o czterech nowych katalogów:/mnt/windows/Documents
,./and
,./Settings
i./Settings/User
. A tak przy okazji, nie potrzebujesz:execute
tutaj.system()
funkcja dla całkowicie cichych wywołań powłoki, ale nie potrzebujesz obu:execute
i%:p:h
::silent !mkdir -p %:p:h
działa dokładnie tak, jak napisałeś (chociaż może być potrzebna:redraw!
na końcu, w tym przypadku:execute
jest przydatna), ale lepiej jest jej użyćcall system('mkdir -p '.shellescape(expand('%:p:h')))
. Używaj:execute '!command' shellescape(arg, 1)
(z drugim argumentem shellescape), jeśli zamiast tego musisz użyć grzywkisystem()
. Używaj grzywki, jeśli argument ucieczki zawiera znaki nowej linii.:source ~/.vimrc
) (po toaugroup
iautocmd!
są), odrzucony widok po uruchomieniu powłoki polecenia (do tego służąredraw!
), tworzenie katalogów śmieci w przypadku używania pseudo-plików (w pierwszym odcinanym kodzie jest to sprawdzane tylko przez dopasowanie nazwy pliku do wzorca, ale w drugim też sprawdzam&buftype
) i bezużyteczne wywołanie powłoki w katalogu case istnieje (isdirectory()
stan).%
ekspansją, aby kiedykolwiek sugerować użycie jej komukolwiek. Pseudo pliki są używane w dużej liczbie wtyczek (np. Fugitive lub my aurum), dlatego warto o nie dbać. Pozyskiwanie zasobów vimrc jest również powszechną praktyką. Możesz mieć cokolwiek chcesz w vimrc, po prostu nie sugeruj tego jako odpowiedzi. Użycie:silent! call mkdir(expand('%:p:h'), 'p')
wariantu rozwiązuje dwie kwestie, o których wspomniałem, i trzecią, o której nie wspomniałem:!mkdir
nie będzie działać w systemie Windows.