如果我調用vim foo/bar/somefile
但foo/bar
不存在,Vim拒絕保存。Vim:創建父目錄保存
我知道我可以切換到shell或從Vim執行:!mkdir foo/bar
但我很懶:) 有沒有辦法讓Vim在保存緩衝區時自動執行該操作?
如果我調用vim foo/bar/somefile
但foo/bar
不存在,Vim拒絕保存。Vim:創建父目錄保存
我知道我可以切換到shell或從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調用創建目錄。
更新: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
基礎上的建議,我的問題,這是我結束了:
function WriteCreatingDirs()
execute ':silent !mkdir -p %:h'
write
endfunction
command W call WriteCreatingDirs()
這定義了:W
命令。理想情況下,我想所有的:w!
,:wq
, :wq!
,:wall
等工作相同,但我不知道是否有可能沒有基本上用自定義函數重新實現它們。
我試過了這個命令和每次使用`:W`時,我的屏幕幾乎變成空白。我會嘗試刪除以前的選項並提供反饋。 – 2016-09-03 14:28:32
我將此添加到我的〜/ .vimrc
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/
如果我需要創建我所在的目錄我輸入:mk.
,並用「!mkdir -p/path/to/my/file /」替換它,並允許我在調用之前查看該命令。
我想我能夠做到這三條線,結合其他人對這個答案是什麼。
這似乎這樣的伎倆:
if has("autocmd")
autocmd BufWritePre * :silent !mkdir -p %:p:h
end
它會嘗試自動創建該文件夾保存緩衝區時。如果發生任何不良情況(即許可問題),它將會關閉並讓文件寫入失敗。
如果有人發現任何明顯的缺陷,請發表評論。我對vimscript不是很熟悉。
編輯:注意感謝ZYX
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
'的mkdir -p%:h`是更好,因爲它適用於嵌套不存在的路徑,當路徑已經存在時不會引發錯誤,`%:h`是當前文件的完整路徑。但是,我不知道如何自動調用它。通常,這是通過automcommands完成的,但BufWritePre事件在這裏似乎不起作用。 – 2010-11-27 17:11:29
定義一個函數,用於檢查文件是否存在,並調用內建的`write`並將該系統調用到`dirname`上的`mkdir -p`,否則映射到`W` ...我懶得搜索語法和發佈它作爲答案...對不起 – khachik 2010-11-27 17:16:48
我想我可以結合你的建議和別名`:W`到`mkdir -p%:h`後面是編寫':寫' – 2010-11-27 17:47:25