24

在 vim 中我想创建一个名为blog_spec.rbinside的新文件[working directory]/spec/models/,但该目录还不存在?

创建目录并开始编辑文件的最快方法是什么?有单线吗?

4

4 回答 4

31
:!mkdir -p spec/models
:w spec/models/blog_spec.rb
于 2012-05-01T08:37:01.280 回答
18

如果您经常遇到这种情况,可能值得为其添加命令。

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

如果您在 .vimrc 文件中添加该行,您可以像这样简单地使用它:

:E spec/models/blog_spec.rb

编辑这仅适用于 Linux/Mac,不适用于 Windows。

于 2012-05-01T11:25:38.130 回答
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破坏事物:它不仅添加了完成,还添加了参数处理(因此检查`扩展和特殊字符的存在没有意义)并禁止拥有多个“文件名”(因此没有 ++opt)。

-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>
于 2012-05-01T11:41:06.100 回答
2

我通常发现只有在尝试保存文件后父目录才已经存在。

此代码将提示您使用创建目录: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
于 2017-03-18T08:57:14.533 回答