파일, 존재하지 않는 파일 또는 빈 파일없이 Vim을 시작할 때 autocmd를 어떻게 실행할 수 있습니까?


11

Vim을 시작할 때 다음 시나리오에서 autocmd를 실행하고 싶습니다.

  • 파일 이름을 지정하지 않았습니다.
  • 파일이 새로운 경우.
  • 파일이 존재하지만 완전히 비어있는 경우

위의 세 가지 경우 모두 autocmd를 실행하고 싶습니다. 특히 위의 시나리오 에 대해서만 삽입 모드를 자동으로 시작 하고 싶습니다 (이미 존재하고 비어 있지 않은 파일을 열 때는 아닙니다).


최신 정보:

내에 다음을 배치하려고 _vimrc했지만 운이 없다 (또한 vim에 파일을 열기 전에 파일의 문자 수를 계산하는 함수 (0이 아닌지 확인)가 있는지 확실하지 않습니다.

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

아니요, 중복되지 않습니다. vi가 언급 된 시나리오 3 개에 대해서만 삽입 모드로 시작하고 싶습니다.
John Sonderson

3
알았어, 슬프지만 복제품처럼 보였습니다. ;-) 차이점을 더 명확하게하기 위해 귀하의 질문을 약간 편집했습니다.
Martin Tournoij


2
@JohnSonderson 첫 번째 링크는 파일 이름이 지정되지 않은 경우 찾는 방법을 알려주고 normal대신 두 번째를 사용하여 조정할 수 있습니다 exec.
muru

1
vimrc 파일은 Vim이 시작될 때 한 번만 읽습니다 . autocmd의 내용은 트리거 될 때마다 실행됩니다. 그렇게 if문이 안 주위 autocmd, 경우는해야 내부 는 autocmd가 트리거 될 때마다 실행됩니다 있도록 autocmd.
Martin Tournoij

답변:


10

이것은 나를 위해 세 가지 경우 모두에 적용됩니다.

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

파일 이름이나 존재하지 않는 파일은 일반적으로 빈 버퍼로 시작하지 않기 때문에 이것들은 아마도 파일이 비어 있는지에 대한 마지막 확인으로 압축 될 수 있습니다. 그러나 일부 다른 플러그인은 일부 템플릿 플러그인과 같이 처음 두 경우 중 하나에서 일부 내용을 미리 채울 수 있으므로 세 가지를 모두 확인하는 것이 가장 좋습니다.

당신이 이미 가지고있는 첫 번째 테스트.

두 번째 테스트 filereadable는 0의 값 (존재하지 않음)과 비교하여 새 값 (있는 것과 반대)인지 확인해야합니다.

마지막 테스트는 파일의 마지막 줄 수가 1 (첫 줄이기도 함을 의미하는 첫 번째 줄임)과 줄 끝의 열 번호 (마지막 문자 뒤의 열)를 확인합니다. 줄)은 1이며 0 문자가 있음을 의미합니다. 문자가 0 인 한 줄만 있으면 파일이 비어 있어야합니다.

마지막 참고 사항 : 질문에 진술을하는 방식은 놀라운 결과를 초래할 수 있습니다. 즉, 시작시 조건이 충족되는 경우에만 설정 BufRead하고 BufNewFile나머지 세션 동안 해당 자동 명령이 존재합니다. 따라서 빈 파일에서 시작하여 이러한 명령을 설정하면 열려있는 모든 후속 파일 (새 파일이든 비어 있든 아니든)은 삽입 모드에서 시작됩니다.

자동 명령 VimEnter은 Vim의 시작이 끝날 때와 전체 세션에 대해 한 번만 실행됩니다. 이런 식으로 테스트는 Vim을 시작할 때만 실행되며 다른 시간에는 실행되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.