代码之家  ›  专栏  ›  技术社区  ›  Damien Pollet

vim:保存时创建父目录

  •  105
  • Damien Pollet  · 技术社区  · 14 年前

    如果我调用 vim foo/bar/somefile 但是 foo/bar 不存在,维姆拒绝拯救。

    我知道我可以换个贝壳或者 :!mkdir foo/bar 来自维姆,但我很懒:) 有没有一种方法可以让vim在保存缓冲区时自动执行这个操作?

    6 回复  |  直到 7 年前
        1
  •  81
  •   ZyX    12 年前
    augroup BWCCreateDir
        autocmd!
        autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
    augroup END
    

    expand("<afile>")!~#'^\w\+:/' ftp://* !isdirectory

    mkdir()

    function s:MkNonExDir(file, buf)
        if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
            let dir=fnamemodify(a:file, ':h')
            if !isdirectory(dir)
                call mkdir(dir, 'p')
            endif
        endif
    endfunction
    augroup BWCCreateDir
        autocmd!
        autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
    augroup END
    
        2
  •  17
  •   Damien Pollet    14 年前

    function WriteCreatingDirs()
        execute ':silent !mkdir -p %:h'
        write
    endfunction
    command W call WriteCreatingDirs()
    

    :W :w! :wq :wq! :wall

        3
  •  6
  •   Asa Ayers    13 年前

    cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/

    :mk.

        5
  •  3
  •   Tom Hale    7 年前

    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
    
        6
  •  1
  •   kikito    12 年前

    if has("autocmd")
      autocmd BufWritePre * :silent !mkdir -p %:p:h
    end