2012-05-01 27 views

回答

6

試試下面的命令:

function s:MKDir(...) 
    if   !a:0 
      \|| stridx('`+', a:1[0])!=-1 
      \|| a:1=~#'\v\\@<![ *?[%#]' 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 

此命令的目的是爲替換爲內置:e。其中MKDIR未(按順序)運行

條件:

  1. 命令不加參數
  2. 命令與`generate filename``=generate_filename()`反引號文件名發生器或與+command/++opt開關運行運行。
  3. 命令包含多於一個參數或具有未轉義的特殊字符。
  4. 參數是一個目錄。
  5. 參數是一個現有的文件。
  6. 參數是現有目錄中的文件。

最後三種情況不應該做,第二和第三種情況不是不可能處理,只是更復雜。

以上是準備用於添加cnoreabbrev

cnoreabbrev <expr> e ((getcmdtype() is# ':' && getcmdline() is# 'e')?'E':'e') 

-complete=file贓物事情:它添加不僅完成,而且參數處理(因此檢查`膨脹和特殊字符的存在不是有道理的),並禁止有多個「文件名」(因此沒有++選擇)。

-bar使您無法使用`="String"`,因爲"現在開始評論。沒有-bar這不是:e模擬,因爲你不能這樣做E file | another command

另一個版本:

function s:MKDir(...) 
    if   !a:0 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 
+0

希望有一個適當的插件。 –

29
:!mkdir -p spec/models 
:w spec/models/blog_spec.rb 
+4

這兩個步驟... – notJim

17

如果您經常遇到這種情況,可能需要爲其添加命令。

command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args> 

如果添加了行.vimrc文件,你可以簡單地使用它像這樣:

:E spec/models/blog_spec.rb 

編輯這將僅在Linux/Mac上,而不是Windows工作。

+3

這一點,在我看來,比接受的答案更好。這對我來說真的很好。非常感謝! – nickcoxdotme

+4

有一件事是,這個答案沒有路徑選項卡完成。在上面的例子中,如果'spec'模型存在但'models'沒有,你必須輸入'spec'而不是'sp ' – graysonwright

2

我通常發現的父目錄已經不只是後存在試圖保存文件。

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 
+0

這正是我所期待的!通常情況下,我不想在編輯文件之前考慮路徑是否存在。當我準備保存文件時,我只擔心它。 – verboze

相關問題