Если вы хотите разделить свой custom-set-variables
, но хотите что-то более легкое, чем initsplit.el
, попробуйте следующее:
(defmacro custom-set-variable (var value)
"Call `custom-set-variables' with a warning shown
when customizing using the customize GUI.
XXX: does not support setting the optional NOW and
REQUEST (dependency) fields."
(custom-set-variables
;; `load-file-name' is set by `load-file':
;; http://stackoverflow.com/a/1971376/470844
`(,var ,value nil nil
,(format "!!! CAREFUL: CUSTOM-SET IN %s !!!" load-file-name))))
Теперь поместите модули конфигурации в отдельные файлы и загрузите их с load-file
в свой ~/.emacs
, как предлагали другие. В каждом модуле конфигурации используйте
(custom-set-variable var value)
вместо
(custom-set-variables '(var value))
or
(setq-default var value)
при установке переменных, управляемых с помощью customize. Затем, если вам когда-либо понадобится настроить переменную с помощью интерфейса настройки, вы увидите предупреждение о том, в каком файле следует сохранить настройку:
"!!! CAREFUL: CUSTOM-SET IN <path to module file> !!!"
Если вы управляете версиями своих файлов конфигурации, то различие покажет, какую строку вашего ~/.emacs
нужно переместить в настраиваемый модуль.
Обсуждение проблем с наивным использованием нескольких custom-set-variables
вызовов: http://www.dotemacs.de/custbuffer.html < / а>
Изменить: ответ на вопросы Алана
Проблема, которую решает макрос custom-set-variable
выше
Интерфейс настройки в Emacs сохраняет все переменные пользовательского набора в вашем ~/.emacs
всякий раз, когда вы редактируете любую переменную пользовательского набора. Если вы модулируете свои настраиваемые переменные, распределяя их по нескольким файлам, тогда вам нужно понимать, когда emacs вставляет повторяющиеся настройки в ваш .emacs и удаляет их. Приведенный выше макрос custom-set-variable
поможет вам в этом.
Реальный пример из моих файлов конфигурации
Я настраиваю переменные, связанные с пробелами, в файле ~/.emacs.d/extensions/whitespace.el
, который загружается моим _ 16_. Например, я установил свой _ 17_ примерно так:
(nc:custom-set-variable search-whitespace-regexp "[ \t\r\n]+")
Теперь происходят две вещи. Во-первых, когда я сталкиваюсь с этой переменной в интерфейсе настройки, я получаю предупреждение:
Во-вторых, если я редактирую какие-либо переменные с помощью интерфейса настройки, мой ~/.emacs
делает очень очевидным, что я затенял некоторые определения. Например, после изменения search-whitespace-regexp
и global-whitespace-mode
в интерфейсе настройки я получаю:
$ svn di --diff-cmd "diff" -x "-U0" ~/v/conf
Index: /home/collins/v/conf/dot.emacs
===================================================================
--- /home/collins/v/conf/dot.emacs (revision 267)
+++ /home/collins/v/conf/dot.emacs (working copy)
@@ -55,0 +56 @@
+ '(agda2-include-dirs (\` ("." (\, (file-truename "~/local/opt/agda-std-lib/src")))) nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/agda.el !!!")
@@ -58,0 +60,3 @@
+ '(global-whitespace-mode t)
+ '(indent-tabs-mode nil nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
+ '(indicate-empty-lines t nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -72,0 +77 @@
+ '(search-whitespace-regexp "" nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
@@ -74,0 +80 @@
+ '(tab-width 2 nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")
Макрос не помогает мне вспомнить, что я изменил search-whitespace-regexp
, только то, что он уже установлен где-то еще, но он помогает мне узнать, какие настройки переменных я должен удалить из моего ~/.emacs
(все с предупреждениями), а какие я должен оставить в my ~/.emacs
, или переместить в другие отдельные файлы (все без предупреждений).
Вывод
Макрос, вероятно, излишний, но когда он существует, он прост в использовании и позволяет избежать попадания себе в ногу с помощью затененных настраиваемых переменных.
person
ntc2
schedule
10.06.2012