Emacs: reabrir buffers da última sessão na inicialização?


89

Todos os dias eu inicio o emacs e abro exatamente os mesmos arquivos que abri no dia anterior. Existe algo que eu possa adicionar ao arquivo init.el para que ele reabra todos os buffers que eu estava usando quando fechei o emacs pela última vez?


Parece que o tratamento da área de trabalho é diferente no Emacs 21 e 22+. O tópico é descrito nesta página: emacswiki.org/emacs/DeskTop .
hji

Outra mudança no caminho padrão de gerenciamento de desktop veio em 24.3. github.com/jwiegley/emacs-release/blob/…
pestófago

Respostas:


116

Você pode usar a biblioteca Emacs Desktop :

Você pode salvar a área de trabalho manualmente com o comando Mx desktop-save. Você também pode habilitar o salvamento automático da área de trabalho ao sair do Emacs e a restauração automática da última área de trabalho salva quando o Emacs for iniciado: use o buffer de personalização (consulte Personalização fácil) para definir o modo de salvamento da área de trabalho para t para sessões futuras, ou adicionar esta linha em seu arquivo ~ / .emacs:

 (desktop-save-mode 1)

5
Ótima resposta. No entanto, percebi que o Emacs reorganiza a ordem do buffer entre as sessões. Existe alguma maneira de sempre ter a mesma ordem de buffer?
axel22 de

Se alguém tiver problemas para fazer isso funcionar (como eu), aqui está uma técnica para diagnosticar o problema: ative a depuração M-:executando e (setq debug-on-error t), em seguida, chame desktop-reverte pode detectar o erro ofensivo no depurador. Para mim, era a configuração global que deveria ser local do buffer, causando falha na restauração do quadro. (Apenas usar emacs --debug-initpode detectar o problema também, mas usei o método anterior.)
robenkleene

10

Embora eu suspeite que a questão esteja procurando a funcionalidade de "área de trabalho" do emacs (veja a resposta acima), a abordagem de Lewap pode ser útil se o conjunto de arquivos que alguém usa realmente é exatamente o mesmo conjunto de arquivos. Na verdade, pode-se dar um passo adiante e definir 'perfis' se tivermos conjuntos diferentes de arquivos usados ​​regularmente ... Exemplo 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.

Se você descobrir que alterna regularmente entre diferentes conjuntos de arquivos usados ​​regularmente à medida que trabalha, considere usar perspectivas e preencher cada uma delas com o conjunto desejado de arquivos usados ​​regularmente.


6

Para armazenar / restaurar os buffers / guias (especificamente as guias da tela eletrônica): Eu uso a tela e a forma como gerencio o armazenamento / restauração da sessão da área de trabalho e a configuração da guia da tela é o seguinte código em meu arquivo .emacs (os nomes usados ​​são autoexplicativos e se as funções de armazenamento / restauração não devem ser executadas toda vez que o emacs inicia, apenas comente as linhas com "(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)

Para quem está indo por esse caminho, apenas um ponto menor que você pode substituir emacs-configuration-directorypelo user-emacs-directoryque o Emacs já fornece.
Joe

2

Existem aprimoramentos úteis que você pode fazer no recurso básico da área de trabalho. Particularmente úteis (IMO) são métodos de salvar automaticamente a área de trabalho durante a sessão, caso contrário, se o seu sistema travar, você ficará preso com o arquivo da área de trabalho com o qual iniciou aquela sessão - muito chato se você tende a manter o Emacs funcionando por muitos dias de cada vez.

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

O wiki também tem informações úteis sobre a persistência de dados entre as sessões em geral:

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

Especificamente para desktops, achei que Desktop Recover parecia particularmente promissor, mas ainda não experimentei.


-2

(find-file-noselect "/my/file")irá abri-lo silenciosamente, ou seja, sem aumentar o buffer. Apenas dizendo.

EDITAR Este comando não é interativo ; Para testá-lo, você deve avaliar a expressão, por exemplo, posicionando o cursor após o último parêntese e pressionando Cx Ce

Votar negativamente não é legal ; este comando definitivamente funciona e está no escopo da questão.


2
Eu não fiz downvote, mas talvez sua resposta tenha sido downvoting porque não aborda a questão de como abrir especificamente os buffers que foram abertos na sessão anterior do Emacs.
Ryan C. Thompson

1
voto negativo porque não tem nada a ver com o Q original.
RichieHH
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.