BufDelete의 Vim 자동 명령으로 도움말 창을 열 수 없음


1

https://superuser.com/a/669463/199803에 여기에 설명 된 자동 명령이 있습니다 .vimrc.

편집 : 편의를 위해 질문 본문에 복사했습니다.

function CountListedBuffers() 
     let cnt = 0 
     for nr in range(1,bufnr("$")) 
         if buflisted(nr) && ! empty(bufname(nr))
             let cnt += 1 
         endif 
     endfor 
     return cnt 
endfunction

function QuitIfLastBuffer()
     if CountListedBuffers() == 1
         :q
     endif
 endfunction

autocmd BufDelete * :call QuitIfLastBuffer()

그러나 기괴하게도 정확히 하나의 나열된 버퍼가 있고 :help명령 을 사용하려고 하면 도움말 창이 열리지 않습니다 (또는 아마도 열리고 즉시 닫힙니다). my에서 자동 명령 줄을 주석 처리하면 .vimrc이 동작이 더 이상 발생하지 않습니다.

왜 이런 일이 발생하며 어떻게 해결할 수 있습니까? 왜 사건을 :h유발 BufDelete할까요?

편집 : 상세 수준을 12로 설정하면 BufDelete 이벤트가 실제로 발생한다는 것을 알 수 있습니다. 나와 관련이있는 출력 부분은 다음과 같습니다.

Executing BufAdd Auto commands for "*"
autocommand call <SID>BMAdd()
calling function <SNR>6_BMAdd
calling function <SNR>6_BMAdd..<SNR>6_BMFilename
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge..<SNR>6_BMTruncName
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge..<SNR>6_BMTruncName returning '/usr/local/share/vim/vim74/doc'
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge returning 'help\.txt\ (4)\^I/usr/local/share/vim/vim74/doc'
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMHash
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMHash returning #340582286
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename
function <SNR>6_BMAdd..<SNR>6_BMFilename returning #0
continuing in function <SNR>6_BMAdd
function <SNR>6_BMAdd returning #0
continuing in BufAdd Auto commands for "*"
Executing BufDelete Auto commands for "*"
autocommand :call QuitIfLastBuffer()

'verbose'레벨을 12로 설정하고 도움말 창을 열어보십시오. 또한 QuitIfLastBuffer 함수에 무엇이 있는지 알고 있으면 도움이 될 수 있습니다.
Heptite

@Heptite, 문제의 기능은 내가 포함 한 링크에 완전히 복사되었습니다.
Kyle Strand

질문 본문에 넣으십시오.
romainl

답변:


1

바꿔보십시오

if buflisted(nr) && ! empty(bufname(nr))

if buflisted(nr) && ! empty(bufname(nr)) || getbufvar(nr, '&buftype') ==# 'help'

도움말 버퍼가 로직을 종료하지 않도록합니다.


그런 다음 Vim buftype은 "알 수없는 기능"이라고 말합니다 .
Kyle Strand

아 죄송합니다. 이것은 옵션이 아니라 기능입니다. 내 편집을 참조하십시오.
Ingo Karkat

훌륭합니다. 고맙습니다. 자동 명령은 Vim에서 디렉토리를 열지 못하게하는 것처럼 보입니다 (즉 vim /path/to/dir, 쉘 화면을 깜박입니다). 비슷한 수정이 있다고 생각하십니까?
Kyle Strand

이것들은 buftype을 가질 수 있습니다 nofile. 시도하십시오 ! empty(getbufvar(nr, '&buftype')); 그것은 또한 도움말 버퍼를 포함해야하므로 내 대답의 조건을 그것으로 대체하십시오.
Ingo Karkat

1
그래, 그 변화로 :h여전히 작동하지만, 디렉토리에 vim을 열려고하면 /path/to/dir: is a directory플래시가 보이고 vim이 여전히 종료됩니다. 그래서 ... 약간 진행됩니다.
Kyle Strand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.