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-f
novamente e ser perguntado se eu quero recarregá-lo?
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-f
novamente e ser perguntado se eu quero recarregá-lo?
Respostas:
M-x revert-buffer
fará 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))
(revert-buffer t (not (buffer-modified-p)) t)
.
Há também o auto-revert-mode
que 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.
Outra opção, que eu uso, está find-alternate-file
vinculada 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 RET
para 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), dired
são revert-buffer
obrigatórios g
para acesso mais rápido.
C-x C-v
.
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 emacsclient
para chamar revert-files
todos 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 {} +
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.
revert-buffer
existe. 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")))
Você pode usar find-alternate-file
, que está vinculado C-x C-vpor padrão, e simplesmente digitar RETno prompt para recarregar o arquivo.
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.
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.
misc-cmds.el
. Não que isso seja complicado, mas quando você copia algo exatamente , é uma cortesia comum apontar para a fonte.