Система налаштування - це вбудована функція Emacs, призначена для вирішення саме описаної вами проблеми - програмування може не бути ідеальним способом для пересічного користувача налаштувати свій редактор.
Основною точкою входу до функціональної настройки є M-x customize RET(або Options > Customize Emacs > Top-level Customization Groupз меню). Звідти ви побачите інтерактивну систему меню для налаштування параметрів. Цей інтерфейс встановлює, що всі налаштування мають правильний тип (число, рядок, колір тощо), уникаючи головного джерела помилок, які виникають, коли користувачі програмно налаштовують Emacs. Якщо користувач вирішує зберегти будь-які зміни, які вони вносять через інтерфейс користувача, налаштування зберігаються у спеціальному розділі у файлі ініціалізації користувача (читати:) .emacs.
defcustomобертається навколо функціоналу Emacs Lisp нижнього рівня, як, defvarщо обидва оголошує змінну і робить її видимою в інтерфейсі налаштування. Це також дозволяє розробнику надати додаткові метадані, необхідні для відображення відповідного інтерактивного елемента управління, тобто який тип значення зберігається в цій змінній? Довільна рядок? Номер? Вибір із фіксованого набору варіантів? тощо defgroup- це конструкція групування для цих настроюваних параметрів, щоб вони могли бути впорядковані в приємну ієрархію.
Цю функціональність слід використовувати будь-коли, коли фрагмент даних вважається можливим для налаштування користувачем, а не внутрішньою деталізацією бібліотеки.
Ось простий приклад, зібраний з невеликої моєї бібліотеки:
(defgroup checkbox nil
"Quick manipulation of textual checkboxes."
:group 'convenience)
(defcustom checkbox-states '("[ ]" "[x]")
"Checkbox states to cycle between.
First item will be the state for new checkboxes."
:group 'checkbox
:type '(repeat string))
defgroupСтворює нову групу в налаштуваннях інтерфейсу під верхнім рівнем convenienceелемента. Потім мені потрібна була змінна для зберігання можливих станів прапорця. Я міг би використати defvar, але оскільки я хочу, щоб це було легко налаштовуватися, я вирішив використовувати defcustom. :groupЧастина вказує на те, що він належить до раніше певної групи, і :typeвказує на те, що вона являє собою послідовність рядків. Також є значення за замовчуванням та опис. Існують також додаткові засоби (не показані тут) для перетворення значень, введених користувачем.
Якщо я зараз запускаюсь M-x customize RETта переходжу до нього Convenience > Checkbox, я бачу таке:

Це не найкрасивіший інтерфейс у світі, але зауважте, що у ньому є інтерактивні інструменти для налаштування значення "Держави прапорець" ( checkbox-statesвнутрішньо). Він показує поточні значення рядка разом з кнопками INS(вставити) та DEL(видалити) та дозволяє нам редагувати значення рядків у полях редагування. Коли ми закінчимо, ми можемо вирішити, чи застосувати наші зміни, відновити їх або застосувати та зберегти їх для майбутніх сеансів.
customizeзасобами та коли їх налаштувати вручну? Або вам цікаво написати режим? Останнє - це ситуація, в якій ти можеш насправді опинитися, використовуючи такі речіdefcustomтощо.