Emacs : 시작시 마지막 세션에서 버퍼를 다시여시겠습니까?


91

매일 emacs를 시작하고 전날 열었던 것과 똑같은 파일을 엽니 다. init.el 파일에 추가하여 마지막으로 emacs를 종료 할 때 사용했던 모든 버퍼를 다시 열 수 있습니까?


Emacs 21 및 22+에서는 데스크탑 처리가 다른 것 같습니다. 주제는이 페이지에서 설명합니다 : emacswiki.org/emacs/DeskTop .
hji 2009-06-08

기본 경로를 처리하는 데스크톱의 또 다른 변경 사항은 24.3입니다. github.com/jwiegley/emacs-release/blob/…
pestophagous

답변:


118

Emacs Desktop 라이브러리를 사용할 수 있습니다 .

Mx desktop-save 명령을 사용하여 데스크탑을 수동으로 저장할 수 있습니다. Emacs를 종료 할 때 데스크탑의 자동 저장을 활성화하고 Emacs가 시작될 때 마지막으로 저장된 데스크탑의 자동 복원을 활성화 할 수도 있습니다. 사용자 정의 버퍼 (쉬운 사용자 정의 참조)를 사용하여 향후 세션을 위해 데스크탑 저장 모드를 t로 설정하거나 ~ / .emacs 파일의이 줄 :

 (desktop-save-mode 1)

5
좋은 대답입니다. 그러나 Emacs가 세션 사이의 버퍼 순서를 재배 열하는 것을 발견했습니다. 항상 동일한 버퍼 순서를 가질 수있는 방법이 있습니까?
axel22

누구든지이 작업을 수행하는 데 문제가있는 경우 (예 : 내가 한 것처럼) 문제를 진단하는 기술이 있습니다. M-:실행 하여 디버깅을 설정 한 (setq debug-on-error t)다음 호출 desktop-revert하면 디버거에서 문제가되는 오류를 포착 할 수 있습니다. 저에게는 버퍼 로컬이어서 프레임 복원이 실패하는 글로벌 설정이었습니다. (그냥 사용하여 emacs --debug-init도 문제를 잡을 수도 있지만, 나는 전자의 방법을 사용했다.)
robenkleene

10

질문이 emacs "데스크탑"기능을 찾고 있다고 생각하지만 (위 답변 참조) Lewap의 접근 방식은 실제로 사용하는 파일 세트가 정확히 동일한 파일 세트 인 경우 유용 할 수 있습니다. 사실, 한 단계 더 나아가 정기적으로 사용되는 파일 세트가 다른 경우 '프로필'을 정의 할 수 있습니다. Quickie 예제 :

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

작업 할 때 정기적으로 사용되는 여러 파일 세트간에 정기적으로 전환하는 경우 Perspective를 사용 하고 각 Perspective를 정기적으로 사용되는 원하는 파일 세트로 채우는 것을 고려 하십시오.


6

버퍼 / 탭 (특히 elscreen 탭) 저장 / 복원 : elscreen을 사용하고 데스크톱 세션 및 elscreen 탭 구성의 저장 / 복원을 관리하는 방법은 .emacs 파일의 다음 코드입니다 (사용 된 이름은 자명합니다. 저장 / 복원 기능이 emacs가 시작될 때마다 실행되지 않아야한다면 "(push # 'elscreen-store kill-emacs-hook)"및 "(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)

이 길을가는 모든 사람을 위해, Emacs가 이미 제공 emacs-configuration-directory하고 user-emacs-directory있는 대체 할 수있는 사소한 부분입니다 .

2

기본 데스크탑 기능을 유용하게 개선 할 수 있습니다. 특히 편리한 (IMO)는 세션 중에 데스크탑을 자동 저장하는 방법입니다. 한 번에 며칠.

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

또한 위키에는 일반적으로 세션간에 데이터를 유지하는 데 유용한 정보가 있습니다.

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

특히 데스크톱의 경우 Desktop Recover 가 특히 유망 하다고 생각 했지만 아직 사용해 보지 않았습니다.


-2

(find-file-noselect "/my/file")즉, 버퍼를 올리지 않고 조용히 열립니다. 그냥 말해.

편집이 명령은 대화식아닙니다 . 이를 테스트하려면 마지막 괄호 뒤에 커서를 놓고 Cx Ce를 눌러 표현식을 평가해야합니다.

반대 투표는 좋지 않습니다 . 이 명령은 확실히 작동하며 문제의 범위에 있습니다.


2
나는 반대표를 던지지 않았지만 아마도 이전 Emacs 세션에서 열린 버퍼를 구체적으로 여는 방법에 대한 문제를 해결하지 않았기 때문에 귀하의 대답이 반대표였습니다.
Ryan C. Thompson

1
원래 Q.와는 아무 상관이 없기 때문에을 downvoted
RichieHH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.