developer tip

Vim : 저장시 상위 디렉토리 작성

optionbox 2020. 7. 29. 08:08
반응형

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를 소싱하는 경우.
  • 그러나 아들은 짧습니다.

참고 URL : https://stackoverflow.com/questions/4292733/vim-creating-parent-directories-on-save

반응형