如果我调用vim foo/bar/somefile
但foo/bar
尚未存在,则Vim拒绝保存。
我知道我可以切换到shell或者从Vim做:!mkdir foo/bar
但是我很懒:)
有没有办法让Vim在保存缓冲区时自动执行此操作?
答案 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)
我:saveas!
创建了目录,如果遗失:https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bb
答案 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的注释