Como recarregar um arquivo em um buffer?

110

Normalmente trabalho em arquivos que são atualizados no sistema de arquivos via controle de versão. O que é uma maneira rápida de recarregar um arquivo sem precisar C-x C-fnovamente e ser perguntado se eu quero recarregá-lo?

Fernando Briano
fonte

Respostas:

117

M-x revert-bufferfará exatamente o que você quiser. Ele ainda solicitará confirmação.

Outra opção (minha favorita) é a função abaixo:

;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
    "Revert buffer without confirmation."
    (interactive)
    (revert-buffer :ignore-auto :noconfirm))
Kaushal Modi
fonte
8
Você poderia ter citado a biblioteca que esse código é de: misc-cmds.el. Não que isso seja complicado, mas quando você copia algo exatamente , é uma cortesia comum apontar para a fonte.
Drew
3
Desculpas! Eu mesmo não tinha certeza de onde consegui esse trecho. Eu deveria ter pesquisado pelo menos o nome da função e tentar encontrar sua fonte para poder creditar aqui. Atualização Anotei as fontes de tudo o que copiei; apenas não tinha certeza sobre este: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi
4
Eu não recomendaria esta função. É muito perigoso usá-lo acidentalmente em um arquivo modificado.
Gilles
2
@ Gilles Eu concordo, com grande poder vem uma grande responsabilidade. Eu não ligaria isso a uma ligação de fácil acesso.
precisa saber é o seguinte
6
Minha variante disso solicitará confirmação apenas se o buffer for modificado usando (revert-buffer t (not (buffer-modified-p)) t).
glucas
55

Há também o auto-revert-modeque faz isso automaticamente e fornece feedback.

Na sequência de documentos:

auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.

(auto-revert-mode &optional ARG)

Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

Auto Revert mode is a minor mode that affects only the current
buffer.  When enabled, it reverts the buffer when the file on
disk changes.

Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.
thermans
fonte
50

Outra opção, que eu uso, está find-alternate-filevinculada C-x C-v. Isso abre um arquivo reutilizando seu buffer atual.

Por padrão, ele aponta para o arquivo em que você está atualmente, para que você possa digitar C-x C-v RETpara recarregar seu arquivo. Não será solicitado, a menos que seu buffer tenha dados não salvos.

Alguns modos que não são de texto, como image-mode(usados ​​para renderizar imagens, pdfs, svgs ... etc), diredsão revert-bufferobrigatórios gpara acesso mais rápido.

Tikhon Jelvis
fonte
3
Esta é a minha nova opção. Obrigado por mencionar.
ramsey_tm
Eu tinha um (ffap-bindings) no meu .emacs que parece alterar a ligação de C-x C-v.
ychaouche
Isso é ótimo, obrigado! Simples e eficaz. Btw, como fazer o Emacs perceber que o arquivo atual foi alterado? Por exemplo, o VIM no modo GUI detecta uma alteração de arquivo automaticamente quando o aplicativo obtém o foco (é alternado para segundo plano).
mato
Essa deve ser a resposta aceita.
Toon Claes
10

O Emacs chama isso reverting.

Você pode reverter o arquivo atual com M-x revert-buffer. Isso solicita confirmação se o arquivo foi modificado ou não, exceto os arquivos que correspondem aos padrões listados na variável revert-without-query(consulte o manual para obter detalhes). Outro aborrecimento ocasional revert-bufferé que ele redefine o modo de arquivo para o padrão.

Eu uso a seguinte função para reverter um monte de arquivos, dados pelo nome. Se um arquivo não for aberto em algum buffer, ele será ignorado.

(defun revert-files (&rest files)
  "Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
  (save-excursion
    (let ((revert-without-query '("")))
      (dolist (file-name files)
        (message "Considering whether to revert file %s" file-name)
        (let ((buf (find-buffer-visiting file-name)))
          (when buf
            (message "Reverting file in buffer %s" (buffer-name buf))
            (set-buffer buf)
        (revert-buffer t nil t)))))))

Um caso de uso típico para essa função é após atualizar arquivos do controle de versão. Use emacsclientpara chamar revert-filestodos os arquivos que foram atualizados ou (isso é mais fácil e apenas um pouco mais lento) em todos os arquivos envolvidos na atualização. Eu chamo o seguinte script de shell, passando os arquivos como argumentos:

#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=

## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
  CYGWIN*)
    absolute_path () {
      cygpath -a -w -- "$1"
    };;
  *)
    wd="`pwd -P 2>/dev/null || pwd`"
    absolute_path () {
      case "$1" in
        /*) printf '%s' "$1";; # ordinary absolute path
        *:/*)
          if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
            printf '%s' "$1" # URI or machine:/some/path
          else
            printf '%s' "$wd/$1" # default to a relative path
          fi;;
        *) printf '%s' "$wd/$1";; # default to a relative path
      esac
    };;
esac

for x; do
  files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"

Exemplo de uso:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +
Gilles
fonte
Estes dias, a partir @webappzero diz em sua resposta, magit resolve essa parte do problema de reversão de arquivos de forma indolor
Croad Langshan
8

você também pode ativar o modo de reversão automática global, como mostrado abaixo

(global-auto-revert-mode 1)

isso é útil quando você faz muitas verificações de seus arquivos js com o modo de correção automática ativado, como no jssc.

DmitrySemenov
fonte
7

revert-bufferexiste. Mas eu gosto de ter algum feedback.

Eu tenho o seguinte no meu .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))
tipo de herói
fonte
3

Você pode usar find-alternate-file, que está vinculado C-x C-vpor padrão, e simplesmente digitar RETno prompt para recarregar o arquivo.

DoMiNeLa10
fonte
3

Para usuários do spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Para ignorar a confirmação, outras respostas já cobrem isso, embora eu concorde com outras pessoas que provavelmente não é uma boa ideia vincular isso a uma chave.

Croad Langshan
fonte
2

O Magit gerencia automaticamente as reversões de arquivos, resolvendo assim o seu problema principal. Você também se beneficia de seus outros recursos.

Aqui estão os documentos para ajustar as configurações nas quais você está interessado:

Se você seguir o Magit, ative também os 3 modos WIP globais (Trabalho em andamento) para evitar a perda de trabalho.

Assim, você pode executar ações de controle de versão no Emacs com Magit e evitar completamente o problema original.

webappzero
fonte
11
Informe-me se isso for útil.
Webappzero
Esta resposta deve ter mais votos positivos! Caso não esteja claro: os modos WIP podem ser bons (não os uso atualmente), mas não são estritamente necessários para resolver o problema de reversão.
Croad Langshan