Emacs: ponownie otworzyć bufory z ostatniej sesji przy starcie?

91

Każdego dnia uruchamiam emacsa i otwieram dokładnie te same pliki, które otworzyłem poprzedniego dnia. Czy jest coś, co mogę dodać do pliku init.el, aby ponownie otworzył wszystkie bufory, których używałem, kiedy ostatnio opuszczałem emacsa?

Krystyna
źródło
Wygląda na to, że obsługa pulpitu jest inna w Emacs 21 i 22+. Temat jest opisany na tej stronie: emacswiki.org/emacs/DeskTop .
hji
Kolejna zmiana w domyślnej ścieżce obsługi pulpitu nastąpiła w 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Odpowiedzi:

118

Możesz użyć biblioteki Emacs Desktop :

Możesz zapisać pulpit ręcznie za pomocą polecenia Mx desktop-save. Możesz także włączyć automatyczne zapisywanie pulpitu po wyjściu z Emacsa i automatyczne przywracanie ostatnio zapisanego pulpitu po uruchomieniu Emacsa: użyj bufora dostosowywania (zobacz Łatwe dostosowywanie), aby ustawić tryb zapisywania pulpitu na t dla przyszłych sesji lub dodaj ten wiersz w pliku ~ / .emacs:

 (desktop-save-mode 1)
Jared Oberhaus
źródło
5
Świetna odpowiedź. Zauważyłem jednak, że Emacs zmienia kolejność buforów między sesjami. Czy istnieje sposób, aby zawsze mieć tę samą kolejność buforów?
axel22
Jeśli ktoś ma problemy z uruchomieniem tego (tak jak ja), oto technika zdiagnozowania problemu: włącz debugowanie przez M-:wykonanie (setq debug-on-error t), a następnie wywołaj desktop-reverti może złapać problematyczny błąd w debugerze. Dla mnie było to ustawienie globalne, które miało być lokalnym buforem, powodując niepowodzenie przywracania ramek. (Tylko przy użyciu emacs --debug-initmoże złapać problem zbyt, ale kiedyś dawną metodę.)
robenkleene
10

Chociaż podejrzewam, że pytanie dotyczyło funkcjonalności "pulpitu" emacsa (patrz powyższa odpowiedź), podejście Lewapa może być przydatne, jeśli zestaw plików, których się używa, jest rzeczywiście tym samym zestawem plików. Właściwie można pójść o krok dalej i zdefiniować `` profile '', jeśli ma się różne zestawy regularnie używanych plików ... Szybki przykład:

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

Jeśli zauważysz, że podczas pracy regularnie przełączasz się między różnymi zestawami regularnie używanych plików, rozważ użycie perspektyw i zapełnienie każdej perspektywy pożądanym zestawem regularnie używanych plików.

dat
źródło
6

Do przechowywania / przywracania buforów / zakładek (szczególnie zakładek elscreen): Używam elscreen, a sposób, w jaki zarządzam przechowywaniem / przywracaniem sesji pulpitu i konfiguracją zakładki elscreen, jest następujący kod w moim pliku .emacs (użyte nazwy są oczywiste i jeśli funkcje przechowujące / przywracające nie powinny być wykonywane za każdym razem, gdy emacs uruchamia się, po prostu zakomentuj wiersze z "(push # 'elscreen-store kill-emacs-hook)" i "(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
źródło
Dla każdego, kto będzie tą drogą, tylko punkt drobne, że można zastąpić emacs-configuration-directoryz user-emacs-directoryktórych Emacs już przewiduje.
Joe
2

Istnieją przydatne ulepszenia, które możesz wprowadzić do podstawowej funkcji pulpitu. Szczególnie przydatne (IMO) są metody automatycznego zapisywania pulpitu podczas sesji, ponieważ w przeciwnym razie, jeśli twój system się zawiesi, utkniesz z plikiem pulpitu, z którym rozpocząłeś tę sesję - dość denerwujące, jeśli masz tendencję do utrzymywania Emacsa uruchomionego przez wiele osób dni na raz.

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

Wiki zawiera również przydatne informacje o utrwalaniu danych między sesjami:

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

Szczególnie w przypadku komputerów stacjonarnych pomyślałem, że program Desktop Recover wygląda szczególnie obiecująco, jednak jeszcze go nie wypróbowałem.

phils
źródło
-2

(find-file-noselect "/my/file")otworzy go cicho, tj. bez podniesienia bufora. Tylko mówię.

EDYTUJ To polecenie nie jest interaktywne ; Aby to przetestować, musisz ocenić wyrażenie, na przykład ustawiając kursor za ostatnim nawiasem i naciskając Cx Ce

Głosowanie za tym nie jest fajne ; to polecenie zdecydowanie działa i jest objęte zakresem pytania.

yPhil
źródło
2
Nie głosowałem „przeciw”, ale być może Twoja odpowiedź została odrzucona, ponieważ nie odnosi się do kwestii otwierania specjalnie buforów, które były otwarte w poprzedniej sesji Emacsa.
Ryan C. Thompson
1
odrzucony, ponieważ nie ma to nic wspólnego z oryginalnym Q.
RichieHH