在vim中,我想在[工作目录]/spec/models/
里创建一个名为blog_spec.rb
的新文件,但这个目录还不存在。
有什么最快的方法可以创建目录并开始编辑文件吗?有没有一行命令可以完成?
在vim中,我想在[工作目录]/spec/models/
里创建一个名为blog_spec.rb
的新文件,但这个目录还不存在。
有什么最快的方法可以创建目录并开始编辑文件吗?有没有一行命令可以完成?
:!mkdir -p spec/models
:w spec/models/blog_spec.rb
如果你经常遇到这种情况,可能值得为此添加一个命令。
command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args>
如果您在 .vimrc 文件中添加该行,您可以像这样简单地使用它::E spec/models/blog_spec.rb
编辑:这只适用于Linux/Mac,不适用于Windows。
请尝试以下命令:
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的情况(按顺序):
`generate filename`
或`=generate_filename()`
反引号文件名生成器或使用+command
/++opt
开关运行该命令。在最后三种情况下,不需要执行任何操作,第二和第三种情况并不难处理,只是更加复杂。
以上内容可以添加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>
通常我会在尝试保存文件后才发现父目录不存在。
这段代码将提示您使用: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