Как определить, какой буфер был изменен внешне с помощью 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

с намерением заменить поведение g Vim по умолчанию при внешнем изменении файла (см. этот вопрос). Однако если открыто несколько окон с несколькими буферами, edit Команда работает в последнем активном окне, а не в окне, содержащем буфер, который был изменен.

Как я могу определить, какой буфер вызвал FileChangedShell событие, и применить edit Commant для этого буфера?

2 ответа

Решение

Благодаря ответу @IngoKarkat. Я нашел альтернативное решение. Заменить if блок в функции с помощью:

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

Это, кажется, делает трюк.

От :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>')
Другие вопросы по тегам