_vim foo/bar/somefile
_を呼び出しても_foo/bar
_がまだ存在しない場合、Vimは保存を拒否します。
私はシェルに切り替えるか、Vimから_:!mkdir foo/bar
_を実行できることを知っていますが、私は怠け者です:)バッファを保存するときにVimにそれを自動的に実行させる方法はありますか?
_augroup BWCCreateDir
autocmd!
autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
augroup END
_
条件に注意してください:expand("<afile>")!~#'^\w\+:/'
は、vimが_ftp://*
_などのファイル用のディレクトリを作成するのを防ぎ、_!isdirectory
_は高価なmkdir呼び出しを防ぎます。
更新:空でないbuftypeをチェックし、mkdir()
を使用するわずかに優れたソリューション
_function s:MkNonExDir(file, buf)
if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
let dir=fnamemodify(a:file, ':h')
if !isdirectory(dir)
call mkdir(dir, 'p')
endif
endif
endfunction
augroup BWCCreateDir
autocmd!
autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END
_
私の質問への提案に基づいて、ここに私が終わったものがあります:
function WriteCreatingDirs()
execute ':silent !mkdir -p %:h'
write
endfunction
command W call WriteCreatingDirs()
これにより、:W
コマンド。理想的には、すべての:w!
、:wq
、:wq!
、:wall
などは同じように機能しますが、基本的にすべてをカスタム関数で再実装しなくても可能かどうかはわかりません。
これを〜/ .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!
を使用してディレクトリを作成するように求めます。
augroup vimrc-auto-mkdir
autocmd!
autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
function! s:auto_mkdir(dir, force)
if !isdirectory(a:dir)
\ && (a:force
\ || input("'" . a:dir . "' does not exist. Create? [y/N]") =~? '^y\%[es]$')
call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
endif
endfunction
augroup END
他の人がこの答えで言っていることを組み合わせて、3行でこれをやったと思います。
これはトリックを行うようです:
if has("autocmd")
autocmd BufWritePre * :silent !mkdir -p %:p:h
end
バッファーを保存するときにフォルダーを自動的に作成しようとします。何か悪いことが起こった場合(つまり、許可の問題)、シャットダウンしてファイルの書き込みに失敗します。
明らかな欠陥がある場合は、コメントを投稿してください。私はvimscriptにあまり詳しくありません。
編集:ZyXのおかげでメモ