
Я использую в своем .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
Кажется, это срабатывает.