[vim] Vim : 저장시 상위 디렉토리 생성

호출 vim foo/bar/somefile했지만 foo/bar아직 존재하지 않으면 Vim은 저장을 거부합니다.

셸로 전환하거나 :!mkdir foo/barVim에서 할 수 있다는 것을 알고 있지만 게으르다 🙂 버퍼를 저장할 때 Vim이 자동으로 수행하도록하는 방법이 있습니까?



답변

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 호출을 방지 할 수 있습니다.

업데이트 : 비어 있지 않은 buftype을 확인하고 사용하는 약간 더 나은 솔루션 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


답변

내 질문에 대한 제안에 따라 다음과 같은 결과를 얻었습니다.

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

이것은 :W 명령을 . 이상적으로, 나는 모두가하고 싶은 :w!, :wq, :wq!, :wall동일하게 작동 등을하지만, 기본적으로 사용자 정의 기능을 모두 재 구현없이 가능 있는지 확실하지 않습니다.


답변

나는 이것을 ~ / .vimrc에 추가했습니다.

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

내가있는 디렉토리를 생성해야하는 경우 입력 :mk.하고 “! mkdir -p / path / to / my / file /”로 바꾸고 명령을 호출하기 전에 검토 할 수 있습니다.


답변

:saveas!누락 된 경우 디렉터리를 만들었습니다 . https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bb


답변

이 코드 와 디렉토리를 생성하라는 메시지를 표시합니다 :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


답변

나는 다른 사람들 이이 대답에 대해 말하는 것을 결합하여 세 줄로 이것을 할 수 있다고 생각합니다.

이것은 트릭을 수행하는 것 같습니다.

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

버퍼 저장시 자동으로 폴더 생성을 시도합니다. 잘못된 일이 발생하면 (예 : 권한 문제) 종료되고 파일 쓰기가 실패합니다.

누구든지 명백한 결함을 발견하면 의견을 게시하십시오. 나는 vimscript에 정통하지 않습니다.

편집 : ZyX 덕분에 메모

  • 폴더에 공백이 있으면 작동하지 않습니다 (분명히 제대로 이스케이프되지 않은 것 같습니다)
  • 또는 의사 파일을 수행하는 경우.
  • 또는 vimrc를 소싱하는 경우.
  • 하지만 아들, 짧습니다.

답변