2010-11-27 77 views
80

如果我調用vim foo/bar/somefilefoo/bar不存在,Vim拒絕保存。Vim:創建父目錄保存

我知道我可以切換到shell或從Vim執行:!mkdir foo/bar但我很懶:) 有沒有辦法讓Vim在保存緩衝區時自動執行該操作?

+7

'的mkdir -p%:h`是更好,因爲它適用於嵌套不存在的路徑,當路徑已經存在時不會引發錯誤,`%:h`是當前文件的完整路徑。但是,我不知道如何自動調用它。通常,這是通過automcommands完成的,但BufWritePre事件在這裏似乎不起作用。 – 2010-11-27 17:11:29

+0

定義一個函數,用於檢查文件是否存在,並調用內建的`write`並將該系統調用到`dirname`上的`mkdir -p`,否則映射到`W` ...我懶得搜索語法和發佈它作爲答案...對不起 – khachik 2010-11-27 17:16:48

+1

我想我可以結合你的建議和別名`:W`到`mkdir -p%:h`後面是編寫':寫' – 2010-11-27 17:47:25

回答

68
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調用創建目錄。

更新:sligtly更好的解決方案,同時檢查非空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 
13

基礎上的建議,我的問題,這是我結束了:

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

這定義了:W命令。理想情況下,我想所有的:w!,:wq, :wq!,:wall等工作相同,但我不知道是否有可能沒有基本上用自定義函數重新實現它們。

+1

我試過了這個命令和每次使用`:W`時,我的屏幕幾乎變成空白。我會嘗試刪除以前的選項並提供反饋。 – 2016-09-03 14:28:32

5

我將此添加到我的〜/ .vimrc

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

如果我需要創建我所在的目錄我輸入:mk.,並用「!mkdir -p/path/to/my/file /」替換它,並允許我在調用之前查看該命令。

0

我想我能夠做到這三條線,結合其他人對這個答案是什麼。

這似乎這樣的伎倆:

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

它會嘗試自動創建該文件夾保存緩衝區時。如果發生任何不良情況(即許可問題),它將會關閉並讓文件寫入失敗。

如果有人發現任何明顯的缺陷,請發表評論。我對vimscript不是很熟悉。

編輯:注意感謝ZYX

  • 如果你的文件夾中有空格的(顯然他們沒有正確地轉義或東西)如果你正在做的假文件,這是行不通的
  • 或者。
  • 或者如果你正在採購你的vimrc。
  • 但兒子,它很短。
0

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