Система налаштування - це вбудована функція 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
тощо.