2009-09-12 13 views
8

Appelez-moi boiteux, mais je suis fatigué de mon subconscient C-x C-s contraction nerveux. Je change de tampons assez souvent et je pense que je voudrais enregistrer un certain tampon dès que je passe à un autre. Je n'ai pas encore eu le temps d'apprendre les bases d'Emacs-Lisp.Emacs enregistrer automatiquement sur le tampon de commutation

Des conseils sur la façon de faire ou de meilleures solutions?

(Sur le même sujet, j'ai trouvé un autosave workaround qui peut sauver le tampon courant dès que vous êtes inactif pendant un laps de temps donné.)

Répondre

16

développiez de answerSeth, je ferais ceci:

(defadvice switch-to-buffer (before save-buffer-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-window (before other-window-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-frame (before other-frame-now activate) 
    (when buffer-file-name (save-buffer))) 

La vérification de buffer-file-name tampons évite l'enregistrement des fichiers w/out. Vous devez trouver tous les points d'entrée que vous utilisez pour changer les tampons qui vous intéressent (je conseillerais également other-window).

+0

+1 de moi ... oublié le fichier tampon -name – seth

+1

Parfait! Merci :) 6 ans plus tard et toujours une bonne réponse –

6

Je suis un peu nouveau pour moi emacs lisp mais travaille dans mes tests:

(defadvice switch-to-buffer (before save-buffer-now) 
    (save-buffer)) 

(ad-activate 'switch-to-buffer) 

il est un peu ennuyeux mais parce qu'il est appelé après CHAQUE tampon (comme scratch). Alors, considérez cette réponse comme un indice.

Lorsque vous souhaitez le désactiver, vous devez appeler:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

Quelques idées. Tout d'abord, si vous vous trouvez en invoquant une commande comme save avec une fréquence suffisamment élevée, vous pouvez envisager une raccourcis clavier plus courte pour la commande. Par exemple, je me suis également retrouvé avec le même "twitch", alors maintenant j'utilise f2 au lieu de C-x C-s pour sauvegarder les modifications.

La fonction que je lie à f2 enregistre tous les tampons non sauvegardés de manière inconditionnelle. Vous pourriez le trouver utile:

(defun force-save-all() 
    "Unconditionally saves all unsaved buffers." 
    (interactive) 
    (save-some-buffers t)) 

(global-set-key [f2] 'force-save-all) 

Maintenant, sur le problème principal. Vous pouvez essayer quelque chose comme ça (notez que force-save-all est appelé):

(defun my-switch-to-buffer (buffer) 
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil))) 
    (force-save-all) 
    (switch-to-buffer buffer)) 

(global-set-key "\C-xb" 'my-switch-to-buffer) 

Bien sûr, vous pouvez également lier la fonctionnalité tampon de passage à une autre clé, comme une touche de fonction, pour que ce soit une opération de presse.

Je pensais que @seth avait une bonne idée sur l'utilisation de conseils, mais j'ai remarqué que le manuel ELisp suggère que advice not be used for key bindings. Je ne suis pas tout à fait sûr pourquoi c'est le cas, mais c'est ce que le manuel suggère FYI.

+0

Intéressant. Je n'ai pas vu cette partie sur les raccourcis clavier quand je lisais le manuel. Merci. – seth

+0

Le seul problème avec cette solution est lorsque vous par ex. commencez à utiliser 'ido-switch-buffer', vous devez aussi suivre les changements dans votre fonction. –

+0

C'est vrai, je suppose que vous pourriez redéfinir le symbole switch-to-buffer à cette nouvelle fonction (en sauvegardant l'original dans un autre symbole, par exemple orig-save-to-buffer) –