Comment puis-je fermer automatiquement les tampons lorsque le fichier sous-jacent est supprimé?

9

Je laisse Emacs fonctionner toute la journée, et je vais souvent faire beaucoup de manipulation du système de fichiers sur les fichiers ouverts dans les tampons Emacs. Par exemple, je pourrais passer à une branche différente dans Git qui a une structure de répertoires très différente.

Malheureusement, cela me laisse un tas de tampons ouverts qu'Emacs enregistre maintenant en tant que tampons "modifiés" faisant référence à de "nouveaux" fichiers. À moins que je ne fasse attention à les fermer manuellement chaque fois que je le fais, il est facile d'enregistrer par réflexe ces tampons, ce qui entraîne alors des fichiers parasites, probablement en double dans mon projet. Je ne peux même pas fermer emacs sans répondre à la question "enregistrer ce tampon" pour chacun.

Existe-t-il un moyen de fermer automatiquement les tampons non modifiés lorsque le fichier sous-jacent disparaît? Similaire dans l'esprit à global-auto-revert-modecelui qui gère également lorsqu'un fichier est entièrement supprimé?

levand
la source
Consultez la section 38.20 du
izkon

Réponses:

6

Je pense que quelque chose dans ce sens pourrait fonctionner:

(defun buffer-backed-by-file-p (buffer)
  (let ((backing-file (buffer-file-name buffer)))
    (if (buffer-modified-p buffer)
        t
      (if backing-file
          (file-exists-p (buffer-file-name buffer))
        t))))

(mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))

La buffer-backed-by-file-pfonction vérifie si le fichier est sauvegardé par un fichier - sinon, retourne vrai, sinon retourne si le fichier de sauvegarde existe. Nous prenons ensuite la liste des tampons, filtrant tout sauf ceux qui devraient avoir un fichier de sauvegarde, mais le fichier n'existe pas, puis les tuons.

Nécessite dash.el pour -remove, parce que j'étais trop paresseux pour trouver un intégré pour réaliser la même chose.

J'espère que cela t'aides!

Algernon
la source
Vous devez toujours exécuter cette mapccommande chaque fois que vous souhaitez supprimer les tampons non sauvegardés par des fichiers, n'est-ce pas? Ce n'est donc pas entièrement automatique. Pour une automatisation complète, vous devez soit vous assurer qu'il mapcs'exécute de manière répétée, soit utiliser quelque chose comme inotifypour l'exécuter à votre place lorsqu'un fichier est réellement supprimé.
izkon
Oui, il faudrait l'exécuter périodiquement, ou en réponse à des événements inotify ou similaires. Moi-même, je l'exécutais périodiquement, toutes les minutes environ. Pas parfait, mais assez bon pour la plupart des cas. (run-with-timer 60 60 (lambda () (mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))))est ce que j'utiliserais comme première approximation.
algernon
1
Mis en œuvre cela, et cela a très bien fonctionné. J'ai utilisé cette petite fonction wrapper pour l'appeler, au cas où quelqu'un aurait besoin de quelque chose de similaire: `(defun kill-remove-buffers () (interactive) (let ((to-kill (-remove 'buffer-supported-by-file-p) (buffer-list)))) (mapc 'kill-buffer to-kill) (message "Killed% s buffers" (length to-kill)))) `Désolé, je ne parviens pas à le formater correctement dans la zone de commentaire .
levand