Если я вызываю, vim foo/bar/somefile
но foo/bar
еще не существует, Vim отказывается сохранять.
Я знаю, что могу переключиться на оболочку или сделать это :!mkdir foo/bar
из Vim, но я ленив :) Есть ли способ заставить Vim делать это автоматически при сохранении буфера?
mkdir -p %:h
лучше, потому что он работает для вложенных несуществующих путей, не вызывает ошибки, если путь уже существует, и%:h
является полным путем к текущему файлу. Однако я не знаю, как вызвать это автоматически. Обычно это делается с помощью автоматических команд, ноBufWritePre
, похоже, событие здесь не работает.write
и призывает системуmkdir -p
наdirname
иначе, сопоставьте егоW
... Я слишком ленив , чтобы искать синтаксис и разместить его в ответ ... Извините:w
сmkdir -p %:h
последующим строительством:write
Ответы:
Обратите внимание на условия:
expand("<afile>")!~#'^\w\+:/'
запретит vim создавать каталоги для файлов, таких какftp://*
и!isdirectory
предотвратит дорогостоящий вызов mkdir.Обновление : немного лучшее решение, которое также проверяет непустой тип буфера и использует
mkdir()
:источник
call mkdir(expand('%:h'), 'p')
может быть более портативным.Основываясь на предложениях по моему вопросу, вот что у меня получилось:
Это определяет
:W
команду. В идеале я хотел бы иметь все:w!
,:wq
,:wq!
, и:wall
т.д. работаю так же, но я не уверен , если это возможно без в основном реализовав их все пользовательские функции.источник
:W
, мой экран становится почти пустым. Я попробую удалить свои предыдущие варианты и оставлю отзыв.Я добавил это в свой ~ / .vimrc
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/
Если мне нужно создать каталог, в котором я нахожусь, я
:mk.
набираю текст, и он заменяет его на «! Mkdir -p / path / to / my / file /» и позволяет мне просмотреть команду перед ее вызовом.источник
Я
:saveas!
создал каталог, если он отсутствует: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbисточник
Этот код предложит вам создать каталог
:w
или просто сделать это с помощью:w!
:источник
Думаю, мне удалось сделать это в трех строках, объединив то, что другие говорят по этому поводу.
Кажется, это помогает:
Он пытается автоматически создать папку при сохранении буфера. Если случится что-нибудь плохое (например, проблемы с правами доступа), он просто отключится и даст возможность записать файл не удастся.
Если кто-то видит очевидные недостатки, оставьте комментарий. Я не очень разбираюсь в vimscript.
РЕДАКТИРОВАТЬ: Заметки благодаря ZyX
источник
%
в таких скриптах. Vim не собирается бежать какие - либо специальные символы, например, если вы редактируете файл с именем/mnt/windows/Documents and Settings/User/_vimrc
вы будете в конечном итоге, четыре новых каталогов:/mnt/windows/Documents
,./and
,./Settings
и./Settings/User
. И, кстати, вам:execute
здесь не нужно .system()
функция для полностью бесшумных вызовов оболочки, но вам не нужны оба:execute
и%:p:h
::silent !mkdir -p %:p:h
работает точно так, как вы написали (хотя вам может понадобиться:redraw!
в конце, в этом случае:execute
пригодится), но лучше использоватьcall system('mkdir -p '.shellescape(expand('%:p:h')))
. Используйте:execute '!command' shellescape(arg, 1)
(со вторым аргументом shellescape), если вам нужно использовать челку вместоsystem()
. Используйте челку, если экранированный аргумент содержит символы новой строки.:source ~/.vimrc
) (это то , для чегоaugroup
иautocmd!
для), отмененный вид после запуска оболочки команды (это тоredraw!
, для чего), создание каталогов мусора в случае использования псевдофайлов (в первом фрагменте кода он проверяется только сопоставлением имени файла с шаблоном, но во втором я также проверяю&buftype
) и бесполезный вызов оболочки в каталоге case существует (isdirectory()
условие).%
расширением слишком много проблем, чтобы когда-либо предлагать его кому-либо использовать. Псевдо файлы используются в большом количестве плагинов (например, fugitive или my aurum), поэтому о них стоит позаботиться. Ресурсы vimrc также являются распространенной практикой. Вы можете иметь все, что захотите, в vimrc, только не предлагайте это в качестве ответа. Использование:silent! call mkdir(expand('%:p:h'), 'p')
варианта решает два пункта, о которых я упомянул, а третий, который я не упомянул:!mkdir
не будет работать с окнами.