Некоторые люди могут подумать, что это проще в использовании setq
. Некоторые люди могут подумать, что это более странно. На самом деле это наивно в общем случае.
Это правда, что для некоторых пользовательских параметров это не имеет значения. Но для других это имеет значение и setq
является неправильным подходом для этих вариантов. Так что, как правило, setq
это неправильный подход.
Если вы используете custom-set-variables
или customize-set-variable
вместо setq
, или если вы используете Настроить пользовательский интерфейс (например M-x customize-option
), то вы уверены, что любой предполагаемый код инициализации или обновления, необходимый для значения параметра, будет автоматически запущен и запущен при необходимости. Если вы используете setq
, это не будет сделано.
Теперь, это также тот случай, когда большинство пользовательских опций, особенно многие из них написаны для сторонних библиотек, не используют defcustom
ключевые слова :set
и :initialize
, и использование setq
для них не имеет значения. Но многие ванильные варианты Emacs используют такие ключевые слова, и для тех, кто это делает, setq
это неправильно. Поэтому, если вы хотите использовать код Lisp, а не пользовательский интерфейс Customize для настройки своих параметров, тогда вам лучше использовать custom-set-variables
или customize-set-variable
вместо setq
. Это никогда не ранит, а иногда помогает (очень).
Но я рекомендую сделать обе эти вещи:
Используйте пользовательский интерфейс Customize вместо написания кода для этого.
Определите переменнуюcustom-file
, чтобы Customize записывал настройки в этот файл, а не в файл инициализации ( ~/.emacs
). IOW, держите свой рукописный код инициализации отдельно от автоматического кода, написанного Customize.
:type
сdefvar
- я не думаю , что это должно быть ограничено пользовательских параметров. К сожалению, многие программисты ленивы в их использовании:type
, и результат не очень полезен (это не ошибка Customize).setq
вместо одногоcustomize-set-variable
раза. (Это было одно времяauto-revert-interval
, и позже я понял, что использованиеsetq
перед загрузкой наautorevert
самом деле намного быстрее, чем использованиеcustomize-set-variable
.)Я предпочитаю
setq
более чемcustomize
по нескольким причинам:(setq foo (calculate-foo))
). Я постоянно использую эту силу в своей конфигурации, чтобы сохранить вещи СУХОЙ. Для меня весь смысл использования Emacs - это программируемость, аcustomize
интерфейс только мешает.setq
Лучше подходит для контроля версий и организации кода. Я разделил мою инициализацию между десятками файлов; если бы все было в одном огромномcustom.el
файле, было бы намного сложнее быстро найти и отредактировать настройки.customize
интерфейс ощущается как ужасная реликвия от худших интерфейсов 90-х годов. Я предпочел бы редактировать текст с мощью Emacs в любой день.@Drew делает некоторые хорошие замечания о некоторых тонкостях с
:set
и:initialize
. Я использую Emacs годами и редко сталкиваюсь с подобными проблемами. Когда я делаю, это легко поменятьsetq
дляcustom-set-variable
особых случаев.источник
customize-set-variable(s)
, и это лучше, потому что они запускаются автоматически. 2. Вы можете использовать различные команды настройки, чтобы увидеть все ваши установленные и / или сохраненные переменные в разных иерархиях, чтобы вы автоматически организовали различные группы без необходимости использования отдельных файлов в управлении версиями. 3. Стало намного лучше. Если вам не нравится пользовательский интерфейс, вы все равно можете использовать настройку программно и с помощью интерактивных команд, которые избегают режима настройки, чтобы получить все другие преимущества использования настройки.Одним из преимуществ использования
setq
вместоcustomize
читабельности. Каждый может свободно комментировать каждую настройку по своему вкусу, что IMO улучшает читаемость. Можно также сгруппировать связанные настройки вместе, что улучшает модульность. Наконец, я бы сказал, что навигация по буферу elisp более «проста», чем навигация по настройке пользовательского интерфейса и виджетов.С другой стороны, настройка позволяет вам легко вернуться к значениям по умолчанию, которые могут быть бесценными, когда дела идут плохо.
РЕДАКТИРОВАТЬ: Ответ Дрю предоставляет отличную причину для использования,
customize-set-variables
которая может обеспечить все преимущества, которые я указал Тем не менее, пользовательский интерфейс Customize не поддается переносимым конфигурациям на разных платформах, как это делает raw elisp. Если вам требуется, чтобы переменная была зависимой от ОС, во многих случаях вам придется использовать запасной вариант elisp. Моя точка зрения о более легкой навигации в буферах elisp все еще остается в силеисточник
setq
, просто закомментировавsetq
строку и перезапустив emacs.custom-set-variables
это «сырой elisp», и я использую его каждый день на нескольких машинах. Просто скопируйте его из того места, где его записывает пользовательская настройка (если вы сами не написали).Другой альтернативой является использование Джона Wiegley в потребительскую упаковку . Это обеспечивает программный способ конфигурирования пакетов, которые хорошо работают с процессом инициализации пакетов emacs 24+. Вот пример использования из readme:
Дело в том, что use package является макросом и не оценивает свои аргументы сразу. Параметры
:init
и:config
оцениваются на разных этапах процесса инициализации, что позволяет иметь конфигурацию каждого пакета в одном месте, но каждая часть выполняется на соответствующем этапе инициализации.Без чего-то похожего
use-package
некоторые пакеты требуют, чтобы часть их кода инициализации шла до,(package-initialize)
а другая часть - после. Если у вас много подобных пакетов, то их инициализация должна чередоваться.Еще одним преимуществом
use-package
является то, что он может автоматически устанавливать недостающие пакеты с помощью package.el, если вы перенесете .emacs на новый компьютер или если вы поделитесь своей конфигурацией с другим пользователем, и вся инициализация может быть отложена до фактической загрузки пакета.Существуют также дополнительные ключевые аргументы, которые позволяют лучше контролировать процесс инициализации.
Все это говорит о том, что одним из больших преимуществ настройки является то, что она показывает, что нужно настраивать в любом конкретном пакете. Это одна из причин, почему я до сих пор использую его для многих своих пакетов.
источник
use-package
сам по себе предлагает преимущества модульной конфигурации, а также импорта и настройки пакетов в одном месте. Но да, пример используетsetq
. Неужели это можно использоватьcustomize-set-variable
здесь? Я не уверен. Можем ли мы / мы должны поменять его (илиcustomize-set-value
) наsetq
?:custom
ключевое слово.