Подтвердить что ты не робот

Смущение о специальной системе Emacs

Существует несколько аналогичных функций настройки:

  • set и setq
  • установить по умолчанию
  • defcustom
  • заказ установить значение
  • заказные набор-переменные
  • настройки-установки-значение
  • Настройка набора переменных

Итак, какая разница между этими функциями?

Если я хочу установить собственные настройки для надстройки, для этого сценария:

  • Если параметр переменной defcustom, какая настройка-функция будет лучше?
  • А как насчет настройки переменной defvar?
4b9b3361

Ответ 1

Короткий ответ на ваш вопрос:

  • используйте setq или setq-default для переменных, определяемых defvar.

  • используйте setq, setq-default или механизм Customize для переменных, определяемых defcustom

Ниже приведен длинный ответ.

Функции, которые вы собираетесь использовать, следующие:

  • set является основной функцией для установки значения переменной.

  • setq - это еще одна версия, которая автоматически цитирует свой первый аргумент. Это полезно, поскольку цитирование первого аргумента - это то, что вы хотите делать почти все время.

  • Некоторые переменные не могут быть установлены глобально. Всякий раз, когда вы устанавливаете переменную, она устанавливается только для текущего буфера. Если вы хотите имитировать настройку этой переменной глобально, вы используете set-default или setq-default.

Функции, которые использует автор пакетов:

  • defvar, который позволяет писателю пакета определять переменную и давать некоторую документацию. Эта функция не требуется, но облегчает жизнь пользователям.

  • defcustom основывается на defvar. Он сообщает emacs, что это переменная, и позволяет разработчику создавать интерфейс custom для установки значения. Разработчик может сказать, что такие вещи, как "эта переменная может содержать только значение" foo или "bar".

Настройка переменных может быть выполнена двумя способами:

  • если был использован defvar, значения могут быть установлены пользователем только в .emacs с помощью функции set (или вариантов)

  • если используется defcustom, значения могут быть установлены с помощью set (см. 1.) ИЛИ с помощью Customize. При использовании механизма настройки emacs генерирует некоторый код, который он поместит в custom-set-variables. Пользователь не должен использовать эту функцию.

Ответ 2

Они, в основном, все пути к одному и тому же. Однако есть некоторые важные отличия. Лучший способ познакомиться с ними - прочитать руководства для Emacs и Elisp (см. C-h i)). Сверху головы:

  • set - это присвоение переменной "низкий уровень"
  • (setq foo bar) является сокращением для (set (quote foo) bar)
  • (set-default foo bar) означает "если в текущем буфере нет более четко определенного определения foo, используйте строку значений" и применяется ко всем буферам.
  • defcustom используется для того, чтобы пометить переменную как та, что ожидается, что пользователь сможет безопасно модифицировать с помощью функции customize.
  • custom-set-value и customize-set-value - это два имени, которые указывают на одну и ту же функцию. Это удобные методы работы с системой customize.
  • custom-set-variables и customize-set-variables используются для того, чтобы сделать некоторый набор переменных, настроенных под заказ, активными, IIRC.

В общем, рекомендуется использовать M-x customize, чтобы изменить ситуацию. Вы можете устанавливать значения, определенные с помощью defcustom, с помощью set или setq в .emacs, система настройки предупредит вас об этом, если позже вы измените его с помощью customize.

defcustom обычно используется только людьми, пишущими пакеты, предназначенные для распространения, и я не думаю, что видел, что кто-то использует custom-set-* вне файлов, которые можно настроить самостоятельно. setq очень распространен в файлах инициализации людей для настройки того, как они им нравятся, независимо от того, помечены ли эти вещи для использования с customize или нет.

У меня нет полного понимания всего этого, надеюсь, кто-то еще может пролить больше света, но я думаю, что это довольно хороший обзор: P

Ответ 3

  • set и setq - примитивы нижнего уровня, используемые для назначения любой переменной.
  • set-default и setq-default являются расширениями emacs, которые идут вместе с буферными локальными переменными, позволяя устанавливать значения по умолчанию для новых буферов. 3-7. Все "пользовательские" материалы являются более поздним дополнением, которое было разработано для поддержки пользовательского интерфейса для управления переменными, которые предназначены для использования в качестве пользовательских настроек.
  • defcustom похож на defvar, но позволяет указать место в иерархии параметров, а также информацию о типе данных, чтобы пользовательский интерфейс мог отображать значение в виде меню или автоматически преобразовывать пользовательский ввод в соответствующий тип.
  • Я не думаю, что есть функция custom-set-value.
  • custom-set-variables используется при настройке пользовательского интерфейса при сохранении всех параметров пользователя. В нем перечислены все переменные, измененные пользователем по умолчанию. 6-7. custom-set-value и custom-set-variable используются настраиваемым пользовательским интерфейсом, чтобы запрашивать у пользователя текущие и значения по умолчанию переменной параметра и назначать их. Обычно вы не называете это сами.

Ответ 4

Так же, как добавление, различия между этими командами увеличились из-за введения лексической привязки, хотя эти различия не будут действительно релевантными, если вы просто хотите настроить некоторые переменные.

Конструкции def... объявляют глобальные переменные. Функции set... задают переменные, глобальные или локальные. Если x не является локальной переменной (формальным параметром текущей функции или объявленной формой let или аналогичным), либо не определяется формой def... и вы пишете (setq x 0), то байт-компилятор даже покажет предупреждение

Warning: assignment to free variable `x'

Переменные, объявленные с помощью defvar, defcustom, defconst, динамически связаны, т.е. когда у вас есть конструкция

(let ((lisp-indent-offset 2))
  (pp (some-function)))

функция some-function увидит изменение глобальной переменной lisp-indent-offset.

Если переменная не связана динамически, что-то вроде

(let ((my-local-var 1))
  (some-function))

где my-local-var не имеет глобального значения, тогда some-function не увидит назначенное значение, поскольку оно лексически ограничено.

С другой стороны, динамически скопированные переменные не будут записываться в лексические замыкания.

Более подробную информацию можно найти в http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html