Vim:在保存时创建父目录

时间:2010-11-27 16:54:21

标签: vim mkdir

如果我调用vim foo/bar/somefilefoo/bar尚未存在,则Vim拒绝保存。

我知道我可以切换到shell或者从Vim做:!mkdir foo/bar但是我很懒:) 有没有办法让Vim在保存缓冲区时自动执行此操作?

6 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:17)

根据对我的问题的建议,这是我最终的结果:

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

这定义了:W命令。理想情况下,我希望所有:w!:wq:wq!:wall等工作相同,但我不确定是否可以在没有基本重新实现的情况下实现他们都有自定义功能。

答案 2 :(得分:6)

我把它添加到我的〜/ .vimrc

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

如果我需要创建我所在的目录,我键入:mk.并将其替换为“!mkdir -p / path / to / my / file /”并允许我在我之前查看命令调用它。

答案 3 :(得分:3)

答案 4 :(得分:3)

This code会提示您使用: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

答案 5 :(得分:1)

我认为我设法在三行中完成了这项工作,结合了其他人对此答案所说的内容。

这似乎可以解决问题:

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

尝试在保存缓冲区时自动创建文件夹。如果发生任何不良事件(即权限问题),它将关闭并让文件写入失败。

如果有人发现任何明显的缺陷,请发表评论。我不太熟悉vimscript。

编辑:感谢ZyX的注释

  • 如果您的文件夹上有空格(显然它们没有正确转义或其他内容),这将无效。
  • 或者,如果您正在伪文件。
  • 或者如果您要采购vimrc。
  • 但儿子,它很短。