Next: Accessing Variables, Previous: Defining Variables, Up: Variables
When you define a variable whose value is a function, or a list of functions, use a name that ends in ‘-function’ or ‘-functions’, respectively.
There are several other variable name conventions; here is a complete list:
nil
for success and nil
for failure.
nil
or not.
Since such variables often end up acquiring more values over time,
this convention is not strongly recommended.
When you define a variable, always consider whether you should mark it as safe or risky; see File Local Variables.
When defining and initializing a variable that holds a complicated
value (such as a keymap with bindings in it), it's best to put the
entire computation of the value into the defvar
, like this:
(defvar my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) ... map) docstring)
This method has several benefits. First, if the user quits while
loading the file, the variable is either still uninitialized or
initialized properly, never in-between. If it is still uninitialized,
reloading the file will initialize it properly. Second, reloading the
file once the variable is initialized will not alter it; that is
important if the user has run hooks to alter part of the contents
(such as, to rebind keys). Third, evaluating the defvar
form
with C-M-x will reinitialize the map completely.
Putting so much code in the defvar
form has one disadvantage:
it puts the documentation string far away from the line which names the
variable. Here's a safe way to avoid that:
(defvar my-mode-map nil docstring) (unless my-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c\C-a" 'my-command) ... (setq my-mode-map map)))
This has all the same advantages as putting the initialization inside
the defvar
, except that you must type C-M-x twice, once on
each form, if you do want to reinitialize the variable.