Як правильно користуватися декупажем?


15

Як і більшість користувачів Emacs, я налаштував режим, змінивши змінні. Те, що мені ніколи не спадало на думку, - це цілий менталітет програмування, який стоїть за налаштуванням цього і того. Я зрозумів це, коли почав переглядати частину вихідного коду для eshell. Я не є програмістом elisp, але конкретно, em-ls.elсхоже, використовує defcustomі defgroupт.д. Це, здається, є тіньовим світом глобально визначених змінних, який використовує код elisp. Таким чином, одне питання було б: Чи використання defcustomіншого способу здійснення (настроюваних) глобальних змінних?

Хтось може вказати мені, що я засвітив, як правильно використовувати (спочатку зрозуміти) всю ідею позаду defcustom, коли використовувати, чому, коли ні? Можливо, початківець приклад для початківця еліпса.


Чи можете ви пояснити, про що ви питаєте? Чи хочете ви знати, коли користуватися customizeзасобами та коли їх налаштувати вручну? Або вам цікаво написати режим? Останнє - це ситуація, в якій ти можеш насправді опинитися, використовуючи такі речі defcustomтощо.
Дан

Відповіді:


21

Система налаштування - це вбудована функція 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(видалити) та дозволяє нам редагувати значення рядків у полях редагування. Коли ми закінчимо, ми можемо вирішити, чи застосувати наші зміни, відновити їх або застосувати та зберегти їх для майбутніх сеансів.


2
Гарний пост! Найбільш істотними перевагами Настроювання (і defcustom) є те, що воно автоматично бере на себе : (1) перевірку типу , щоб запобігти призначенню невірного значення змінної (за умови, що автор не defcustomдокладе зусиль для надання розумного типу перевірка), (2) ініціалізація ( :initialize) та оновлення ctions (спрацьовано) ( :set).
Дрю

Спасибі! Я оновив публікацію, щоб відобразити ваші пропозиції.
camdez

8

Чи використання іншого набору іншого способу здійснення (настроюваних) глобальних змінних?

Так. Особливо, якщо ви хочете, щоб користувачі вашого коду могли легко змінювати змінні через інтерфейс налаштування Mx .

defcustom надає вашим користувачам дві важливі переваги: ​​документація та безпека типу. Документацію приємно мати саме там. Безпека типу дозволяє вказати, які види дійсних значень можуть приймати ваші змінні.

Звичайно, дефвара чудово, якщо все, що ви робите, - це налаштування під себе і не передбачайте ширшого використання. Однак дехто вважає, що дотримуватися приниження наскрізь - це хороша звичка прищеплюватись.

Хтось може вказати мені, що я засвітив, як правильно користуватися ...

Сторінка посібника для дегустації має додаткові роз'яснення. Тема налаштування в посібнику містить повні деталі.

... коли користуватися, чому, коли ні?

Мені особисто здається, що дефіцит є менш громіздким під час розробки, тому що мені не доводиться стикатися з проблемами перезавантаження з defvar та setq.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.