Как и большинство пользователей Emacs, я настроил режим, изменив переменные. Что мне никогда не приходило в голову, так это весь менталитет программистов, стоящий за настраиваемым этим и этим. Я понял это, когда начал изучать исходный код eshell. Я не Elisp программист, а конкретно , em-ls.el
кажется, использует defcustom
, defgroup
и т.д. Это , казалось бы, теневой мир глобально определенных переменных , которые Elisp код использует. Таким образом, один вопрос был бы: используется ли defcustom
другой способ создания (настраиваемых) глобальных переменных?
Кто-нибудь может подсказать мне, как правильно использовать (сначала понять) всю идею позади defcustom
, когда использовать, почему, когда нет? Может быть, начинающий пример для начинающих elisp.
customize
оборудование, а когда настраивать вручную? Или вы заинтересованы в написании режима? Последняя ситуация - это ситуация, в которой вы действительно можете использовать такие вещиdefcustom
и тому подобное.Ответы:
Система настройки - это встроенная функция Emacs, предназначенная для точного решения проблемы, которую вы описываете, - программирование не может быть идеальным способом для обычного пользователя настроить свой редактор.
Основной точкой входа в функцию настройки является
M-x customize RET
(илиOptions > Customize Emacs > Top-level Customization Group
из меню). Оттуда вы увидите интерактивную систему меню для настройки параметров. Этот интерфейс гарантирует, что все параметры имеют правильный тип (число, строка, цвет и т. Д.), Избегая основного источника ошибок, возникающих при программной настройке Emacs. Если пользователь решает сохранить какие-либо изменения, сделанные в пользовательском интерфейсе, настройки сохраняются в специальном разделе файла инициализации пользователя (читай:).emacs
.defcustom
это обертка вокруг низкоуровневой функциональности Emacs Lisp,defvar
которая объявляет переменную и делает ее видимой в интерфейсе настройки. Это также позволяет разработчику предоставлять дополнительные метаданные, необходимые для отображения соответствующего интерактивного элемента управления, т. Е. Какой тип значения хранится в этой переменной? Произвольная строка? Число? Выбор из фиксированного набора опций? и т.д.defgroup
- это группирующая конструкция для этих настраиваемых параметров, так что они могут быть упорядочены в хорошую иерархию.Эта функциональность должна использоваться каждый раз, когда часть данных должна рассматриваться как настраиваемая опция для пользователя, а не как внутренняя деталь библиотеки.
Вот простой пример, взятый из моей небольшой библиотеки:
defgroup
Создает новую группу в настройках интерфейса под верхним уровнемconvenience
элемента. Затем мне понадобилась переменная для хранения возможных состояний флажков. Я мог бы использоватьdefvar
, но так как я хочу, чтобы это было легко настраиваемым, я решил использоватьdefcustom
.:group
Часть указывает на то, что он принадлежит к ранее определенной группе, и:type
указывает на то, что она представляет собой последовательность строк. Там также значение по умолчанию и описание. Есть также дополнительные возможности (здесь не показаны) для преобразования значений, введенных пользователем.Если я сейчас запустлю
M-x customize RET
и перейду кConvenience > Checkbox
, я увижу следующее:Это не самый красивый интерфейс в мире, но обратите внимание, что он имеет интерактивные инструменты для настройки значения «Состояния флажков» (
checkbox-states
внутри). Он показывает текущие строковые значения вместе с кнопкамиINS
(вставка) иDEL
(удаление) и позволяет нам редактировать строковые значения в полях редактирования. Когда мы закончим, мы можем решить, применять ли наши изменения, отменить их или применить и сохранить их для будущих сессий.источник
defcustom
) является то, что она автоматически заботится о : (1) проверке типов , чтобы помочь вам избежать присвоения неверного значения переменной (при условии, что авторdefcustom
приложил усилия для предоставления разумного типа) проверка), (2) инициализация (:initialize
) и обновление ction (запущено) (:set
).Да. Особенно, если вы хотите, чтобы пользователи вашего кода могли легко изменять переменные через интерфейс настройки Mx .
defcustom предоставляет пользователям два важных преимущества: документация и безопасность типов. Документация это приятно иметь прямо там. Тип безопасности позволяет указать, какие виды допустимых значений могут принимать ваши переменные.
Конечно, defvar - это хорошо, если все, что вы делаете, это настраиваете для себя и не ожидаете более широкого использования. Тем не менее, некоторые скажут, что придерживаться defcustom насквозь - хорошая привычка для прививания.
Страница руководства для defcustom имеет дополнительные пояснения. Тема настроек в руководстве содержит полную информацию.
Лично я считаю defcustom менее громоздким во время разработки, так как мне не приходится сталкиваться с проблемами перезагрузки с помощью defvar и setq.
источник