Emacs: buka kembali buffer dari sesi terakhir saat startup?

91

Setiap hari saya memulai emacs dan membuka file yang sama persis dengan yang saya buka sehari sebelumnya. Apakah ada sesuatu yang dapat saya tambahkan ke file init.el sehingga akan membuka kembali semua buffer yang saya gunakan saat terakhir kali keluar dari emacs?

kristina
sumber
Tampaknya penanganan desktop berbeda di Emacs 21 dan 22+. Topiknya dijelaskan di halaman ini: emacswiki.org/emacs/DeskTop .
hji
Perubahan lain dalam jalur default penanganan desktop datang di 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Jawaban:

118

Anda dapat menggunakan pustaka Emacs Desktop :

Anda dapat menyimpan desktop secara manual dengan perintah Mx desktop-save. Anda juga dapat mengaktifkan penyimpanan otomatis desktop saat Anda keluar dari Emacs, dan pemulihan otomatis dari desktop yang terakhir disimpan saat Emacs dimulai: gunakan buffer Kustomisasi (lihat Kustomisasi Mudah) untuk menyetel mode simpan-desktop ke t untuk sesi mendatang, atau tambahkan baris ini di file ~ / .emacs Anda:

 (desktop-save-mode 1)
Jared Oberhaus
sumber
5
Jawaban yang bagus. Namun, saya perhatikan bahwa Emacs mengatur ulang urutan buffer antar sesi. Apakah ada cara untuk selalu memiliki urutan buffer yang sama?
axel22
Jika ada yang memiliki masalah dalam membuat ini bekerja (seperti yang saya lakukan), berikut adalah teknik untuk mendiagnosis masalah: aktifkan debugging dengan M-:mengeksekusi (setq debug-on-error t), lalu panggil desktop-revertdan mungkin menangkap kesalahan yang menyinggung di debugger. Bagi saya itu adalah pengaturan global yang seharusnya menjadi penyangga lokal yang menyebabkan pemulihan bingkai gagal. (Hanya menggunakan emacs --debug-initmungkin menangkap masalah juga, tetapi saya menggunakan metode sebelumnya.)
robenkleene
10

Meskipun saya menduga pertanyaannya adalah mencari fungsionalitas emacs "desktop" (lihat jawaban di atas), pendekatan Lewap dapat berguna jika kumpulan file yang digunakan benar-benar adalah kumpulan file yang sama persis. Faktanya, seseorang dapat melangkah lebih jauh dan menentukan 'profil' jika seseorang memiliki kumpulan file yang berbeda yang biasa digunakan ... Contoh kilat:

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

Jika Anda menemukan bahwa Anda secara teratur beralih di antara kumpulan file yang digunakan secara teratur berbeda saat Anda bekerja, pertimbangkan untuk menggunakan perspektif dan mengisi setiap perspektif dengan kumpulan file yang digunakan secara teratur yang diinginkan.

dat
sumber
6

Untuk menyimpan / memulihkan buffer / tab (khusus tab elscreen): Saya menggunakan elscreen dan cara saya mengelola penyimpanan / pemulihan sesi desktop dan konfigurasi tab elscreen adalah kode berikut di file .emacs saya (nama yang digunakan cukup jelas dan jika fungsi penyimpanan / pemulihan tidak boleh dijalankan setiap kali emacs mulai cukup beri komentar pada baris dengan "(push # 'elscreen-store kill-emacs-hook)" dan "(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.dll
sumber
Bagi siapa pun yang menempuh rute ini, hanya poin kecil yang dapat Anda ganti emacs-configuration-directorydengan user-emacs-directoryyang sudah disediakan Emacs.
Joe
2

Ada peningkatan berguna yang dapat Anda lakukan pada fitur desktop dasar. Khusus berguna (IMO) adalah metode penyimpanan otomatis desktop selama sesi, karena jika sistem Anda macet, Anda akan terjebak dengan file desktop yang Anda gunakan untuk memulai sesi itu - cukup menjengkelkan jika Anda cenderung membiarkan Emacs tetap berjalan untuk banyak orang. hari pada suatu waktu.

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

Wiki juga memiliki informasi berguna tentang mempertahankan data antar sesi secara umum:

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

Khusus untuk desktop, saya pikir Desktop Recover tampak sangat menjanjikan, namun saya belum mencobanya.

phils
sumber
-2

(find-file-noselect "/my/file")akan membukanya tanpa suara, yaitu tanpa menaikkan buffer. Hanya mengatakan.

EDIT Perintah ini tidak interaktif ; Untuk mengujinya Anda harus mengevaluasi ekspresi, misalnya dengan memposisikan kursor setelah tanda kurung terakhir dan menekan Cx Ce

Merendahkan ini tidak keren ; perintah ini pasti berfungsi dan berada dalam cakupan pertanyaan.

yPhil
sumber
2
Saya tidak downvote, tapi mungkin jawaban Anda downvote karena tidak membahas masalah bagaimana membuka secara khusus buffer yang dibuka di sesi Emacs sebelumnya.
Ryan C. Thompson
1
downvoted karena tidak ada hubungannya dengan Q. asli
RichieHH