오류없이 Vim이 파일을 쓰지 못하게하려면 어떻게해야합니까?


10

누락 된 디렉토리를 만들기 전에 확인을 요청하기 위해이 답변 의 코드를 개선하려고합니다 . 이것은 내가 쓰는 것입니다.

function! CreateDirectoryAskConfirmation(path)
    if !isdirectory(a:path)
        echohl Question
        echo "Create directory " . a:path . "?"
        echohl None

        let response = nr2char(getchar())
        if response ==? "y"
            call mkdir(a:path, "p")
        endif
    endif
endfunction

autocmd BufWritePre * call CreateDirectoryAskConfirmation(expand("<afile>:p:h"))

내가 빠뜨린 한 가지 : y프롬프트에서을 누르지 않으면 Vim이 쓰기를 중단하여 오류가 발생 E212: Can't open file for writing하지 않도록하고 오류 메시지가 사라지도록 다른 키를 누를 필요가 없습니다. 이것을 달성 할 수있는 방법이 있습니까?

답변:


9

대신에 사용하는 BufWritePreautocmd를, 당신은 사용할 수 있습니다 BufWriteCmd , autocmd을에서 :help BufWriteCmd:

'+'가 'cpo'에 있고 다른 파일 cpo- +에 쓰지 않는 한 파일 쓰기를 수행하고 성공하면 '수정'을 재설정해야합니다.

:writeautocmd에서 전화 하면됩니다. 설정이 처리됩니다 modified.

따라서 :write디렉토리가 이미 존재하면 호출하도록 로직이 수정되고 디렉토리가 존재 :write하지 않으면 디렉토리를 생성 한 후 호출 됩니다. 를 누르면 n아무것도하지 않습니다. 이것은있는 그대로 버퍼를 떠나, 다시 설정하지 않습니다 modified, 그래서 :q여전히 당신에게 줄 것이다 E37: No write since last change오류입니다.

function! CreateDirectoryAskConfirmation(path, dir)
    silent doautocmd BufWritePre

    " Directory exists, :write and return
    if isdirectory(a:dir)
        execute 'write ' . a:path
        silent doautocmd BufWritePost
        return
    endif

    " Ask for confirmation to create this directory
    echohl Question
    echo "Create directory `" . a:dir . "' [y/N]?"
    echohl None

    let response = nr2char(getchar())
    " mkdir() and :write if we want to make a directory
    if response ==? "y"
        call mkdir(a:dir, "p")
        execute 'write ' . a:path
        silent doautocmd BufWritePost
    endif
endfunction

autocmd BufWriteCmd * call CreateDirectoryAskConfirmation(expand("<amatch>:p"), expand("<amatch>:p:h"))

2
VimScript 파일에서 선행 :은 명령에 필요하지 않습니다.
tommcdo

@tommcdo 감사합니다. 어떤 이유로 내 두뇌는 때때로 이것을 잊어 버린다> _ <
Martin Tournoij

2
@ toro2k 감사합니다. 나는 그것에 대해 몰랐다. 내 답변을 편집하고 추가 silent했으므로 이것을 사용하지 않으면 메시지가 표시되지 않습니다 autogroup. 나는 또한 내가 발견 한 다른 문제를 해결했다 : :w another_name작동하지 않았다 (작동하지 않음).
Martin Tournoij

2
@ toro2k 그렇지 않으면 write현재 파일 이름에 입력 :write하고 ( 입력 할 때와 마찬가지로 ) :write another_filename작동하지 않습니다 (아직 원본 파일 이름을 사용함).
Martin Tournoij

1
@whitesiroi이 bufype설정을 사용 하여 버퍼 유형을 얻을 수 있습니다 . 수정 사항으로 게시물을 수정하십시오 (그렇지 않으면 다음 주에하겠습니다).
Martin Tournoij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.