Spec-Zone.ru › Elisp

Переменные для нескольких сеансов

Когда вы присваиваете переменной значение, а затем закрываете 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API