在vim的新目录中创建文件一步到位?

时间:2012-05-01 07:17:06

标签: vim

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

创建目录并开始编辑文件的最快方法是什么?任何oneliners?

4 个答案:

答案 0 :(得分:31)

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

答案 1 :(得分:18)

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

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

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

:E spec/models/blog_spec.rb

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

答案 2 :(得分: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. Argument是一个目录。
  5. 参数是现有文件。
  6. Argument是现有目录中的文件。
  7. 在最后三种情况下,不应该做任何事情,第二种和第三种情况不是不可能处理的,只是更复杂。

    以上内容已准备好添加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>
    

答案 3 :(得分: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