Comment recharger un fichier dans un tampon?

110

Je travaille généralement sur des fichiers mis à jour dans le système de fichiers via le contrôle de version. Quel est un moyen rapide de recharger un fichier sans avoir à C-x C-fle sauvegarder à nouveau et être demandé si je veux le recharger?

Fernando Briano
la source

Réponses:

117

M-x revert-bufferfera exactement ce que vous voulez. Il faudra toujours demander une confirmation.

Une autre option (ma préférée) est la fonction ci-dessous:

;; 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
la source
8
Vous pourriez avoir cité la bibliothèque que ce code est de: misc-cmds.el. Non pas que cela soit compliqué, mais lorsque vous copiez quelque chose exactement, il est de la politesse habituelle de pointer vers la source.
Drew
3
Excuses! Moi-même, je ne savais pas d'où j'avais tiré cet extrait. J'aurais dû au moins googler le nom de la fonction et essayer de trouver sa source pour pouvoir la créditer ici. Mise à jour J'ai noté les sources de tout ce que j'ai copié. tout était pas sûr de celui - ci: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/...
Kaushal Modi
4
Je ne recommanderais pas cette fonction. Il est trop dangereux d'utiliser accidentellement sur un fichier modifié.
Gilles
2
@ Gilles Je suis d'accord, avec un grand pouvoir vient une grande responsabilité. Je ne lierais pas cela à une liaison facile d'accès.
Kaushal Modi
6
Ma variante de celui-ci ne demandera confirmation que si le tampon est modifié en utilisant (revert-buffer t (not (buffer-modified-p)) t).
glucas
55

Il y a aussi auto-revert-modequi le fait automatiquement et vous donne des commentaires.

De la chaîne de documentation:

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
la source
50

Une autre option, que j'utilise, est find-alternate-fileliée à C-x C-v. Cela ouvre un fichier réutilisant votre tampon actuel.

Par défaut, il pointe vers le fichier sur lequel vous vous trouvez, vous pouvez donc simplement taper C-x C-v RETpour recharger votre fichier. Il ne vous demandera pas à moins que votre tampon contienne des données non sauvegardées.

Certains modes non textuels, tels que image-mode(utilisés pour le rendu des images, pdfs, svgs, etc.) diredsont revert-bufferliés à gun accès plus rapide.

Tikhon Jelvis
la source
3
Ceci est mon nouveau aller à. Merci de le mentionner.
ramsey_tm
J'ai eu un (ffap-bindings) dans mon .emacs qui semble changer la liaison de C-x C-v.
Ychaouche
C'est génial, merci! Simple et efficace Au fait, comment faire en sorte qu'Emacs remarque que le fichier en cours a changé? Par exemple, VIM en mode GUI détecte un changement de fichier automatiquement lorsque l'application est activée (elle passe de l'arrière-plan).
Mato
Cela devrait être la réponse acceptée.
Toon Claes le
10

Emacs appelle cela reverting.

Vous pouvez inverser le fichier actuel avec M-x revert-buffer. Ceci vous demande de confirmer si le fichier a été modifié ou non, sauf pour les fichiers qui correspondent aux modèles listés dans la variable revert-without-query(voir le manuel pour plus de détails). Un autre inconvénient occasionnel revert-bufferest qu'il réinitialise le mode de fichier sur le mode par défaut.

J'utilise la fonction suivante pour retourner un tas de fichiers, donnés par nom. Si un fichier n'est pas ouvert dans un tampon, il est ignoré.

(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)))))))

Un cas d'utilisation typique de cette fonction est après la mise à jour des fichiers à partir du contrôle de version. Permet emacsclientd’appeler revert-filestous les fichiers mis à jour ou (c’est plus facile et à peine plus lent) sur tous les fichiers concernés par la mise à jour. J'appelle le script shell suivant en lui transmettant les fichiers comme arguments:

#! /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)"

Exemple d'utilisation:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +
Gilles
la source
Ces jours-ci, comme @webappzero le dit dans sa réponse, magit résout sans problème cette partie du problème de la restauration de fichiers.
Croad Langshan
8

vous pouvez également activer le mode global-auto-revert comme indiqué ci-dessous

(global-auto-revert-mode 1)

Ceci est utile lorsque vous effectuez de nombreuses vérifications de vos fichiers js avec le mode de correction automatique activé, comme dans jssc.

DmitrySemenov
la source
7

revert-buffery a-t-il. Mais j'aime bien avoir des retours.

J'ai le suivant dans mon .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))
kindahero
la source
3

Vous pouvez utiliser find-alternate-filece qui est lié C-x C-vpar défaut et simplement taper RETà l'invite pour recharger le fichier.

DoMiNeLa10
la source
3

Pour les utilisateurs de spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Pour éviter la confirmation, d’autres réponses traitent déjà de cette question, bien que je convienne avec d’autres que ce n’est probablement pas une bonne idée de la lier à une clé.

Croad Langshan
la source
2

Magit gère automatiquement les réversions de fichiers, résolvant ainsi votre problème principal. Vous bénéficiez également de ses autres fonctionnalités.

Voici la documentation pour peaufiner les paramètres qui vous intéressent:

Si vous vous en tenez à Magit, veillez également à activer les 3 modes globaux WIP (travail en cours) pour éviter de perdre du travail.

Vous pouvez ainsi effectuer des actions de contrôle de version dans Emacs avec Magit et éviter votre problème d'origine.

webappzero
la source
1
S'il vous plaît laissez-moi savoir si cela est utile.
webappzero
Cette réponse devrait avoir plus de votes positifs! Au cas où ce ne soit pas clair: les modes WIP peuvent être bons (je ne les utilise pas actuellement), mais ils ne sont pas strictement nécessaires pour résoudre le problème de retour pour vous.
Croad Langshan