在 vim 中我想创建一个名为blog_spec.rb
inside的新文件[working directory]/spec/models/
,但该目录还不存在?
创建目录并开始编辑文件的最快方法是什么?有单线吗?
在 vim 中我想创建一个名为blog_spec.rb
inside的新文件[working directory]/spec/models/
,但该目录还不存在?
创建目录并开始编辑文件的最快方法是什么?有单线吗?
:!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