Emacs: rouvrir les tampons de la dernière session au démarrage?

89

Chaque jour, je lance emacs et j'ouvre exactement les mêmes fichiers que j'avais ouverts la veille. Y a-t-il quelque chose que je peux ajouter au fichier init.el pour qu'il rouvre tous les tampons que j'utilisais lors de ma dernière fermeture d'emacs?

Kristina
la source
Il semble que la gestion du bureau est différente dans Emacs 21 et 22+. Le sujet est décrit sur cette page: emacswiki.org/emacs/DeskTop .
hji
Un autre changement dans le chemin par défaut de la gestion du bureau est venu dans 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Réponses:

116

Vous pouvez utiliser la bibliothèque Emacs Desktop :

Vous pouvez enregistrer le bureau manuellement avec la commande Mx desktop-save. Vous pouvez également activer la sauvegarde automatique du bureau lorsque vous quittez Emacs et la restauration automatique du dernier bureau enregistré au démarrage d'Emacs: utilisez le tampon de personnalisation (voir Personnalisation facile) pour définir le mode de sauvegarde du bureau sur t pour les sessions futures, ou ajoutez cette ligne dans votre fichier ~ / .emacs:

 (desktop-save-mode 1)
Jared Oberhaus
la source
5
Très bonne réponse. Cependant, j'ai remarqué qu'Emacs réorganise l'ordre des tampons entre les sessions. Existe-t-il un moyen de toujours avoir le même ordre de tampon?
axel22
Si quelqu'un a des problèmes pour que cela fonctionne (comme je l'ai fait), voici une technique pour diagnostiquer le problème: activez le débogage en M-:exécutant (setq debug-on-error t), puis appelez desktop-revertet il pourrait détecter l'erreur incriminée dans le débogueur. Pour moi, c'était un paramètre global qui était censé être un tampon local provoquant l'échec de la restauration de l'image. (Le simple fait d'utiliser emacs --debug-initpourrait également résoudre le problème, mais j'ai utilisé l'ancienne méthode.)
robenkleene
10

Bien que je soupçonne que la question recherchait la fonctionnalité "bureau" emacs (voir la réponse ci-dessus), l'approche de Lewap peut être utile si l'ensemble de fichiers que l'on utilise est exactement le même ensemble de fichiers. En fait, on peut aller plus loin et définir des `` profils '' si l'on a différents ensembles de fichiers régulièrement utilisés ... Exemple de Quickie:

(let ((profile 
       (read-from-minibuffer "Choose a profile (acad,dist,lisp,comp,rpg): ")
       ))
  (cond
   ((string-match "acad" profile) 
    (dired "/home/thomp/acad")
    (dired "/home/thomp/acad/papers")
    )
   ((string-match "lisp" profile)
    (setup-slime)
    (lisp-miscellany)
    (open-lisp-dirs)
    )
   ((string-match "rpg" profile)
    (find-file "/home/thomp/comp/lisp/rp-geneval/README")
    (dired "/home/thomp/comp/lisp/rp-geneval/rp-geneval")
... etc.

Si vous constatez que vous basculez régulièrement entre différents ensembles de fichiers régulièrement utilisés pendant que vous travaillez, envisagez d'utiliser des perspectives et de remplir chaque perspective avec l'ensemble souhaité de fichiers régulièrement utilisés.

dat
la source
6

Pour stocker / restaurer les tampons / onglets (en particulier les onglets elscreen): J'utilise elscreen et la façon dont je gère le stockage / la restauration de la session de bureau et de la configuration de l'onglet elscreen est le code suivant dans mon fichier .emacs (les noms utilisés sont explicites et si les fonctions de stockage / restauration ne doivent pas être exécutées à chaque fois qu'emacs démarre, il suffit de commenter les lignes avec "(push # 'elscreen-store kill-emacs-hook)" et "(elscreen-restore)"):

(defvar emacs-configuration-directory
    "~/.emacs.d/"
    "The directory where the emacs configuration files are stored.")

(defvar elscreen-tab-configuration-store-filename
    (concat emacs-configuration-directory ".elscreen")
    "The file where the elscreen tab configuration is stored.")

(defun elscreen-store ()
    "Store the elscreen tab configuration."
    (interactive)
    (if (desktop-save emacs-configuration-directory)
        (with-temp-file elscreen-tab-configuration-store-filename
            (insert (prin1-to-string (elscreen-get-screen-to-name-alist))))))
(push #'elscreen-store kill-emacs-hook)
(defun elscreen-restore ()
    "Restore the elscreen tab configuration."
    (interactive)
    (if (desktop-read)
        (let ((screens (reverse
                        (read
                         (with-temp-buffer
                          (insert-file-contents elscreen-tab-configuration-store-filename)
                          (buffer-string))))))
            (while screens
                (setq screen (car (car screens)))
                (setq buffers (split-string (cdr (car screens)) ":"))
                (if (eq screen 0)
                    (switch-to-buffer (car buffers))
                    (elscreen-find-and-goto-by-buffer (car buffers) t t))
                (while (cdr buffers)
                    (switch-to-buffer-other-window (car (cdr buffers)))
                    (setq buffers (cdr buffers)))
                (setq screens (cdr screens))))))
(elscreen-restore)
sadesyllas
la source
Pour tous ceux qui empruntent cette voie, juste un point mineur que vous pouvez remplacer emacs-configuration-directorypar user-emacs-directoryce que Emacs fournit déjà.
Joe
2

Vous pouvez apporter des améliorations utiles à la fonction de bureau de base. Les méthodes d'enregistrement automatique du bureau pendant la session sont particulièrement pratiques (IMO), car sinon, si votre système tombe en panne, vous serez coincé avec le fichier de bureau avec lequel vous avez commencé cette session - assez ennuyeux si vous avez tendance à garder Emacs en marche pendant beaucoup jours à la fois.

http://www.emacswiki.org/emacs/DeskTop

Le wiki contient également des informations utiles sur les données persistantes entre les sessions en général:

http://www.emacswiki.org/emacs/SessionManagement

Pour les ordinateurs de bureau en particulier, je pensais que Desktop Recover avait l'air particulièrement prometteur, mais je ne l'ai pas encore essayé.

phils
la source
-2

(find-file-noselect "/my/file")va l'ouvrir silencieusement, c'est-à-dire sans augmenter le tampon. Juste dire.

EDIT Cette commande n'est pas interactive ; Pour le tester, vous devez évaluer l'expression, par exemple en positionnant le curseur après la dernière parenthèse et en appuyant sur Cx Ce

Voter contre ce n'est pas cool ; cette commande fonctionne définitivement et est dans le cadre de la question.

yPhil
la source
2
Je n'ai pas voté contre, mais peut-être que votre réponse a été rejetée parce qu'elle n'aborde pas la question de savoir comment ouvrir spécifiquement les tampons qui étaient ouverts lors de la session Emacs précédente.
Ryan C. Thompson
1
a voté contre parce qu'il n'a rien à voir avec le Q.
RichieHH