Emacs: повторно відкрити буфери з останньої сесії при запуску?


89

Щодня я запускаю emacs і відкриваю ті самі файли, які відкривав напередодні. Чи є щось, що я можу додати до файлу init.el, щоб він знову відкрив усі буфери, якими я користувався під час останнього виходу з emacs?


Здається, у Emacs 21 та 22+ обробка робочого столу відрізняється. Тема описана на цій сторінці: emacswiki.org/emacs/DeskTop .
hji

Чергова зміна у шляху обробки робочого столу за замовчуванням відбулася у 24.3. github.com/jwiegley/emacs-release/blob/…
пестофаг

Відповіді:


116

Ви можете використовувати бібліотеку 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може також
сприйняти

10

Хоча я підозрюю, що питання шукало функціональність emacs "на робочому столі" (див. Відповідь вище), підхід Лепапа може бути корисним, якщо набір файлів, який ми використовуємо, насправді є однаковим. Насправді можна зробити крок далі і визначити "профілі", якщо є різні набори регулярно використовуваних файлів ... Приклад швидкого:

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

Якщо ви виявите, що під час роботи регулярно перемикаєтеся між різними наборами регулярно використовуваних файлів, подумайте про використання перспектив та заповнення кожної перспективи потрібним набором регулярно використовуваних файлів.


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-configuration-directoryтим, user-emacs-directoryщо Emacs вже пропонує.
Джо

2

Є корисні вдосконалення основної функції робочого столу. Особливо зручні (IMO) методи автоматичного збереження робочого столу під час сеансу, оскільки в іншому випадку, якщо ваша система виходить з ладу, ви застрягнете у файлі робочого столу, з якого ви розпочали цей сеанс - досить неприємно, якщо ви, як правило, продовжуєте працювати Emacs для багатьох днів за раз.

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

Вікі також містить корисну інформацію про постійні дані між сесіями загалом:

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

Що стосується настільних комп’ютерів, я вважав, що Desktop Recover виглядає особливо перспективним, проте я ще не випробував його.


-2

(find-file-noselect "/my/file")відкриє його безшумно, тобто без підняття буфера. Просто кажу.

EDIT Ця команда не є інтерактивною ; Щоб протестувати його, потрібно оцінити вираз, наприклад, розташувавши курсор після останньої дужки та натиснувши Cx Ce

Проголосувати за це не круто ; ця команда, безумовно, працює і є предметом питання.


2
Я не голосував проти, але можливо ваша відповідь була проти, тому що вона не стосується питання про те, як конкретно відкрити буфери, які були відкриті в попередній сесії Emacs.
Райан К. Томпсон,

1
проти, тому що це не має нічого спільного з оригінальним Q.
RichieHH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.