Как определить, какой буфер был изменен извне с помощью gVim?

Как определить, какой буфер был изменен извне с помощью gVim?

Я использую в своем .gvimrcфайле следующую автокоманду Vim:

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>".

Вам нужно найти окно, в котором редактируется соответствующий файл. Для этого номер буфера (в <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

Кажется, это срабатывает.

Связанный контент