Emacs: riaprire i buffer dall'ultima sessione all'avvio?


89

Ogni giorno avvio emacs e apro esattamente gli stessi file che avevo aperto il giorno prima. C'è qualcosa che posso aggiungere al file init.el in modo che riaprirà tutti i buffer che stavo usando l'ultima volta che sono uscito da emacs?


Sembra che la gestione del desktop sia diversa in Emacs 21 e 22+. L'argomento è descritto in questa pagina: emacswiki.org/emacs/DeskTop .
hji

Un altro cambiamento nel percorso predefinito per la gestione del desktop è arrivato in 24.3. github.com/jwiegley/emacs-release/blob/…
pestophagous

Risposte:


116

Puoi usare la libreria Emacs Desktop :

Puoi salvare il desktop manualmente con il comando Mx desktop-save. Puoi anche abilitare il salvataggio automatico del desktop quando esci da Emacs e il ripristino automatico dell'ultimo desktop salvato all'avvio di Emacs: usa il buffer di personalizzazione (vedi Easy Customization) per impostare la modalità di salvataggio del desktop su t per sessioni future, oppure aggiungi questa riga nel tuo file ~ / .emacs:

 (desktop-save-mode 1)

5
Bella risposta. Tuttavia, ho notato che Emacs riorganizza l'ordine del buffer tra le sessioni. C'è un modo per avere sempre lo stesso ordine del buffer?
axel22

Se qualcuno ha problemi a farlo funzionare (come ho fatto io), ecco una tecnica per diagnosticare il problema: attiva il debug M-:eseguendolo (setq debug-on-error t), quindi chiama desktop-reverte potrebbe rilevare l'errore incriminato nel debugger. Per me era un'impostazione globale che doveva essere locale del buffer, causando il fallimento del ripristino del frame. (Anche il solo utilizzo emacs --debug-initpotrebbe risolvere il problema, ma ho usato il metodo precedente.)
robenkleene

10

Sebbene sospetti che la domanda stesse cercando la funzionalità "desktop" di emacs (vedi la risposta sopra), l'approccio di Lewap può essere utile se l'insieme di file che si usa è esattamente lo stesso insieme di file. In effetti, si può fare un ulteriore passo avanti e definire i "profili" se si dispone di diversi set di file utilizzati regolarmente ... Esempio rapido:

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

Se ti accorgi di passare regolarmente avanti e indietro tra diversi set di file usati regolarmente mentre lavori, considera l'utilizzo di prospettive e popola ogni prospettiva con il set desiderato di file usati regolarmente.


6

Per memorizzare / ripristinare i buffer / le schede (in particolare le schede elscreen): io uso elscreen e il modo in cui gestisco l'archiviazione / ripristino della sessione desktop e la configurazione delle schede elscreen è il seguente codice nel mio file .emacs (i nomi usati sono autoesplicativi e se le funzioni di memorizzazione / ripristino non devono essere eseguite ogni volta che emacs si avvia, commentate semplicemente le righe con "(push # 'elscreen-store kill-emacs-hook)" e "(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)

Per chiunque percorra questa strada, solo un punto minore che puoi sostituire emacs-configuration-directorycon quello user-emacs-directoryche Emacs già fornisce.
Joe

2

Ci sono miglioramenti utili che puoi apportare alla funzionalità desktop di base. Particolarmente utili (IMO) sono i metodi di salvataggio automatico del desktop durante la sessione, altrimenti se il tuo sistema va in crash rimarrai bloccato con il file desktop con cui avevi iniziato quella sessione - abbastanza fastidioso se tendi a mantenere Emacs in esecuzione per molti giorni alla volta.

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

Il wiki ha anche informazioni utili sulla persistenza dei dati tra le sessioni in generale:

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

Per i desktop in particolare, ho pensato che Desktop Recover fosse particolarmente promettente, tuttavia non l'ho ancora provato.


-2

(find-file-noselect "/my/file")lo aprirà silenziosamente, cioè senza alzare il buffer. Sto solo dicendo.

EDIT Questo comando non è interattivo ; Per testarlo devi valutare l'espressione, ad esempio posizionando il cursore dopo l'ultima parentesi e premendo Cx Ce

Downvoting questo non è bello ; questo comando funziona sicuramente ed è nell'ambito della domanda.


2
Non ho downvote, ma forse la tua risposta è stata downvotata perché non affronta il problema di come aprire specificamente i buffer che erano aperti nella precedente sessione di Emacs.
Ryan C. Thompson,

1
downvoted perché non ha nulla a che fare con l'originale Q.
RichieHH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.