web-dev-qa-db-ja.com

Vim:保存時に親ディレクトリを作成する

_vim foo/bar/somefile_を呼び出しても_foo/bar_がまだ存在しない場合、Vimは保存を拒否します。

私はシェルに切り替えるか、Vimから_:!mkdir foo/bar_を実行できることを知っていますが、私は怠け者です:)バッファを保存するときにVimにそれを自動的に実行させる方法はありますか?

109
Damien Pollet
_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
_
86
ZyX

私の質問への提案に基づいて、ここに私が終わったものがあります:

function WriteCreatingDirs()
    execute ':silent !mkdir -p %:h'
    write
endfunction
command W call WriteCreatingDirs()

これにより、:Wコマンド。理想的には、すべての:w!:wq:wq!:wallなどは同じように機能しますが、基本的にすべてをカスタム関数で再実装しなくても可能かどうかはわかりません。

18
Damien Pollet

これを〜/ .vimrcに追加しました

cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/

私がいるディレクトリを作成する必要がある場合は、:mk.と入力し、それを "!mkdir -p/path/to/my/file /"に置き換えて、呼び出す前にコマンドを確認できるようにします。

6
Asa Ayers

:saveas!欠落している場合はディレクトリを作成します。 https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bb

3
Henrik N

このコード は、: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
Tom Hale

他の人がこの答えで言っていることを組み合わせて、3行でこれをやったと思います。

これはトリックを行うようです:

if has("autocmd")
  autocmd BufWritePre * :silent !mkdir -p %:p:h
end

バッファーを保存するときにフォルダーを自動的に作成しようとします。何か悪いことが起こった場合(つまり、許可の問題)、シャットダウンしてファイルの書き込みに失敗します。

明らかな欠陥がある場合は、コメントを投稿してください。私はvimscriptにあまり詳しくありません。

編集:ZyXのおかげでメモ

  • フォルダにスペースが含まれている場合は、これは機能しません(明らかに適切にエスケープされていないなど)
  • または、擬似ファイルを実行している場合。
  • または、vimrcを調達している場合。
  • しかし、息子、それは短いです。
1
kikito