Некоторые проблемы с emacs desktop-save: как изменить его для сохранения в ~/.emacs.d/.emacs.desktop
У меня есть этот набор в моем init.el
(desktop-save-mode 1)
Это отлично работает, только мне было интересно:
-
как я могу его изменить, чтобы сохранить файлы .emacs.desktop в ~/.emacs.d вместо ~/
-
как я могу остановить его от того, чтобы спросить меня, хочу ли я сохранить (происходит только в первый раз, когда я закрываю emacs после перезагрузки, с этого момента он принимает да, и это то, что я всегда хочу)
Ответы
Ответ 1
Я использую следующее, которое работает для меня:
;; Automatically save and restore sessions
(setq desktop-dirname "~/.emacs.d/desktop/"
desktop-base-file-name "emacs.desktop"
desktop-base-lock-name "lock"
desktop-path (list desktop-dirname)
desktop-save t
desktop-files-not-to-save "^$" ;reload tramp paths
desktop-load-locked-desktop nil
desktop-auto-save-timeout 30)
(desktop-save-mode 1)
Ну, я на самом деле установил (desktop-save-mode 0)
, а затем использовал M-x my-desktop
, чтобы отключить:
(defun my-desktop ()
"Load the desktop and enable autosaving"
(interactive)
(let ((desktop-load-locked-desktop "ask"))
(desktop-read)
(desktop-save-mode 1)))
Но это потому, что мой сеанс часто превышает 100 файлов, в основном с помощью tramp, и поэтому я предпочитаю загружать его вручную, а не clobber файл рабочего стола иначе:)
Я рекомендую проверить Emacs Wiki:
http://www.emacswiki.org/emacs/DeskTop
Есть некоторые полезные улучшения функциональности по умолчанию. В частности, я рекомендую добавить некоторый способ автоматического сохранения вашего рабочего стола в середине сеанса, так как это действительно раздражает, если ваша система выходит из строя, когда Emacs работает в течение нескольких дней, и ваш рабочий стол не был сохранен промежутком времени.
Так как Emacs 24.4 файл по умолчанию автоматически сохраняется автоматически по умолчанию. См. Переменную desktop-auto-save-timeout
(которую я также добавил в блок выше). Спасибо GDP2 и Декстер Морган за их комментарии по этому поводу.
Ответ 2
как я могу изменить его, чтобы сохранить .emacs.desktop файлы в ~/.emacs.d вместо ~/
Настроить переменную desktop-dirname
.
как я могу остановить его от того, чтобы спросить меня, если я хотите сохранить
Настроить переменную desktop-save
.
Ответ 3
Требуется поделиться тем, как организованы мои сеансы.
Требования:
- Отправить файл с терминала на пользовательский сеанс emacs
- Восстановить сеанс из терминала
- Сохранить сеанс
Решение:
- >
(setq server-socket-dir "~/.emacs-local/server")
(defun nk-server-start (custom-server)
; (nk-server-start "abe")
(setq server-name custom-server)
(server-start) ; run emacs server
(setq wg-session-file (concat "~/.emacs-local/sessions/" custom-server))
; (setq wg-session-file "~/.emacs-local/sessions/foo")
(workgroups-mode 1)
(wg-switch-to-workgroup custom-server)
)
; Run file in specific server (foo)
; emacsclient -n callback.sh -s ~/.emacs-local/server/foo
; Show server name in title bar
(setq frame-title-format '("" "%b @ " server-name))
; https://www.emacswiki.org/emacs/FrameTitle
; ;; What to do on Emacs exit / workgroups-mode exit?
(setq wg-emacs-exit-save-behavior 'save) ; Options: 'save 'ask nil
(setq wg-workgroups-mode-exit-save-behavior 'save) ; Options: 'save 'ask nil
Функция nk-server-start
вызывается при запуске emacs.
У него есть один аргумент - имя sesssion.
Мы можем запустить emacs-session foo
, выполнив следующую команду из терминала:
setsid emacs --eval '(nk-server-start "foo")' &
Если мы хотим открыть файл в сеансе foo
из терминала, нам нужно запустить:
setsid emacsclient -n -s ~/.emacs-local/server/foo file.txt >> /dev/null &
Когда мы закрываем сеанс, все буферы, настройки и т.д. сохраняются в файле ~/.emacs-local/sessions/foo
Когда мы запустим команду setsid emacs --eval '(nk-server-start "foo")' &
в следующий раз, все буферы будут восстановлены
Поскольку команды большие, и я ленивый:) Я сделал несколько скриптов и добавил их в свой $PATH
, чтобы облегчить это:
em_start_foo.sh
- Запустить сеанс, который используется только один раз для запуска сеанса
#!/bin/bash
setsid emacs --eval '(nk-server-start "foo")' &
em_foo.sh
- Добавить файлы в сеанс
#!/bin/bash
setsid emacsclient -n -s ~/.emacs-local/server/foo "[email protected]" >> /dev/null &
Теперь мы просто запускаемся из терминала:
$ em_start_foo.sh # start foo session
$ em_foo.sh file_1.txt # open file_1.txt in foo session
$ em_foo.sh file_2.txt file_3.txt # open file_2.txt and file_3.txt in foo session
Несколько сеансов могут выполняться параллельно.
Скажем, мы создали также скрипты em_start_foo_2.sh
, em_start_foo_2.sh
, em_start_foo_3.sh
, em_start_foo_3.sh
(где-то в $PATH
, конечно)
Тогда мы можем сделать что-то вроде этого:
$ em_start_foo.sh # start foo session
$ em_start_foo_2.sh # start foo_2 session in separate emacs
$ em_foo.sh file_1.txt # open file_1.txt in foo session
$ em_foo_2.sh a.txt b.txt # open a.txt and b.txt in foo_2 session
$ em_start_foo_3.sh # start foo_3 session
$ em_foo_3.sh tmp.txt # open tmp.txt in foo_3 session
##### Close emacs foo_2 from gui - session is automatically saved ###
$ em_start_foo_2.sh # start foo_2 session with all buffers restored
Пакет workgroups2
действительно замечательный!
Мой исходный файл emacs с параметрами сеанса доступен по адресу: https://github.com/nexayq/dot_files/blob/master/emacs/dot_emacs_d/init.el