호출 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를 소싱하는 경우.
- 하지만 아들, 짧습니다.