Emacs: Puffer der letzten Sitzung beim Start erneut öffnen?

89

Jeden Tag starte ich Emacs und öffne genau die Dateien, die ich am Tag zuvor geöffnet hatte. Kann ich der Datei init.el etwas hinzufügen, damit alle Puffer, die ich beim letzten Beenden von Emacs verwendet habe, erneut geöffnet werden?

kristina
quelle
Scheint, dass die Desktop-Handhabung in Emacs 21 und 22+ unterschiedlich ist. Das Thema wird auf dieser Seite beschrieben: emacswiki.org/emacs/DeskTop .
Hji
Eine weitere Änderung im Standardpfad für die Desktop-Behandlung erfolgte in 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Antworten:

116

Sie können die Emacs Desktop-Bibliothek verwenden :

Sie können den Desktop manuell mit dem Befehl Mx desktop-save speichern. Sie können auch das automatische Speichern des Desktops beim Beenden von Emacs und die automatische Wiederherstellung des zuletzt gespeicherten Desktops beim Starten von Emacs aktivieren: Verwenden Sie den Anpassungspuffer (siehe Einfache Anpassung), um den Desktop-Speichermodus für zukünftige Sitzungen auf t zu setzen, oder fügen Sie ihn hinzu Diese Zeile in Ihrer ~ / .emacs-Datei:

 (desktop-save-mode 1)
Jared Oberhaus
quelle
5
Gute Antwort. Ich habe jedoch festgestellt, dass Emacs die Pufferreihenfolge zwischen den Sitzungen neu anordnet. Gibt es eine Möglichkeit, immer die gleiche Pufferreihenfolge zu haben?
Axel22
Wenn jemand Probleme hat, dies zum Laufen zu bringen (wie ich), ist hier eine Technik, um das Problem zu diagnostizieren: Aktivieren Sie das Debuggen durch M-:Ausführen (setq debug-on-error t), rufen desktop-revertSie dann auf und es kann den fehlerhaften Fehler im Debugger abfangen. Für mich war es eine globale Einstellung, die pufferlokal sein sollte, was dazu führte, dass die Frame-Wiederherstellung fehlschlug. (Nur mit emacs --debug-initkönnte das Problem auch fangen, aber ich habe frühere Methode verwendet.)
Robenkleene
10

Obwohl ich vermute, dass die Frage nach der "Desktop" -Funktion von emacs suchte (siehe Antwort oben), kann Lewaps Ansatz nützlich sein, wenn der verwendete Dateisatz wirklich genau der gleiche Dateisatz ist. Tatsächlich kann man noch einen Schritt weiter gehen und "Profile" definieren, wenn man verschiedene Sätze regelmäßig verwendeter Dateien hat ... Quickie-Beispiel:

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

Wenn Sie feststellen, dass Sie während der Arbeit regelmäßig zwischen verschiedenen Sätzen regelmäßig verwendeter Dateien hin- und herwechseln, sollten Sie Perspektiven verwenden und jede Perspektive mit dem gewünschten Satz regelmäßig verwendeter Dateien füllen.

dat
quelle
6

Zum Speichern / Wiederherstellen der Puffer / Registerkarten (insbesondere der elscreen-Registerkarten): Ich verwende elscreen und die Art und Weise, wie ich die Desktop-Sitzung und die Konfiguration der elscreen-Registerkarten speichere / wiederherstelle, ist der folgende Code in meiner .emacs-Datei (die verwendeten Namen sind selbsterklärend und wenn die Speicher- / Wiederherstellungsfunktionen nicht jedes Mal ausgeführt werden sollen, wenn emacs startet, kommentieren Sie einfach die Zeilen mit "(push # 'elscreen-store kill-emacs-hook)" und "(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
quelle
Für alle , diesen Weg gehen, nur einen kleinen Punkt , dass Sie ersetzen emacs-configuration-directorymit user-emacs-directorydem Emacs bereits zur Verfügung stellt.
Joe
2

Es gibt nützliche Verbesserungen, die Sie an der grundlegenden Desktop-Funktion vornehmen können. Besonders praktisch (IMO) sind Methoden zum automatischen Speichern des Desktops während der Sitzung, da Sie sonst bei einem Systemabsturz an der Desktop-Datei hängen bleiben, mit der Sie diese Sitzung gestartet haben - ziemlich ärgerlich, wenn Sie Emacs für viele laufen lassen Tage auf einmal.

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

Das Wiki enthält außerdem nützliche Informationen zum Speichern von Daten zwischen Sitzungen im Allgemeinen:

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

Speziell für Desktops fand ich Desktop Recover besonders vielversprechend, habe es aber noch nicht ausprobiert.

Phils
quelle
-2

(find-file-noselect "/my/file")öffnet es lautlos, dh ohne den Puffer anzuheben. Nur sagen.

BEARBEITEN Dieser Befehl ist nicht interaktiv . Um es zu testen, müssen Sie den Ausdruck auswerten, indem Sie beispielsweise den Cursor nach der letzten Klammer positionieren und Cx Ce drücken

Downvoting ist nicht cool ; Dieser Befehl funktioniert definitiv und ist im Rahmen der Frage.

yPhil
quelle
2
Ich habe nicht abgelehnt, aber vielleicht wurde Ihre Antwort abgelehnt, weil sie nicht die Frage behandelt, wie speziell die Puffer geöffnet werden können, die in der vorherigen Emacs-Sitzung geöffnet waren.
Ryan C. Thompson
1
herabgestimmt, weil es nichts mit dem ursprünglichen Q zu tun hat.
RichieHH