gVim을 사용하여 외부에서 어떤 버퍼가 변경되었는지 확인하는 방법은 무엇입니까?

gVim을 사용하여 외부에서 어떤 버퍼가 변경되었는지 확인하는 방법은 무엇입니까?

내 파일에서는 다음 Vim 자동 명령을 사용하고 있습니다 .gvimrc.

augroup MyAuGroup
  autocmd MyAuGroup FileChangedShell * call FileChanedEvent_BuffUpdate()
augroup END

function FileChanedEvent_BuffUpdate()
  let MyBn  = bufname("%")
  let MyStr = "Warning: File \"".MyBn."\" has changed since editing started\nSee \":help W11\" for more info."
  let MyTest = confirm(MyStr, "&OK\n&Load File", 2, "W")
  if MyTest == 2
    edit
  else
  endif
endfunction

파일이 외부에서 변경될 때 기본 gVim 동작을 대체하려는 의도로(참조이 질문). 그러나 여러 개의 창이 열려 여러 개의 버퍼를 표시하는 경우 명령은 edit변경된 버퍼가 포함된 창이 아닌 마지막 활성 창에서 작동합니다.

FileChangedShell어떤 버퍼가 이벤트를 발생시켰는지 확인하고 edit해당 버퍼에 명령을 적용하려면 어떻게 해야 합니까 ?

답변1

에서 :help FileChangedShell:

NOTE: When this autocommand is executed, the
current buffer "%" may be different from the
buffer that was changed "<afile>".

해당 파일이 편집되고 있는 창을 찾아야 합니다. 이를 위해 버퍼 번호(in <abuf>)가 훨씬 더 쉽습니다.

let winNr = bufwinnr(0 + expand('<abuf>'))
execute winNr . 'wincmd w'
edit

버퍼 이름에도 동일하게 적용됩니다. 바꾸다

let MyBn  = bufname("%")

~와 함께

let MyBn  = expand('<afile>')

답변2

@IngoKarkat의 답변에 감사드립니다. 대체 솔루션을 찾았습니다. if함수의 블록을 다음으로 바꾸십시오 .

  if MyTest == 2
    let v:fcs_choice = "reload"
  else
    let v:fcs_choice = ""
  endif

이것이 트릭을 수행하는 것 같습니다.

관련 정보