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

24

在vim中,我想在[工作目录]/spec/models/里创建一个名为blog_spec.rb的新文件,但这个目录还不存在。

有什么最快的方法可以创建目录并开始编辑文件吗?有没有一行命令可以完成?

4个回答

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

@davidtbernal 把它封装在一个函数中。 - JakeD
重点是问题明确要求“一步到位”,所以这不是一个答案。 - OJFord

18

如果你经常遇到这种情况,可能值得为此添加一个命令。

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
5
一件事是,这个答案没有路径的tab补全功能。 在上面的示例中,如果“spec”模型存在但“models”不存在,您将不得不手动输入“spec”而不是使用“sp <Tab>”进行补全。 - graysonwright

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>

希望有一个适当的插件来解决这个问题。 - Jikku Jose

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

这正是我想要的!很多时候,在编辑文件之前,我不想考虑路径是否存在。只有在准备保存文件时才会担心它。 - verboze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接