Хотел рассказать, как организованы мои сеансы.
Требования:
- Отправить файл с терминала в пользовательский сеанс emacs
- Восстановить сеанс с терминала
- Сохранить сеанс
Решение:
Установить пакет (плагин) для рабочих групп2 -> https://github.com/pashinin/workgroups2
Добавить следующеекод lisp в ~ / .emacs.d / init.el или ~ / .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 запущен.У него есть один аргумент - имя сеанса.
Мы можем запустить 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 "$@" >> /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 с seВарианты ssion доступны по адресу: https://github.com/nexayq/dot_files/blob/master/emacs/dot_emacs_d/init.el