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.