Emacs: ¿reabrir búferes de la última sesión al inicio?

89

Todos los días enciendo emacs y abro exactamente los mismos archivos que había abierto el día anterior. ¿Hay algo que pueda agregar al archivo init.el para que vuelva a abrir todos los búferes que estaba usando la última vez que salí de emacs?

kristina
fuente
Parece que el manejo del escritorio es diferente en Emacs 21 y 22+. El tema se describe en esta página: emacswiki.org/emacs/DeskTop .
hji
Otro cambio en la ruta predeterminada de manejo de escritorio se produjo en 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Respuestas:

116

Puede usar la biblioteca de escritorio de Emacs :

Puede guardar el escritorio manualmente con el comando Mx desktop-save. También puede habilitar el guardado automático del escritorio cuando sale de Emacs, y la restauración automática del último escritorio guardado cuando se inicia Emacs: use el búfer de personalización (vea Personalización fácil) para configurar el modo de guardado de escritorio en t para sesiones futuras, o agregue esta línea en su archivo ~ / .emacs:

 (desktop-save-mode 1)
Jared Oberhaus
fuente
5
Gran respuesta. Sin embargo, noté que Emacs reorganiza el orden del búfer entre sesiones. ¿Hay alguna forma de tener siempre el mismo orden de búfer?
axel22
Si alguien tiene problemas para que esto funcione (como lo hice yo), aquí hay una técnica para diagnosticar el problema: active la depuración M-:ejecutando (setq debug-on-error t), luego llame desktop-reverty podría detectar el error ofensivo en el depurador. Para mí, era una configuración global que se suponía que era un búfer local, lo que provocaba que fallara la restauración del marco. (Sólo usando emacs --debug-initpodría coger el tema también, pero utilizado método anterior.)
robenkleene
10

Aunque sospecho que la pregunta buscaba la funcionalidad de "escritorio" de emacs (ver la respuesta anterior), el enfoque de Lewap puede ser útil si el conjunto de archivos que uno usa realmente es exactamente el mismo conjunto de archivos. De hecho, uno puede ir un paso más allá y definir 'perfiles' si tiene diferentes conjuntos de archivos usados ​​regularmente ... Ejemplo rápido:

(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 descubre que cambia regularmente entre diferentes conjuntos de archivos de uso regular mientras trabaja, considere usar perspectivas y completar cada perspectiva con el conjunto deseado de archivos de uso regular.

eso
fuente
6

Para almacenar / restaurar los búferes / pestañas (específicamente pestañas elscreen): uso elscreen y la forma en que administro el almacenamiento / restauración de la sesión de escritorio y la configuración de la pestaña elscreen es el siguiente código en mi archivo .emacs (los nombres utilizados son autoexplicativos y si las funciones de almacenamiento / restauración no deben ejecutarse cada vez que emacs comienza, simplemente comente las líneas con "(presione # 'elscreen-store kill-emacs-hook)" y "(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
fuente
Para cualquiera que siga esta ruta, solo un punto menor que puede reemplazar emacs-configuration-directorycon el user-emacs-directoryque Emacs ya proporciona.
Joe
2

Hay mejoras útiles que puede realizar en la función básica del escritorio. Particularmente útiles (IMO) son los métodos para guardar automáticamente el escritorio durante la sesión, ya que de lo contrario, si su sistema falla, se quedará atascado con el archivo de escritorio con el que había comenzado esa sesión, bastante molesto si tiende a mantener Emacs funcionando durante muchos días a la vez.

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

La wiki también tiene información útil sobre la persistencia de datos entre sesiones en general:

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

Específicamente para computadoras de escritorio, pensé que Desktop Recover parecía particularmente prometedor, sin embargo, aún no lo he probado.

phils
fuente
-2

(find-file-noselect "/my/file")lo abrirá silenciosamente, es decir, sin aumentar el búfer. Solo digo.

EDITAR Este comando no es interactivo ; Para probarlo, debe evaluar la expresión, por ejemplo, colocando el cursor después del último paréntesis y presionando Cx Ce

Votar en contra de esto no está bien ; este comando definitivamente funciona y está en el alcance de la pregunta.

yPhil
fuente
2
No voté en contra, pero quizás su respuesta fue rechazada porque no aborda el tema de cómo abrir específicamente los búferes que estaban abiertos en la sesión anterior de Emacs.
Ryan C. Thompson
1
downvoted porque no tiene nada que ver con el original, P.
RichieHH