1

Я использую следующую автокоманду 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 ?

2 ответа2

4

От :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>')
0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .