Confusing about the Emacs custom system
Solution 1:
The short answer to you question is:
use
setq
orsetq-default
for variables defined bydefvar
.use
setq
,setq-default
, or theCustomize
mechanism for variables defined bydefcustom
Below is the long answer.
The functions that you are going to use are the following:
set
is the main function to set the value of a variable.setq
is another version that automatically quotes its first argument. This is useful since quoting the first argument is what you want to do almost all the time.Some variables cannot be set globally. Whenever you set the variable it is only set for the current buffer. If you want to simulate setting this variable globally you use
set-default
orsetq-default
.
The functions that a package writer uses are:
defvar
which allows the package writer to define a variable and to give some documentation. This function is not required but makes the life of users easier.defcustom
builds ondefvar
. It tells emacs that it is a variable, and it allows the developer to create acustom
interface to set the value. The developer can say, things like "this variable can contain only the value 'foo or 'bar".
Setting variables can be done two ways:
if
defvar
was used, the values can only be set by the user in its.emacs
by using theset
function (or variants)if
defcustom
was used, the values can be set usingset
(see 1.) OR by usingCustomize
. When using the customize mechanism, emacs will generate some code that it will place incustom-set-variables
. The user should not use this function.
Solution 2:
They are, largely all paths to the same thing. There are some important differences though. The best way to get to know them is to read the manuals for Emacs and Elisp (see C-h i)
. Off the top of the head though:
-
set
is a "low-level" variable assignment -
(setq foo bar)
is shorthand for(set (quote foo) bar)
-
(set-default foo bar)
means "unless there is a more explicitly scoped definition offoo
in the current buffer, use the value bar", and applies to all buffers. -
defcustom
is used to mark a variable as one that the user is expected to be able to safely modify through thecustomize
feature. -
custom-set-value
andcustomize-set-value
are two names that point to the same function. They're convenience methods for working with thecustomize
system. -
custom-set-variables
andcustomize-set-variables
are used to make some set of customized-through-customize variables active, IIRC.
In general, it's recommended to use M-x customize
to change things around. You're free to set things defined with defcustom
using set
or setq
in your .emacs
, the customize system will warn you about it if you later change it via customize
though.
defcustom
is generally only used by people writing packages meant for distribution, and I don't think I've seen anyone use custom-set-*
outside of files internal to customize. setq
is very common in people's initialization files for setting things up how they like them, regardless of whether those things are marked for use with customize
or not.
I don't have a full understanding of all this, hopefully someone else can shed more light, but I think that that's a fairly good overview :P
Solution 3:
-
set
andsetq
are the lowest level primitives used for assigning any kind of variable. -
set-default
andsetq-default
are emacs extensions that go along with buffer-local variables, to allow setting the default values used for new buffers. 3-7. All the "custom" stuff is a later addition that was designed to support a user interface for managing variables that are intended to be used as user preferences. -
defcustom
is similar todefvar
, but allows you to specify a place in the hierarchy of options, as well as data type information so that the UI can display the value as a menu, or automatically convert user input to the appropriate type. - I don't think there is a
custom-set-value
function. -
custom-set-variables
is used by the customize UI when saving all the user's options. It lists all the variables that the user has changed from their defaults. 6-7.custom-set-value
andcustom-set-variable
are used by the Customize UI to prompt the user for the current and default values of an option variable, and assign them. You don't normally call this yourself.
Solution 4:
Just as addition, the differences between those commands have increased due to the introduction of lexical binding, though those differences will not really be relevant if you just want to customize some variables.
The def...
constructs declare global variables. The set...
functions set variables, whether global or local. When x
is neither a local variable (a formal parameter of the current function or declared by a let
form or similiar) nor defined by a def...
form and you write (setq x 0)
the byte compiler will even show a warning
Warning: assignment to free variable `x'
Variables declared with defvar
, defcustom
, defconst
are dynamically bound, i.e. when you have a construct
(let ((lisp-indent-offset 2))
(pp (some-function)))
the function some-function
will see the change of the global variable lisp-indent-offset
.
When a variable is not dynamically bound, in something like
(let ((my-local-var 1))
(some-function))
where my-local-var
has no global value, then some-function
will not see the assigned value, as it is lexically scoped.
On the other hand, dynamically scoped variables will not be captured into lexical closures.
More details can be seen in http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html