Vim : 저장시 상위 디렉토리 작성
내가 호출 vim foo/bar/somefile
했지만 foo/bar
아직 존재하지 않으면 Vim은 저장을 거부합니다.
나는 쉘로 전환하거나 :!mkdir foo/bar
Vim에서 할 수 있다는 것을 알고 있지만 게으르다 :) 버퍼를 저장할 때 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
'developer tip' 카테고리의 다른 글
IF 문 : 조건이 거짓 인 경우 셀을 비워 두는 방법 ( ""이 작동하지 않음) (0) | 2020.07.29 |
---|---|
Visual Studio에 대한 최상의 대안 IDE는 무엇입니까? (0) | 2020.07.29 |
Android REST 클라이언트, 샘플? (0) | 2020.07.29 |
폴더가 아닌 태그를 사용하는 파일 시스템? (0) | 2020.07.29 |
젠킨스 파이프 라인 : 에이전트 대 노드? (0) | 2020.07.29 |