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