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

Chr*_*ker 24 vim

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

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

Kel*_*lly 31

:!mkdir -p spec/models
:w spec/models/blog_spec.rb
Run Code Online (Sandbox Code Playgroud)

  • 那是两步...... (7认同)

小智 18

如果您经常遇到此问题,可能需要为其添加命令.

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

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

:E spec/models/blog_spec.rb
Run Code Online (Sandbox Code Playgroud)

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

  • 有一件事是这个答案没有路径的制表完成.在上面的例子中,如果`spec`模型存在但`models`没有,你必须输入`spec`而不是`sp <Tab>` (4认同)
  • 在我看来,这比接受的答案更好.这对我来说非常好.非常感谢! (3认同)

ZyX*_*ZyX 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>
Run Code Online (Sandbox Code Playgroud)

此命令旨在替代内置: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')
Run Code Online (Sandbox Code Playgroud)

-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>
Run Code Online (Sandbox Code Playgroud)