vim sudo hack auto reload

3

Eu instalei e aliei uma versão mais recente do vim e fiz um alias do vim para chamar essa versão.

Eu também aliei o sudo para que ele possa apenas chamar o vi padrão do sistema quando eu precisar editar um arquivo como sudo, mas isso tem dois problemas. Principalmente não há destaque de sintaxe na versão do sistema do vi e às vezes eu apenas vim um arquivo e quero fazer alguns pequenos testes enquanto o arquivo está vivo, mas eu tenho que sair do vim e ir para o vi e isso é apenas um fluxo de trabalho lento. >

Encontrei este link que explica um legal sudo hack para que eu possa ficar na minha sintaxe atual destaque vim e salve o arquivo como sudo com um comando especial.

cnoremap w!! w !sudo /usr/bin/tee > /dev/null %

funciona muito bem, mas tenho um problema que está chegando.

executando o comando Eu sempre recebo esta saída.

:w !sudo /usr/bin/tee > /dev/null %

W12: Warning: File "../lid.sh" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

olhando: ajuda W12 diz isso:

  Warning: File "{filename}" has changed and the buffer was changed in Vim as well

Like the above, and the buffer for the file was changed in this Vim as well.
You will have to decide if you want to keep the version in this Vim or the one
on disk.  This message is not given when 'buftype' is not empty.

a ajuda do autoread diz:

'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. When the file has been deleted this is not done. |timestamp| If this option has a local value, use this command to switch back to using the global value: > :set autoread<

e eu tenho :set autoread no meu .vimrc, mas isso não parece funcionar. Sempre me perguntam o tempo todo, não há problema em recarregar o arquivo.

como posso apenas optar por recarregar o arquivo sem ter que aceitá-lo manualmente todas as vezes. Digitação: w !! é um comando longo o suficiente, onde eu não farei isso a menos que seja necessário.

    
por user1610950 14.12.2015 / 09:26

2 respostas

3

Eu resolvi esse problema adicionando isso ao meu arquivo vimrc.

cnoremap w!! call SudoSaveFile()

function! SudoSaveFile() abort
  execute (has('gui_running') ? '' : 'silent') 'write !env SUDO_EDITOR=tee sudo -e % >/dev/null'
  let &modified = v:shell_error
endfunction
    
por 23.12.2015 / 05:29
0

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> .

    
por 13.07.2017 / 04:04

Tags