Como recarrego o arquivo atual?

145

Frequentemente, estou trabalhando com arquivos controlados por versão, portanto, é possível fazer alterações neles fora do Vim.

Qual é uma maneira rápida de recarregar o arquivo sem precisar fechar e reabrir o Vim? E existe uma maneira de fazer isso automaticamente?

Kevin Brown
fonte
" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale
Se você instalou o vim-faq , poderá obter uma resposta offline lá: :h vim-faqe pesquisar /reload. A tag difícil de memorizar é :h faq-5.8.
Hotschke 23/07

Respostas:

172

O comando que você deseja é :e(abreviação de :edit). Se você usá- :edit!lo, descartará as alterações locais e recarregará.

Você também pode fazer com que o vim faça isso automaticamente com set autoreado vimrc.

xthrd
fonte
5
Veja esta resposta para advertências e soluções relacionadas autoread.
Tom Hale
4
Para fazer isso em todos os buffers, use :bufdo :eou:bufdo :e!
Aaron H.
11
@AaronH. obrigado por isso! Eu geralmente tenho centenas de buffers abertos ao mesmo tempo e, ao alternar entre ramificações, geralmente fecho o vim e reinicio para atualizar todos os buffers com novos conteúdos. Este será um grande economia de tempo!
g19fanatic
11
@AaronH. O segundo :é opcional: :bufdo efuncionará da mesma maneira.
JoL
19

Em muitos casos, set autoreadnão funcionará, pois esta resposta explica:

A leitura automática não recarrega o arquivo, a menos que você execute algo como executar um comando externo (como !lsou !shetc)

Os eventos de foco serão acionados autoread, mas eles não serão capturados, a menos que sejam utilizados gvim. Portanto, se estiver rodando sem problemas vimdentro de uma janela de terminal ou tmux, instale o plug - in vim-tmux-focus-events .

Nas versões tmux> 1.9, você precisará adicionar .tmux.conf:

set -g focus-events on

Para maior utilidade, adicionar o seguinte ao seu vimrcacionará autoreadao alterar os buffers dentro e dentro do vim:

au FocusGained,BufEnter * :checktime
Tom Hale
fonte
Isso me incomoda há anos. Obrigado por uma solução completa! #
Nathan Long
9

Se você já executou um comando externo do Vim que modifica o buffer atual, pode ter notado que ele solicita que você recarregue o arquivo, pois as alterações foram feitas no disco. Você pode realmente chamar esse prompt usando o :checktimecomando

tommcdo
fonte
3

Bom plugin para melhorar autoread https://github.com/djoshea/vim-autoread

Faz com que o vim recarregue automaticamente os arquivos que foram gravados no disco, mas não modificados no buffer desde a última gravação do vim. Isso permite que um arquivo aberto no vim seja editado usando outro aplicativo e salvo. Ao retornar ao vim, desde que você não tenha modificado o arquivo desde a última alteração, o arquivo será atualizado automaticamente para refletir as alterações feitas no disco, como se você tivesse pressionado: e manualmente.

und3rdg
fonte
Bem-vindo ao Vi Stack Exchange. Esta é quase uma resposta apenas para link. Você pode aprimorá-lo descrevendo o plugin (por exemplo, o que ele faz? Como alguém o utilizaria para atingir os objetivos do OP?)
John O'M.
0

Eu tive o problema de examinar o conteúdo de um arquivo, atualizar o arquivo externamente, exibir o arquivo alterado e ter a opção de editá-lo quando necessário. Eu o resolvi com as opções de linha de comando remota / servidor Vim, inspiradas nesta resposta .


Com os seguintes comandos, um arquivo pode ser recarregado através de um comando externo. Primeiro, abra o arquivo em questão com o Vim, enquanto inicia uma instância do servidor.

vim --servername JABBERWOCKY /tmp/alice.log

Vamos supor que o arquivo tenha sido alterado externamente, por exemplo, por a echo "Curiouser and curiouser" >> /tmp/alice.log. Quando necessário, envie um comando para a instância do servidor para recarregar o arquivo. Este comando será concluído rapidamente e não gerará um novo editor.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Se o arquivo aberto foi alterado no Vim e externamente, haverá um conflito durante a recarga (uma mensagem de aviso será exibida). Nesse caso, é necessário tomar uma decisão: deixe com isso e mantenha as alterações no Vim ou descarte as alterações locais e force a recarga .


O comando --remote-sendacima requer recarregamento manual. No entanto, esse comando pode ser vinculado a um loop simples, usando o for/ do Bash while, ou usando um liner hacky no Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Embora não tenha sido testado, tenho certeza de que algo assim também pode ser realizado no PowerShell.

No Linux / Unix, uma abordagem orientada a eventos pode ser realizada ouvindo os eventos do sistema de arquivos usando, por exemplo, a biblioteca inotify , se você não estiver usando sistemas de arquivos muito loucos. Pessoalmente, gosto muito de usar a ferramenta entr , que parece estar incluída nas principais distribuições Linux. Então eu recebo:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Piscoris
fonte