Переменные для нескольких сеансов
Когда вы присваиваете переменной значение, а затем закрываете Emacs и запускаете его снова, это значение не восстанавливается автоматически. Обычно пользователи задают обычные переменные в файлах запуска или используют Customize (см. Параметры настройки), чтобы задать пользовательские параметры на постоянной основе; кроме того, у различных пакетов есть файлы, в которых они хранят данные (например, Gnus хранит их в .newsrc.eld, а библиотека URL хранит cookie в ~/.emacs.d/url/cookies).
Для данных, находящихся между этими двумя крайностями (то есть для настроек, задаваемых в файле запуска, и массивного состояния приложений, сохраняемого в отдельных файлах), в Emacs предусмотрен механизм переноса данных между сеансами, называемый переменными для нескольких сеансов. (Этот механизм может быть доступен не во всех системах.) Вот небольшой пример, который поможет понять, как его использовать:
(define-multisession-variable foo 0)
(defun my-adder (num)
(interactive "nAdd number: ")
(setf (multisession-value foo)
(+ (multisession-value foo) num))
(message "The new number is: %s" (multisession-value foo)))
Этот код определяет переменную foo и связывает её со специальным объектом для нескольких сеансов, инициализируемым значением «0» (если переменная ещё не существует с предыдущего сеанса). Команда my-adder запрашивает у пользователя число, прибавляет его к прежнему (возможно, сохранённому) значению, а затем сохраняет новое значение.
Этот механизм не предназначен для огромных структур данных, но должен обеспечивать хорошую производительность для большинства значений.
- Макрос: define-multisession-variable name initial-value &optional doc &rest args
-
Этот макрос определяет name как переменную для нескольких сеансов и присваивает ей значение initial-value, если ранее этой переменной не было присвоено значение. doc — это строка документации; в args можно использовать несколько аргументов-ключевых слов:
:package package-symbol-
Это ключевое слово указывает, что переменная для нескольких сеансов относится к пакету, заданному символом package-symbol. Комбинация package-symbol и name должна быть уникальной. Если package-symbol не задан, по умолчанию используется первый «сегмент» имени символа name, то есть часть его имени до первого «-», не включая этот символ. Например, если name равен
foo, а package-symbol не задан, по умолчанию для package-symbol будет использоватьсяfoo. -
:synchronized bool -
Переменные для нескольких сеансов можно синхронизировать, если bool не равен
nil. Это означает, что если одновременно запущены два экземпляра Emacs и другой экземпляр изменяет переменную для нескольких сеансовfoo, текущий экземпляр Emacs получит изменённые данные при обращении к её значению. Если synchronized равенnilили не задан, этого не произойдёт, и значения во всех сеансах Emacs, использующих переменную, будут независимы друг от друга. :storage storageИспользовать указанный метод хранения storage. Это может быть
sqlite(в Emacs, собранном с поддержкой SQLite) илиfiles. Если значение не задано, по умолчанию используется значение переменнойmultisession-storage, описанной ниже.
- Функция: multisession-value variable
-
Эта функция возвращает текущее значение variable. Если в этом сеансе Emacs к переменной ещё не обращались или она была изменена извне, её значение будет прочитано из внешнего хранилища. В противном случае возвращается текущее значение этого сеанса без изменений. Вызов этой функции для variable, которая не является переменной для нескольких сеансов, приводит к ошибке.
Значения, полученные с помощью
multisession-value, могут быть или не бытьeqдруг с другом, но они всегда будутequal.Это обобщённая переменная (см. Обобщённые переменные), поэтому обновить такую переменную можно, например, так:
(setf (multisession-value foo-bar) 'zot)
Таким способом можно сохранять только значения Emacs Lisp, имеющие синтаксис печати, пригодный для чтения (см. Представление при печати и синтаксис чтения).
Если переменная для нескольких сеансов синхронизирована, перед установкой её значения оно может быть обновлено. Например:
(incf (multisession-value foo-bar))
Сначала проверяется, не изменилось ли значение в другом экземпляре Emacs, извлекается это значение, затем к нему прибавляется 1 и сохраняется результат. Обратите внимание, что это выполняется без блокировки, поэтому, если несколько экземпляров одновременно обновляют значение, невозможно предсказать, какой экземпляр «победит».
- Функция: multisession-delete object
Эта функция удаляет object и его значение из постоянного хранилища.
- Функция: make-multisession
-
Можно также создавать постоянные значения, не связанные с конкретной переменной, а связанные с явно заданными пакетом и ключом.
(setq foo (make-multisession :package "mail" :key "friends")) (setf (multisession-value foo) 'everybody)Поддерживаются те же ключевые слова, что и в
define-multisession-variable, а также ключевое слово:initial-value, задающее значение по умолчанию.
- Пользовательский параметр: multisession-storage
Эта переменная определяет способ хранения переменных для нескольких сеансов. По умолчанию её значение равно
files, что означает хранение значений по одному файлу на переменную в каталоге, заданном переменнойmultisession-directory. Если вместо этого значение равноsqlite, значения хранятся в базе данных SQLite; этот вариант доступен только в том случае, если Emacs был собран с поддержкой SQLite.
- Пользовательский параметр: multisession-directory
Переменные для нескольких сеансов хранятся в этом каталоге, который по умолчанию является подкаталогом multisession/ каталога
user-emacs-directory, обычно ~/.emacs.d/multisession/.
- Команда: list-multisession-values
Эта команда открывает буфер со списком всех переменных для нескольких сеансов и включает специальный режим
multisession-edit-mode, в котором можно удалять их и редактировать их значения.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Multisession-Variables.html