A resposta aceita (com generosidade) está errada. Isso não resolverá o problema, porque o aviso W12 acontecerá depois que a função retornar.
O problema é, conforme declarado pelo doc citado na pergunta (meu negrito ):
autoread' 'ar' 'noautoread' 'noar' 'autoread' 'ar'
boolean (default on) global or local to buffer |global-local|
When a file has been detected to
have been changed outside of Vim and it has not been changed inside
of Vim, automatically read it again.
Isso significa que a opção autoread aborda apenas os avisos W11 .
Para resolver o problema, tentei por muitas horas criar uma solução, alterando temporariamente buftype
, entre outras coisas, mas acabou sendo bastante simples:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Isso significa, recarregar o arquivo depois de salvar. Isso garantirá que o aviso não aconteça, já que o arquivo agora é idêntico ao buffer.
- Esta solução também funciona independentemente da sua opção
autoread
. Eu gosto do meu noautoread
, então eu sei se quero descartar as alterações ou não.
Você pode colocar um " <CR>
" extra no final,
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
ou se você quiser uma função, algo como:
cnoremap w!! call SudoWriteBangBang()<CR>
function! SudoWriteBangBang()
execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
endfunction
mas prefiro não ter o comando concluído de uma só vez. Sem <CR>
você tem a chance de dar uma olhada no comando mais uma vez antes de decidir. Além disso, imita melhor o comportamento de :w
e :w!
, pois eles também esperam um manual <CR>
.