Como determinar qual buffer foi alterado externamente com gVim?

1

Estou usando o seguinte autocommand do Vim no meu arquivo .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

com a intenção de substituir o comportamento gVim padrão quando um arquivo é alterado externamente (consulte esta questão ). No entanto, se várias janelas forem abertas, mostrando vários buffers, o comando edit funcionará na última janela ativa e não na janela que contém o buffer que foi alterado.

Como posso determinar qual buffer causou o evento FileChangedShell e aplicar o edit commant a esse buffer?

    
por ysap 21.03.2014 / 20:19

2 respostas

0

Graças à resposta do @ IngoKarkat. Eu encontrei uma solução alternativa. Substitua o bloco if na função por:

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

Isso parece fazer o truque.

    
por 21.03.2014 / 20:46
4

De :help FileChangedShell :

NOTE: When this autocommand is executed, the
current buffer "%" may be different from the
buffer that was changed "<afile>".

Você precisa localizar a janela onde o arquivo correspondente está sendo editado. Para isso, o número do buffer (em <abuf> ) é ainda mais fácil:

let winNr = bufwinnr(0 + expand('<abuf>'))
execute winNr . 'wincmd w'
edit

O mesmo se aplica ao nome do buffer; substituir

let MyBn  = bufname("%")

com

let MyBn  = expand('<afile>')
    
por 21.03.2014 / 20:39