annotate lispref/variables.texi @ 69478:e8bb5df2ba7a

Add index entries around each paragraph rather than depend on entries from beginning of node. Doing so ensures that index entries are less likely to be forgotten if text is cut and pasted, and are necessary anyway if the references are on a separate page. It seems that makeinfo is now (v. 4.8) only producing one index entry per node, so there is no longer any excuse not to. Use subheading instead of heading. The incorrect use of heading produced very large fonts in Info--as large as the main heading. (From Bill Wohler): MH-E never did appear in Emacs 21--MH-E versions 6 and 7 appeared *around* the time of these Emacs releases.
author Bill Wohler <wohler@newt.com>
date Wed, 15 Mar 2006 00:26:12 +0000
parents 485885718688
children 8e99225a4438 9e490faa9f6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 @c -*-texinfo-*-
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2 @c This is part of the GNU Emacs Lisp Reference Manual.
64889
e836425ee789 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 63827
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2002,
68648
067115a6e738 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 66665
diff changeset
4 @c 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 @c See the file elisp.texi for copying conditions.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 @setfilename ../info/variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 @node Variables, Functions, Control Structures, Top
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 @chapter Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 @cindex variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 A @dfn{variable} is a name used in a program to stand for a value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 Nearly all programming languages have variables of some sort. In the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 text of a Lisp program, variables are written using the syntax for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 symbols.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 In Lisp, unlike most programming languages, programs are represented
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 primarily as Lisp objects and only secondarily as text. The Lisp
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 objects used for variables are symbols: the symbol name is the variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 name, and the variable's value is stored in the value cell of the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 symbol. The use of a symbol as a variable is independent of its use as
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 a function name. @xref{Symbol Components}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 The Lisp objects that constitute a Lisp program determine the textual
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
24 form of the program---it is simply the read syntax for those Lisp
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 objects. This is why, for example, a variable in a textual Lisp program
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 is written using the read syntax for the symbol that represents the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 variable.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 @menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 * Global Variables:: Variable values that exist permanently, everywhere.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 * Constant Variables:: Certain "variables" have values that never change.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 * Local Variables:: Variable values that exist only temporarily.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 * Void Variables:: Symbols that lack values.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 * Defining Variables:: A definition says a symbol is used as a variable.
27389
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
35 * Tips for Defining:: Things you should think about when you
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
36 define a variable.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 * Accessing Variables:: Examining values of variables whose names
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 are known only at run time.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 * Setting Variables:: Storing new values in variables.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 * Variable Scoping:: How Lisp chooses among local and global values.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 * Buffer-Local Variables:: Variable values in effect only in one buffer.
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
42 * Frame-Local Variables:: Variable values in effect only in one frame.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
43 * Future Local Variables:: New kinds of local values we might add some day.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
44 * File Local Variables:: Handling local variable lists in files.
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
45 * Variable Aliases:: Variables that are aliases for other variables.
53295
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
46 * Variables with Restricted Values:: Non-constant variables whose value can
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
47 @emph{not} be an arbitrary Lisp object.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 @end menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 @node Global Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 @section Global Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 @cindex global variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 The simplest way to use a variable is @dfn{globally}. This means that
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 the variable has just one value at a time, and this value is in effect
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 (at least for the moment) throughout the Lisp system. The value remains
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 in effect until you specify a new one. When a new value replaces the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 old one, no trace of the old value remains in the variable.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 You specify a value for a symbol with @code{setq}. For example,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 (setq x '(a b))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 @noindent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 gives the variable @code{x} the value @code{(a b)}. Note that
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 @code{setq} does not evaluate its first argument, the name of the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 variable, but it does evaluate the second argument, the new value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 Once the variable has a value, you can refer to it by using the symbol
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 by itself as an expression. Thus,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 x @result{} (a b)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 @noindent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 assuming the @code{setq} form shown above has already been executed.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
83 If you do set the same variable again, the new value replaces the old
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
84 one:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 @result{} (a b)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 (setq x 4)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 @result{} 4
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 @result{} 4
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 @node Constant Variables
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
102 @section Variables that Never Change
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 @vindex nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 @vindex t
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 @kindex setting-constant
26200
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
106 @cindex keyword symbol
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
108 In Emacs Lisp, certain symbols normally evaluate to themselves. These
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
109 include @code{nil} and @code{t}, as well as any symbol whose name starts
26200
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
110 with @samp{:} (these are called @dfn{keywords}). These symbols cannot
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
111 be rebound, nor can their values be changed. Any attempt to set or bind
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
112 @code{nil} or @code{t} signals a @code{setting-constant} error. The
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
113 same is true for a keyword (a symbol whose name starts with @samp{:}),
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
114 if it is interned in the standard obarray, except that setting such a
798aeda17389 Patch from rms.
Gerd Moellmann <gerd@gnu.org>
parents: 25751
diff changeset
115 symbol to itself is not an error.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 nil @equiv{} 'nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 @result{} nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 (setq nil 500)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 @error{} Attempt to set constant symbol: nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
27528
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
128 @defun keywordp object
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
129 @tindex keywordp
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
130 function returns @code{t} if @var{object} is a symbol whose name
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
131 starts with @samp{:}, interned in the standard obarray, and returns
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
132 @code{nil} otherwise.
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
133 @end defun
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
134
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 @node Local Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 @section Local Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 @cindex binding local variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 @cindex local variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 @cindex local binding
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 @cindex global binding
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 Global variables have values that last until explicitly superseded
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 with new values. Sometimes it is useful to create variable values that
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
144 exist temporarily---only until a certain part of the program finishes.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 These values are called @dfn{local}, and the variables so used are
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 called @dfn{local variables}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 For example, when a function is called, its argument variables receive
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 new local values that last until the function exits. The @code{let}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 special form explicitly establishes new local values for specified
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 variables; these last until exit from the @code{let} form.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 @cindex shadowing of variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 Establishing a local value saves away the previous value (or lack of
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 one) of the variable. When the life span of the local value is over,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 the previous value is restored. In the mean time, we say that the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 previous value is @dfn{shadowed} and @dfn{not visible}. Both global and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 local values may be shadowed (@pxref{Scope}).
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 If you set a variable (such as with @code{setq}) while it is local,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 this replaces the local value; it does not alter the global value, or
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
162 previous local values, that are shadowed. To model this behavior, we
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 speak of a @dfn{local binding} of the variable as well as a local value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 The local binding is a conceptual place that holds a local value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 Entry to a function, or a special form such as @code{let}, creates the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 local binding; exit from the function or from the @code{let} removes the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 local binding. As long as the local binding lasts, the variable's value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 is stored within it. Use of @code{setq} or @code{set} while there is a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 local binding stores a different value into the local binding; it does
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 not create a new binding.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 We also speak of the @dfn{global binding}, which is where
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (conceptually) the global value is kept.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 @cindex current binding
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 A variable can have more than one local binding at a time (for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 example, if there are nested @code{let} forms that bind it). In such a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 case, the most recently created local binding that still exists is the
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
180 @dfn{current binding} of the variable. (This rule is called
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
181 @dfn{dynamic scoping}; see @ref{Variable Scoping}.) If there are no
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
182 local bindings, the variable's global binding is its current binding.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
183 We sometimes call the current binding the @dfn{most-local existing
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
184 binding}, for emphasis. Ordinary evaluation of a symbol always returns
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
185 the value of its current binding.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 The special forms @code{let} and @code{let*} exist to create
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 local bindings.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 @defspec let (bindings@dots{}) forms@dots{}
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
191 This special form binds variables according to @var{bindings} and then
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 evaluates all of the @var{forms} in textual order. The @code{let}-form
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 returns the value of the last form in @var{forms}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 Each of the @var{bindings} is either @w{(i) a} symbol, in which case
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 that symbol is bound to @code{nil}; or @w{(ii) a} list of the form
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 @code{(@var{symbol} @var{value-form})}, in which case @var{symbol} is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 bound to the result of evaluating @var{value-form}. If @var{value-form}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 is omitted, @code{nil} is used.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 All of the @var{value-form}s in @var{bindings} are evaluated in the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
202 order they appear and @emph{before} binding any of the symbols to them.
52150
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
203 Here is an example of this: @code{z} is bound to the old value of
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
204 @code{y}, which is 2, not the new value of @code{y}, which is 1.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 @group
52150
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
208 (setq y 2)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 @group
52150
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
212 (let ((y 1)
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
213 (z y))
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
214 (list y z))
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 @result{} (1 2)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 @defspec let* (bindings@dots{}) forms@dots{}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 This special form is like @code{let}, but it binds each variable right
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 after computing its local value, before computing the local value for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 the next variable. Therefore, an expression in @var{bindings} can
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 reasonably refer to the preceding symbols bound in this @code{let*}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 form. Compare the following example with the example above for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 @code{let}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 @group
52150
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
230 (setq y 2)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 @group
52150
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
234 (let* ((y 1)
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
235 (z y)) ; @r{Use the just-established value of @code{y}.}
d35ce1568ac0 (Local Variables): Use lc for example variable names.
Richard M. Stallman <rms@gnu.org>
parents: 51916
diff changeset
236 (list y z))
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 @result{} (1 1)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
242 Here is a complete list of the other facilities that create local
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 bindings:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 @itemize @bullet
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 Function calls (@pxref{Functions}).
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 Macro calls (@pxref{Macros}).
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 @code{condition-case} (@pxref{Errors}).
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 @end itemize
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
256 Variables can also have buffer-local bindings (@pxref{Buffer-Local
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
257 Variables}) and frame-local bindings (@pxref{Frame-Local Variables}); a
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
258 few variables have terminal-local bindings (@pxref{Multiple Displays}).
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
259 These kinds of bindings work somewhat like ordinary local bindings, but
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
260 they are localized depending on ``where'' you are in Emacs, rather than
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
261 localized in time.
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
262
56215
c9aa4127a482 Reposition @anchor's.
Luc Teirlinck <teirllm@auburn.edu>
parents: 55858
diff changeset
263 @defvar max-specpdl-size
53295
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
264 @anchor{Definition of max-specpdl-size}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 @cindex variable limit error
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 @cindex evaluation error
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 @cindex infinite recursion
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
268 This variable defines the limit on the total number of local variable
53295
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
269 bindings and @code{unwind-protect} cleanups (@pxref{Cleanups,,
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
270 Cleaning Up from Nonlocal Exits}) that are allowed before signaling an
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
271 error (with data @code{"Variable binding depth exceeds
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
272 max-specpdl-size"}).
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
274 This limit, with the associated error when it is exceeded, is one way
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 that Lisp avoids infinite recursion on an ill-defined function.
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
276 @code{max-lisp-eval-depth} provides another limit on depth of nesting.
53295
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
277 @xref{Definition of max-lisp-eval-depth,, Eval}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
279 The default value is 600. Entry to the Lisp debugger increases the
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
280 value, if there is little room left, to make sure the debugger itself
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
281 has room to execute.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 @end defvar
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 @node Void Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 @section When a Variable is ``Void''
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 @kindex void-variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 @cindex void variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 If you have never given a symbol any value as a global variable, we
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 say that that symbol's global value is @dfn{void}. In other words, the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 symbol's value cell does not have any Lisp object in it. If you try to
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 evaluate the symbol, you get a @code{void-variable} error rather than
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 a value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 Note that a value of @code{nil} is not the same as void. The symbol
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 @code{nil} is a Lisp object and can be the value of a variable just as any
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 other object can be; but it is @emph{a value}. A void variable does not
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 have any value.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 After you have given a variable a value, you can make it void once more
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 using @code{makunbound}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 @defun makunbound symbol
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
304 This function makes the current variable binding of @var{symbol} void.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 Subsequent attempts to use this symbol's value as a variable will signal
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
306 the error @code{void-variable}, unless and until you set it again.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 @code{makunbound} returns @var{symbol}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
312 (makunbound 'x) ; @r{Make the global value of @code{x} void.}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 @result{} x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 @error{} Symbol's value as variable is void: x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 If @var{symbol} is locally bound, @code{makunbound} affects the most
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 local existing binding. This is the only way a symbol can have a void
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 local binding, since all the constructs that create local bindings
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 create them with values. In this case, the voidness lasts at most as
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 long as the binding does; when the binding is removed due to exit from
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
326 the construct that made it, the previous local or global binding is
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
327 reexposed as usual, and the variable is no longer void unless the newly
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
328 reexposed binding was void all along.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 @smallexample
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 (setq x 1) ; @r{Put a value in the global binding.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 @result{} 1
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 (let ((x 2)) ; @r{Locally bind it.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 (makunbound 'x) ; @r{Void the local binding.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 x)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 @error{} Symbol's value as variable is void: x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 x ; @r{The global binding is unchanged.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 @result{} 1
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (let ((x 2)) ; @r{Locally bind it.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (let ((x 3)) ; @r{And again.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (makunbound 'x) ; @r{Void the innermost-local binding.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 x)) ; @r{And refer: it's void.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 @error{} Symbol's value as variable is void: x
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 (let ((x 2))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 (let ((x 3))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 (makunbound 'x)) ; @r{Void inner binding, then remove it.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 x) ; @r{Now outer @code{let} binding is visible.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 @end smallexample
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 A variable that has been made void with @code{makunbound} is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 indistinguishable from one that has never received a value and has
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 always been void.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 You can use the function @code{boundp} to test whether a variable is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 currently void.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 @defun boundp variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 @code{boundp} returns @code{t} if @var{variable} (a symbol) is not void;
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 more precisely, if its current binding is not void. It returns
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 @code{nil} otherwise.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 @smallexample
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (boundp 'abracadabra) ; @r{Starts out void.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 @result{} nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (let ((abracadabra 5)) ; @r{Locally bind it.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (boundp 'abracadabra))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 @result{} t
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (boundp 'abracadabra) ; @r{Still globally void.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 @result{} nil
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 (setq abracadabra 5) ; @r{Make it globally nonvoid.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 @result{} 5
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (boundp 'abracadabra)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 @result{} t
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 @end smallexample
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 @node Defining Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 @section Defining Global Variables
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
399 @cindex variable definition
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 You may announce your intention to use a symbol as a global variable
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
402 with a @dfn{variable definition}: a special form, either @code{defconst}
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
403 or @code{defvar}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 In Emacs Lisp, definitions serve three purposes. First, they inform
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 people who read the code that certain symbols are @emph{intended} to be
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 used a certain way (as variables). Second, they inform the Lisp system
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 of these things, supplying a value and documentation. Third, they
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 provide information to utilities such as @code{etags} and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 @code{make-docfile}, which create data bases of the functions and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 variables in a program.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 The difference between @code{defconst} and @code{defvar} is primarily
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
414 a matter of intent, serving to inform human readers of whether the value
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
415 should ever change. Emacs Lisp does not restrict the ways in which a
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
416 variable can be used based on @code{defconst} or @code{defvar}
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
417 declarations. However, it does make a difference for initialization:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 @code{defconst} unconditionally initializes the variable, while
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 @code{defvar} initializes it only if it is void.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
421 @ignore
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 One would expect user option variables to be defined with
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 @code{defconst}, since programs do not change them. Unfortunately, this
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 has bad results if the definition is in a library that is not preloaded:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 @code{defconst} would override any prior value when the library is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 loaded. Users would like to be able to set user options in their init
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 files, and override the default values given in the definitions. For
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 this reason, user options must be defined with @code{defvar}.
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
429 @end ignore
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 @defspec defvar symbol [value [doc-string]]
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
432 This special form defines @var{symbol} as a variable and can also
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
433 initialize and document it. The definition informs a person reading
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
434 your code that @var{symbol} is used as a variable that might be set or
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
435 changed. Note that @var{symbol} is not evaluated; the symbol to be
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 defined must appear explicitly in the @code{defvar}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
438 If @var{symbol} is void and @var{value} is specified, @code{defvar}
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
439 evaluates it and sets @var{symbol} to the result. But if @var{symbol}
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
440 already has a value (i.e., it is not void), @var{value} is not even
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
441 evaluated, and @var{symbol}'s value remains unchanged. If @var{value}
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
442 is omitted, the value of @var{symbol} is not changed in any case.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
444 If @var{symbol} has a buffer-local binding in the current buffer,
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
445 @code{defvar} operates on the default value, which is buffer-independent,
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
446 not the current (buffer-local) binding. It sets the default value if
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
447 the default value is void. @xref{Buffer-Local Variables}.
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
448
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
449 When you evaluate a top-level @code{defvar} form with @kbd{C-M-x} in
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
450 Emacs Lisp mode (@code{eval-defun}), a special feature of
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
451 @code{eval-defun} arranges to set the variable unconditionally, without
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
452 testing whether its value is void.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 If the @var{doc-string} argument appears, it specifies the documentation
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 for the variable. (This opportunity to specify documentation is one of
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 the main benefits of defining the variable.) The documentation is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 stored in the symbol's @code{variable-documentation} property. The
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 Emacs help functions (@pxref{Documentation}) look for this property.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459
39165
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
460 If the variable is a user option that users would want to set
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
461 interactively, you should use @samp{*} as the first character of
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
462 @var{doc-string}. This lets users set the variable conveniently using
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
463 the @code{set-variable} command. Note that you should nearly always
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
464 use @code{defcustom} instead of @code{defvar} to define these
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
465 variables, so that users can use @kbd{M-x customize} and related
27db1f1aac19 Correct the statement of when to use * in variable doc strings.
Richard M. Stallman <rms@gnu.org>
parents: 37583
diff changeset
466 commands to set them. @xref{Customization}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
468 Here are some examples. This form defines @code{foo} but does not
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
469 initialize it:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 (defvar foo)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 @result{} foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
478 This example initializes the value of @code{bar} to @code{23}, and gives
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
479 it a documentation string:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (defvar bar 23
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 "The normal weight of a bar.")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 @result{} bar
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 The following form changes the documentation string for @code{bar},
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 making it a user option, but does not change the value, since @code{bar}
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
491 already has a value. (The addition @code{(1+ nil)} would get an error
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
492 if it were evaluated, but since it is not evaluated, there is no error.)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 @group
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
496 (defvar bar (1+ nil)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 "*The normal weight of a bar.")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 @result{} bar
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 bar
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 @result{} 23
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 Here is an equivalent expression for the @code{defvar} special form:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 (defvar @var{symbol} @var{value} @var{doc-string})
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 @equiv{}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 (progn
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 (if (not (boundp '@var{symbol}))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 (setq @var{symbol} @var{value}))
12821
259b1abdec5f Fix defvar equivalent expression.
Richard M. Stallman <rms@gnu.org>
parents: 12820
diff changeset
515 (if '@var{doc-string}
259b1abdec5f Fix defvar equivalent expression.
Richard M. Stallman <rms@gnu.org>
parents: 12820
diff changeset
516 (put '@var{symbol} 'variable-documentation '@var{doc-string}))
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 '@var{symbol})
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 The @code{defvar} form returns @var{symbol}, but it is normally used
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 at top level in a file where its value does not matter.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
525 @defspec defconst symbol value [doc-string]
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 This special form defines @var{symbol} as a value and initializes it.
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
527 It informs a person reading your code that @var{symbol} has a standard
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
528 global value, established here, that should not be changed by the user
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
529 or by other programs. Note that @var{symbol} is not evaluated; the
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 symbol to be defined must appear explicitly in the @code{defconst}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
532 @code{defconst} always evaluates @var{value}, and sets the value of
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
533 @var{symbol} to the result. If @var{symbol} does have a buffer-local
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
534 binding in the current buffer, @code{defconst} sets the default value,
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
535 not the buffer-local value. (But you should not be making
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
536 buffer-local bindings for a symbol that is defined with
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
537 @code{defconst}.)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 Here, @code{pi} is a constant that presumably ought not to be changed
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 by anyone (attempts by the Indiana State Legislature notwithstanding).
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 As the second form illustrates, however, this is only advisory.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 (defconst pi 3.1415 "Pi to five places.")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 @result{} pi
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 (setq pi 3)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 @result{} pi
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 pi
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 @result{} 3
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
556 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 @defun user-variable-p variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 @cindex user option
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
561 This function returns @code{t} if @var{variable} is a user option---a
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 variable intended to be set by the user for customization---and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 @code{nil} otherwise. (Variables other than user options exist for the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 internal purposes of Lisp programs, and users need not know about them.)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565
27528
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
566 User option variables are distinguished from other variables either
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
567 though being declared using @code{defcustom}@footnote{They may also be
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
568 declared equivalently in @file{cus-start.el}.} or by the first character
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
569 of their @code{variable-documentation} property. If the property exists
5b4130fa5ab6 keywordp, user-variable-p change.
Dave Love <fx@gnu.org>
parents: 27390
diff changeset
570 and is a string, and its first character is @samp{*}, then the variable
63827
6b1ddf9e6581 (Defining Variables): Fix doc of `user-variable-p'.
Juanma Barranquero <lekktu@gmail.com>
parents: 63798
diff changeset
571 is a user option. Aliases of user options are also user options.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573
12820
4d6c32d4f782 Add index and xref to variable-interactive.
Richard M. Stallman <rms@gnu.org>
parents: 12802
diff changeset
574 @kindex variable-interactive
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 If a user option variable has a @code{variable-interactive} property,
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
576 the @code{set-variable} command uses that value to control reading the
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
577 new value for the variable. The property's value is used as if it were
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
578 specified in @code{interactive} (@pxref{Using Interactive}). However,
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
579 this feature is largely obsoleted by @code{defcustom}
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
580 (@pxref{Customization}).
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581
7735
7db892210924 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 7194
diff changeset
582 @strong{Warning:} If the @code{defconst} and @code{defvar} special
51703
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
583 forms are used while the variable has a local binding (made with
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
584 @code{let}, or a function argument), they set the local-binding's
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
585 value; the top-level binding is not changed. This is not what you
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
586 usually want. To prevent it, use these special forms at top level in
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
587 a file, where normally no local binding is in effect, and make sure to
b8860fc285cb Minor Texinfo usage fix.
Richard M. Stallman <rms@gnu.org>
parents: 51447
diff changeset
588 load the file before making a local binding for the variable.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
590 @node Tips for Defining
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
591 @section Tips for Defining Variables Robustly
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
592
27389
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
593 When you define a variable whose value is a function, or a list of
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
594 functions, use a name that ends in @samp{-function} or
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
595 @samp{-functions}, respectively.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
596
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
597 There are several other variable name conventions;
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
598 here is a complete list:
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
599
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
600 @table @samp
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
601 @item @dots{}-hook
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
602 The variable is a normal hook (@pxref{Hooks}).
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
603
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
604 @item @dots{}-function
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
605 The value is a function.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
606
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
607 @item @dots{}-functions
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
608 The value is a list of functions.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
609
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
610 @item @dots{}-form
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
611 The value is a form (an expression).
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
612
37583
313d4c5de5ca Two minor fixes.
Richard M. Stallman <rms@gnu.org>
parents: 32596
diff changeset
613 @item @dots{}-forms
27389
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
614 The value is a list of forms (expressions).
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
615
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
616 @item @dots{}-predicate
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
617 The value is a predicate---a function of one argument that returns
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
618 non-@code{nil} for ``good'' arguments and @code{nil} for ``bad''
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
619 arguments.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
620
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
621 @item @dots{}-flag
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
622 The value is significant only as to whether it is @code{nil} or not.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
623
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
624 @item @dots{}-program
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
625 The value is a program name.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
626
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
627 @item @dots{}-command
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
628 The value is a whole shell command.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
629
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
630 @item @samp{}-switches
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
631 The value specifies options for a command.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
632 @end table
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
633
37583
313d4c5de5ca Two minor fixes.
Richard M. Stallman <rms@gnu.org>
parents: 32596
diff changeset
634 When you define a variable, always consider whether you should mark
27389
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
635 it as ``risky''; see @ref{File Local Variables}.
0eff88dd2524 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
636
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
637 When defining and initializing a variable that holds a complicated
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
638 value (such as a keymap with bindings in it), it's best to put the
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
639 entire computation of the value into the @code{defvar}, like this:
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
640
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
641 @example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
642 (defvar my-mode-map
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
643 (let ((map (make-sparse-keymap)))
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
644 (define-key map "\C-c\C-a" 'my-command)
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
645 @dots{}
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
646 map)
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
647 @var{docstring})
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
648 @end example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
649
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
650 @noindent
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
651 This method has several benefits. First, if the user quits while
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
652 loading the file, the variable is either still uninitialized or
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
653 initialized properly, never in-between. If it is still uninitialized,
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
654 reloading the file will initialize it properly. Second, reloading the
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
655 file once the variable is initialized will not alter it; that is
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
656 important if the user has run hooks to alter part of the contents (such
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
657 as, to rebind keys). Third, evaluating the @code{defvar} form with
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
658 @kbd{C-M-x} @emph{will} reinitialize the map completely.
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
659
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
660 Putting so much code in the @code{defvar} form has one disadvantage:
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
661 it puts the documentation string far away from the line which names the
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
662 variable. Here's a safe way to avoid that:
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
663
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
664 @example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
665 (defvar my-mode-map nil
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
666 @var{docstring})
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
667 (unless my-mode-map
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
668 (let ((map (make-sparse-keymap)))
30502
0dca3aa6405a *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 27808
diff changeset
669 (define-key map "\C-c\C-a" 'my-command)
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
670 @dots{}
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
671 (setq my-mode-map map)))
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
672 @end example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
673
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
674 @noindent
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
675 This has all the same advantages as putting the initialization inside
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
676 the @code{defvar}, except that you must type @kbd{C-M-x} twice, once on
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
677 each form, if you do want to reinitialize the variable.
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
678
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
679 But be careful not to write the code like this:
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
680
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
681 @example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
682 (defvar my-mode-map nil
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
683 @var{docstring})
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
684 (unless my-mode-map
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
685 (setq my-mode-map (make-sparse-keymap))
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
686 (define-key my-mode-map "\C-c\C-a" 'my-command)
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
687 @dots{})
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
688 @end example
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
689
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
690 @noindent
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
691 This code sets the variable, then alters it, but it does so in more than
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
692 one step. If the user quits just after the @code{setq}, that leaves the
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
693 variable neither correctly initialized nor void nor @code{nil}. Once
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
694 that happens, reloading the file will not initialize the variable; it
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
695 will remain incomplete.
12802
74615e68b2cd New node, Tips for Defining.
Richard M. Stallman <rms@gnu.org>
parents: 12098
diff changeset
696
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
697 @node Accessing Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 @section Accessing Variable Values
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 The usual way to reference a variable is to write the symbol which
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701 names it (@pxref{Symbol Forms}). This requires you to specify the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702 variable name when you write the program. Usually that is exactly what
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
703 you want to do. Occasionally you need to choose at run time which
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704 variable to reference; then you can use @code{symbol-value}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
705
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706 @defun symbol-value symbol
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707 This function returns the value of @var{symbol}. This is the value in
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708 the innermost local binding of the symbol, or its global value if it
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 has no local bindings.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713 (setq abracadabra 5)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 @result{} 5
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
715 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
716 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 (setq foo 9)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 @result{} 9
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 ;; @r{Here the symbol @code{abracadabra}}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 ;; @r{is the symbol whose value is examined.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 (let ((abracadabra 'foo))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725 (symbol-value 'abracadabra))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 @result{} foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730 ;; @r{Here the value of @code{abracadabra},}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 ;; @r{which is @code{foo},}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 ;; @r{is the symbol whose value is examined.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 (let ((abracadabra 'foo))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
734 (symbol-value abracadabra))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 @result{} 9
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
736 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
738 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
739 (symbol-value 'abracadabra)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 @result{} 5
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
741 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
742 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
743
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
744 A @code{void-variable} error is signaled if the current binding of
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
745 @var{symbol} is void.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
746 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
747
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 @node Setting Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
749 @section How to Alter a Variable Value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
750
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751 The usual way to change the value of a variable is with the special
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752 form @code{setq}. When you need to compute the choice of variable at
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
753 run time, use the function @code{set}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
754
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755 @defspec setq [symbol form]@dots{}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
756 This special form is the most common method of changing a variable's
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
757 value. Each @var{symbol} is given a new value, which is the result of
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 evaluating the corresponding @var{form}. The most-local existing
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
759 binding of the symbol is changed.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
760
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 @code{setq} does not evaluate @var{symbol}; it sets the symbol that you
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
762 write. We say that this argument is @dfn{automatically quoted}. The
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
763 @samp{q} in @code{setq} stands for ``quoted.''
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
764
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
765 The value of the @code{setq} form is the value of the last @var{form}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 (setq x (1+ 2))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 @result{} 3
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 x ; @r{@code{x} now has a global value.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773 @result{} 3
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
774 @group
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48642
diff changeset
775 (let ((x 5))
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
776 (setq x 6) ; @r{The local binding of @code{x} is set.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 x)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
778 @result{} 6
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
780 x ; @r{The global value is unchanged.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
781 @result{} 3
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
782 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
783
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
784 Note that the first @var{form} is evaluated, then the first
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
785 @var{symbol} is set, then the second @var{form} is evaluated, then the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786 second @var{symbol} is set, and so on:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
787
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
790 (setq x 10 ; @r{Notice that @code{x} is set before}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
791 y (1+ x)) ; @r{the value of @code{y} is computed.}
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48642
diff changeset
792 @result{} 11
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
793 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
794 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
795 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
797 @defun set symbol value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
798 This function sets @var{symbol}'s value to @var{value}, then returns
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
799 @var{value}. Since @code{set} is a function, the expression written for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
800 @var{symbol} is evaluated to obtain the symbol to set.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
801
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
802 The most-local existing binding of the variable is the binding that is
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
803 set; shadowed bindings are not affected.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
804
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
805 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
806 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807 (set one 1)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
808 @error{} Symbol's value as variable is void: one
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
809 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811 (set 'one 1)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 @result{} 1
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
813 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
814 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815 (set 'two 'one)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
816 @result{} one
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
817 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819 (set two 2) ; @r{@code{two} evaluates to symbol @code{one}.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
820 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
822 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
823 one ; @r{So it is @code{one} that was set.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
824 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
825 (let ((one 1)) ; @r{This binding of @code{one} is set,}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
826 (set 'one 3) ; @r{not the global value.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
827 one)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
828 @result{} 3
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
829 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
830 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
831 one
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
832 @result{} 2
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
833 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
834 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
835
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
836 If @var{symbol} is not actually a symbol, a @code{wrong-type-argument}
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
837 error is signaled.
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
838
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
839 @example
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
840 (set '(x y) 'z)
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
841 @error{} Wrong type argument: symbolp, (x y)
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
842 @end example
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
843
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
844 Logically speaking, @code{set} is a more fundamental primitive than
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
845 @code{setq}. Any use of @code{setq} can be trivially rewritten to use
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
846 @code{set}; @code{setq} could even be defined as a macro, given the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
847 availability of @code{set}. However, @code{set} itself is rarely used;
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
848 beginners hardly need to know about it. It is useful only for choosing
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
849 at run time which variable to set. For example, the command
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
850 @code{set-variable}, which reads a variable name from the user and then
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
851 sets the variable, needs to use @code{set}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 @cindex CL note---@code{set} local
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 @quotation
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
855 @b{Common Lisp note:} In Common Lisp, @code{set} always changes the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
856 symbol's ``special'' or dynamic value, ignoring any lexical bindings.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
857 In Emacs Lisp, all variables and all bindings are dynamic, so @code{set}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 always affects the most local existing binding.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 @end quotation
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
860 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
861
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
862 One other function for setting a variable is designed to add
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
863 an element to a list if it is not already present in the list.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
864
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
865 @defun add-to-list symbol element &optional append
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
866 This function sets the variable @var{symbol} by consing @var{element}
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
867 onto the old value, if @var{element} is not already a member of that
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
868 value. It returns the resulting list, whether updated or not. The
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
869 value of @var{symbol} had better be a list already before the call.
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
870 Membership is tested using @code{equal}.
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
871
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
872 Normally, if @var{element} is added, it is added to the front of
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
873 @var{symbol}, but if the optional argument @var{append} is
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
874 non-@code{nil}, it is added at the end.
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
875
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
876 The argument @var{symbol} is not implicitly quoted; @code{add-to-list}
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
877 is an ordinary function, like @code{set} and unlike @code{setq}. Quote
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
878 the argument yourself if that is what you want.
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
879 @end defun
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
880
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
881 Here's a scenario showing how to use @code{add-to-list}:
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
882
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
883 @example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
884 (setq foo '(a b))
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
885 @result{} (a b)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
886
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
887 (add-to-list 'foo 'c) ;; @r{Add @code{c}.}
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
888 @result{} (c a b)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
889
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
890 (add-to-list 'foo 'b) ;; @r{No effect.}
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
891 @result{} (c a b)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
892
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
893 foo ;; @r{@code{foo} was changed.}
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
894 @result{} (c a b)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
895 @end example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
896
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
897 An equivalent expression for @code{(add-to-list '@var{var}
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
898 @var{value})} is this:
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
899
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
900 @example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
901 (or (member @var{value} @var{var})
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
902 (setq @var{var} (cons @var{value} @var{var})))
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
903 @end example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
904
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
905 @defun add-to-ordered-list symbol element &optional order
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
906 This function sets the variable @var{symbol} by inserting
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
907 @var{element} into the old value, which must be a list, at the
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
908 position specified by @var{order}. If @var{element} is already a
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
909 member of the list, its position in the list is adjusted according
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
910 to @var{order}. Membership is tested using @code{eq}.
63798
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
911 This function returns the resulting list, whether updated or not.
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
912
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
913 The @var{order} is typically a number (integer or float), and the
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
914 elements of the list are sorted in non-decreasing numerical order.
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
915
63798
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
916 @var{order} may also be omitted or @code{nil}. Then the numeric order
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
917 of @var{element} stays unchanged if it already has one; otherwise,
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
918 @var{element} has no numeric order. Elements without a numeric list
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
919 order are placed at the end of the list, in no particular order.
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
920
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
921 Any other value for @var{order} removes the numeric order of @var{element}
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
922 if it already has one; otherwise, it is equivalent to @code{nil}.
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
923
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
924 The argument @var{symbol} is not implicitly quoted;
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
925 @code{add-to-ordered-list} is an ordinary function, like @code{set}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
926 and unlike @code{setq}. Quote the argument yourself if that is what
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
927 you want.
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
928
63798
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
929 The ordering information is stored in a hash table on @var{symbol}'s
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
930 @code{list-order} property.
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
931 @end defun
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
932
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
933 Here's a scenario showing how to use @code{add-to-ordered-list}:
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
934
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
935 @example
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
936 (setq foo '())
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
937 @result{} nil
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
938
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
939 (add-to-ordered-list 'foo 'a 1) ;; @r{Add @code{a}.}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
940 @result{} (a)
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
941
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
942 (add-to-ordered-list 'foo 'c 3) ;; @r{Add @code{c}.}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
943 @result{} (a c)
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
944
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
945 (add-to-ordered-list 'foo 'b 2) ;; @r{Add @code{b}.}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
946 @result{} (a b c)
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
947
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
948 (add-to-ordered-list 'foo 'b 4) ;; @r{Move @code{b}.}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
949 @result{} (a c b)
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
950
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
951 (add-to-ordered-list 'foo 'd) ;; @r{Append @code{d}.}
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
952 @result{} (a c b d)
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
953
63798
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
954 (add-to-ordered-list 'foo 'e) ;; @r{Add @code{e}}.
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
955 @result{} (a c b e d)
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
956
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
957 foo ;; @r{@code{foo} was changed.}
63798
fe7324a36ce5 (Setting Variables): Correct and clarify description of `add-to-ordered-list'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 63607
diff changeset
958 @result{} (a c b e d)
63607
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
959 @end example
443baf51aba7 (Setting Variables): Any type of element can be
Kim F. Storm <storm@cua.dk>
parents: 63584
diff changeset
960
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
961 @node Variable Scoping
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 @section Scoping Rules for Variable Bindings
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
964 A given symbol @code{foo} can have several local variable bindings,
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965 established at different places in the Lisp program, as well as a global
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
966 binding. The most recently established binding takes precedence over
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
967 the others.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
968
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
969 @cindex scope
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
970 @cindex extent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
971 @cindex dynamic scoping
52784
025f7b9061e6 Index lexical scoping
Dave Love <fx@gnu.org>
parents: 52626
diff changeset
972 @cindex lexical scoping
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 Local bindings in Emacs Lisp have @dfn{indefinite scope} and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
974 @dfn{dynamic extent}. @dfn{Scope} refers to @emph{where} textually in
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
975 the source code the binding can be accessed. ``Indefinite scope'' means
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 that any part of the program can potentially access the variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 binding. @dfn{Extent} refers to @emph{when}, as the program is
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
978 executing, the binding exists. ``Dynamic extent'' means that the binding
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979 lasts as long as the activation of the construct that established it.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
980
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
981 The combination of dynamic extent and indefinite scope is called
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
982 @dfn{dynamic scoping}. By contrast, most programming languages use
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983 @dfn{lexical scoping}, in which references to a local variable must be
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 located textually within the function or block that binds the variable.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 @cindex CL note---special variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 @quotation
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
988 @b{Common Lisp note:} Variables declared ``special'' in Common Lisp are
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
989 dynamically scoped, like all variables in Emacs Lisp.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 @end quotation
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992 @menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993 * Scope:: Scope means where in the program a value is visible.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 Comparison with other languages.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
995 * Extent:: Extent means how long in time a value exists.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
996 * Impl of Scope:: Two ways to implement dynamic scoping.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
997 * Using Scoping:: How to use dynamic scoping carefully and avoid problems.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998 @end menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
999
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1000 @node Scope
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 @subsection Scope
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1002
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003 Emacs Lisp uses @dfn{indefinite scope} for local variable bindings.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1004 This means that any function anywhere in the program text might access a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1005 given binding of a variable. Consider the following function
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1006 definitions:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1007
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1008 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1009 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1010 (defun binder (x) ; @r{@code{x} is bound in @code{binder}.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011 (foo 5)) ; @r{@code{foo} is some other function.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1012 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1013
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1014 @group
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1015 (defun user () ; @r{@code{x} is used ``free'' in @code{user}.}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1016 (list x))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1017 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1018 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1019
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1020 In a lexically scoped language, the binding of @code{x} in
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021 @code{binder} would never be accessible in @code{user}, because
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022 @code{user} is not textually contained within the function
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
1023 @code{binder}. However, in dynamically-scoped Emacs Lisp, @code{user}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1024 may or may not refer to the binding of @code{x} established in
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
1025 @code{binder}, depending on the circumstances:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1026
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 @itemize @bullet
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1028 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 If we call @code{user} directly without calling @code{binder} at all,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1030 then whatever binding of @code{x} is found, it cannot come from
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1031 @code{binder}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 @item
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1034 If we define @code{foo} as follows and then call @code{binder}, then the
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1035 binding made in @code{binder} will be seen in @code{user}:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1036
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1037 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 (defun foo (lose)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 (user))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1041 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1042 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1043
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 @item
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1045 However, if we define @code{foo} as follows and then call @code{binder},
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1046 then the binding made in @code{binder} @emph{will not} be seen in
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1047 @code{user}:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 (defun foo (x)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 (user))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1053
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1054 @noindent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 Here, when @code{foo} is called by @code{binder}, it binds @code{x}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1056 (The binding in @code{foo} is said to @dfn{shadow} the one made in
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 @code{binder}.) Therefore, @code{user} will access the @code{x} bound
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1058 by @code{foo} instead of the one bound by @code{binder}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059 @end itemize
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1060
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1061 Emacs Lisp uses dynamic scoping because simple implementations of
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1062 lexical scoping are slow. In addition, every Lisp system needs to offer
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1063 dynamic scoping at least as an option; if lexical scoping is the norm,
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1064 there must be a way to specify dynamic scoping instead for a particular
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1065 variable. It might not be a bad thing for Emacs to offer both, but
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1066 implementing it with dynamic scoping only was much easier.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1067
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1068 @node Extent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1069 @subsection Extent
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071 @dfn{Extent} refers to the time during program execution that a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1072 variable name is valid. In Emacs Lisp, a variable is valid only while
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1073 the form that bound it is executing. This is called @dfn{dynamic
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1074 extent}. ``Local'' or ``automatic'' variables in most languages,
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1075 including C and Pascal, have dynamic extent.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1076
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1077 One alternative to dynamic extent is @dfn{indefinite extent}. This
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1078 means that a variable binding can live on past the exit from the form
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1079 that made the binding. Common Lisp and Scheme, for example, support
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1080 this, but Emacs Lisp does not.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1082 To illustrate this, the function below, @code{make-add}, returns a
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1083 function that purports to add @var{n} to its own argument @var{m}. This
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1084 would work in Common Lisp, but it does not do the job in Emacs Lisp,
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1085 because after the call to @code{make-add} exits, the variable @code{n}
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1086 is no longer bound to the actual argument 2.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1087
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1088 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1089 (defun make-add (n)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1090 (function (lambda (m) (+ n m)))) ; @r{Return a function.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091 @result{} make-add
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 (fset 'add2 (make-add 2)) ; @r{Define function @code{add2}}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093 ; @r{with @code{(make-add 2)}.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 @result{} (lambda (m) (+ n m))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1095 (add2 4) ; @r{Try to add 2 to 4.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1096 @error{} Symbol's value as variable is void: n
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1097 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 @cindex closures not available
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1100 Some Lisp dialects have ``closures'', objects that are like functions
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101 but record additional variable bindings. Emacs Lisp does not have
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1102 closures.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1103
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104 @node Impl of Scope
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1105 @subsection Implementation of Dynamic Scoping
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1106 @cindex deep binding
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1107
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1108 A simple sample implementation (which is not how Emacs Lisp actually
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1109 works) may help you understand dynamic binding. This technique is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1110 called @dfn{deep binding} and was used in early Lisp systems.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1111
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1112 Suppose there is a stack of bindings, which are variable-value pairs.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1113 At entry to a function or to a @code{let} form, we can push bindings
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1114 onto the stack for the arguments or local variables created there. We
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1115 can pop those bindings from the stack at exit from the binding
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1116 construct.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1117
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1118 We can find the value of a variable by searching the stack from top to
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1119 bottom for a binding for that variable; the value from that binding is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1120 the value of the variable. To set the variable, we search for the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1121 current binding, then store the new value into that binding.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1122
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1123 As you can see, a function's bindings remain in effect as long as it
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1124 continues execution, even during its calls to other functions. That is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1125 why we say the extent of the binding is dynamic. And any other function
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1126 can refer to the bindings, if it uses the same variables while the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1127 bindings are in effect. That is why we say the scope is indefinite.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1128
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1129 @cindex shallow binding
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1130 The actual implementation of variable scoping in GNU Emacs Lisp uses a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1131 technique called @dfn{shallow binding}. Each variable has a standard
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132 place in which its current value is always found---the value cell of the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1133 symbol.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1134
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1135 In shallow binding, setting the variable works by storing a value in
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1136 the value cell. Creating a new binding works by pushing the old value
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1137 (belonging to a previous binding) onto a stack, and storing the new
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1138 local value in the value cell. Eliminating a binding works by popping
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1139 the old value off the stack, into the value cell.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1140
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1141 We use shallow binding because it has the same results as deep
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142 binding, but runs faster, since there is never a need to search for a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 binding.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1145 @node Using Scoping
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1146 @subsection Proper Use of Dynamic Scoping
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 Binding a variable in one function and using it in another is a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1149 powerful technique, but if used without restraint, it can make programs
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1150 hard to understand. There are two clean ways to use this technique:
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1151
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1152 @itemize @bullet
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 Use or bind the variable only in a few related functions, written close
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1155 together in one file. Such a variable is used for communication within
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1156 one program.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1157
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 You should write comments to inform other programmers that they can see
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1159 all uses of the variable before them, and to advise them not to add uses
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1160 elsewhere.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1161
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1162 @item
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1163 Give the variable a well-defined, documented meaning, and make all
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1164 appropriate functions refer to it (but not bind it or set it) wherever
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1165 that meaning is relevant. For example, the variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1166 @code{case-fold-search} is defined as ``non-@code{nil} means ignore case
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1167 when searching''; various search and replace functions refer to it
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1168 directly or through their subroutines, but do not bind or set it.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170 Then you can bind the variable in other programs, knowing reliably what
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171 the effect will be.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172 @end itemize
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1174 In either case, you should define the variable with @code{defvar}.
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1175 This helps other people understand your program by telling them to look
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1176 for inter-function usage. It also avoids a warning from the byte
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1177 compiler. Choose the variable's name to avoid name conflicts---don't
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1178 use short names like @code{x}.
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1179
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1180 @node Buffer-Local Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1181 @section Buffer-Local Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182 @cindex variables, buffer-local
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 @cindex buffer-local variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1185 Global and local variable bindings are found in most programming
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
1186 languages in one form or another. Emacs, however, also supports additional,
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1187 unusual kinds of variable binding: @dfn{buffer-local} bindings, which
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
1188 apply only in one buffer, and @dfn{frame-local} bindings, which apply only in
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1189 one frame. Having different values for a variable in different buffers
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1190 and/or frames is an important customization method.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1191
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1192 This section describes buffer-local bindings; for frame-local
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1193 bindings, see the following section, @ref{Frame-Local Variables}. (A few
22252
40089afa2b1d *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22138
diff changeset
1194 variables have bindings that are local to each terminal; see
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1195 @ref{Multiple Displays}.)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1197 @menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1198 * Intro to Buffer-Local:: Introduction and concepts.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199 * Creating Buffer-Local:: Creating and destroying buffer-local bindings.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200 * Default Value:: The default value is seen in buffers
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1201 that don't have their own buffer-local values.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1202 @end menu
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1203
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1204 @node Intro to Buffer-Local
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1205 @subsection Introduction to Buffer-Local Variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1206
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1207 A buffer-local variable has a buffer-local binding associated with a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1208 particular buffer. The binding is in effect when that buffer is
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1209 current; otherwise, it is not in effect. If you set the variable while
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1210 a buffer-local binding is in effect, the new value goes in that binding,
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1211 so its other bindings are unchanged. This means that the change is
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1212 visible only in the buffer where you made it.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1213
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1214 The variable's ordinary binding, which is not associated with any
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1215 specific buffer, is called the @dfn{default binding}. In most cases,
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1216 this is the global binding.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1217
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1218 A variable can have buffer-local bindings in some buffers but not in
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1219 other buffers. The default binding is shared by all the buffers that
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1220 don't have their own bindings for the variable. (This includes all
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 22252
diff changeset
1221 newly-created buffers.) If you set the variable in a buffer that does
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1222 not have a buffer-local binding for it, this sets the default binding
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1223 (assuming there are no frame-local bindings to complicate the matter),
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1224 so the new value is visible in all the buffers that see the default
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1225 binding.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1226
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1227 The most common use of buffer-local bindings is for major modes to change
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1228 variables that control the behavior of commands. For example, C mode and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1229 Lisp mode both set the variable @code{paragraph-start} to specify that only
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1230 blank lines separate paragraphs. They do this by making the variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1231 buffer-local in the buffer that is being put into C mode or Lisp mode, and
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1232 then setting it to the new value for that mode. @xref{Major Modes}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1233
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 The usual way to make a buffer-local binding is with
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1235 @code{make-local-variable}, which is what major mode commands typically
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1236 use. This affects just the current buffer; all other buffers (including
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1237 those yet to be created) will continue to share the default value unless
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1238 they are explicitly given their own buffer-local bindings.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1239
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1240 @cindex automatically buffer-local
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1241 A more powerful operation is to mark the variable as
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1242 @dfn{automatically buffer-local} by calling
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1243 @code{make-variable-buffer-local}. You can think of this as making the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1244 variable local in all buffers, even those yet to be created. More
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1245 precisely, the effect is that setting the variable automatically makes
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1246 the variable local to the current buffer if it is not already so. All
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1247 buffers start out by sharing the default value of the variable as usual,
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1248 but setting the variable creates a buffer-local binding for the current
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1249 buffer. The new value is stored in the buffer-local binding, leaving
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1250 the default binding untouched. This means that the default value cannot
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1251 be changed with @code{setq} in any buffer; the only way to change it is
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1252 with @code{setq-default}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1253
51447
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1254 @strong{Warning:} When a variable has buffer-local or frame-local
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1255 bindings in one or more buffers, @code{let} rebinds the binding that's
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1256 currently in effect. For instance, if the current buffer has a
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1257 buffer-local value, @code{let} temporarily rebinds that. If no
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1258 buffer-local or frame-local bindings are in effect, @code{let} rebinds
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1259 the default value. If inside the @code{let} you then change to a
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1260 different current buffer in which a different binding is in effect,
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1261 you won't see the @code{let} binding any more. And if you exit the
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1262 @code{let} while still in the other buffer, you won't see the
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1263 unbinding occur (though it will occur properly). Here is an example
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1264 to illustrate:
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1265
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1266 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1267 @group
45276
51bf5310b422 (Intro to Buffer-Local): Updated warning and
Kim F. Storm <storm@cua.dk>
parents: 43264
diff changeset
1268 (setq foo 'g)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1269 (set-buffer "a")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1270 (make-local-variable 'foo)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1271 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1272 (setq foo 'a)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1273 (let ((foo 'temp))
45276
51bf5310b422 (Intro to Buffer-Local): Updated warning and
Kim F. Storm <storm@cua.dk>
parents: 43264
diff changeset
1274 ;; foo @result{} 'temp ; @r{let binding in buffer @samp{a}}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1275 (set-buffer "b")
45276
51bf5310b422 (Intro to Buffer-Local): Updated warning and
Kim F. Storm <storm@cua.dk>
parents: 43264
diff changeset
1276 ;; foo @result{} 'g ; @r{the global value since foo is not local in @samp{b}}
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1277 @var{body}@dots{})
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1278 @group
51447
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1279 foo @result{} 'g ; @r{exiting restored the local value in buffer @samp{a},}
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1280 ; @r{but we don't see that in buffer @samp{b}}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1281 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1282 @group
51447
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1283 (set-buffer "a") ; @r{verify the local value was restored}
140777d38847 Update the example and explanation about let and buffer-local bindings.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
1284 foo @result{} 'a
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1285 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1286 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1287
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1288 Note that references to @code{foo} in @var{body} access the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1289 buffer-local binding of buffer @samp{b}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1290
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1291 When a file specifies local variable values, these become buffer-local
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1292 values when you visit the file. @xref{File Variables,,, emacs, The
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1293 GNU Emacs Manual}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1294
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1295 @node Creating Buffer-Local
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1296 @subsection Creating and Deleting Buffer-Local Bindings
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1297
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1298 @deffn Command make-local-variable variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1299 This function creates a buffer-local binding in the current buffer for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 @var{variable} (a symbol). Other buffers are not affected. The value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301 returned is @var{variable}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1302
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1303 @c Emacs 19 feature
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1304 The buffer-local value of @var{variable} starts out as the same value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1305 @var{variable} previously had. If @var{variable} was void, it remains
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1306 void.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1307
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1308 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1309 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1310 ;; @r{In buffer @samp{b1}:}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1311 (setq foo 5) ; @r{Affects all buffers.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1312 @result{} 5
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1313 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1314 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1315 (make-local-variable 'foo) ; @r{Now it is local in @samp{b1}.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1316 @result{} foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1317 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1318 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1319 foo ; @r{That did not change}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1320 @result{} 5 ; @r{the value.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1321 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1322 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1323 (setq foo 6) ; @r{Change the value}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1324 @result{} 6 ; @r{in @samp{b1}.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1325 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1326 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1327 foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1328 @result{} 6
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1329 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1330
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1332 ;; @r{In buffer @samp{b2}, the value hasn't changed.}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1333 (save-excursion
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1334 (set-buffer "b2")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1335 foo)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336 @result{} 5
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1338 @end example
8214
a13093894b9a entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7735
diff changeset
1339
a13093894b9a entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7735
diff changeset
1340 Making a variable buffer-local within a @code{let}-binding for that
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1341 variable does not work reliably, unless the buffer in which you do this
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1342 is not current either on entry to or exit from the @code{let}. This is
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1343 because @code{let} does not distinguish between different kinds of
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1344 bindings; it knows only which variable the binding was made for.
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 8214
diff changeset
1345
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1346 If the variable is terminal-local, this function signals an error. Such
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1347 variables cannot have buffer-local bindings as well. @xref{Multiple
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1348 Displays}.
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1349
52626
fe75563f4d13 Avoid @strong{Note:}.
Richard M. Stallman <rms@gnu.org>
parents: 52536
diff changeset
1350 @strong{Warning:} do not use @code{make-local-variable} for a hook
fe75563f4d13 Avoid @strong{Note:}.
Richard M. Stallman <rms@gnu.org>
parents: 52536
diff changeset
1351 variable. The hook variables are automatically made buffer-local as
fe75563f4d13 Avoid @strong{Note:}.
Richard M. Stallman <rms@gnu.org>
parents: 52536
diff changeset
1352 needed if you use the @var{local} argument to @code{add-hook} or
43264
91a36592ab22 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 40724
diff changeset
1353 @code{remove-hook}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1354 @end deffn
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1355
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1356 @deffn Command make-variable-buffer-local variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1357 This function marks @var{variable} (a symbol) automatically
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1358 buffer-local, so that any subsequent attempt to set it will make it
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1359 local to the current buffer at the time.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1360
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1361 A peculiar wrinkle of this feature is that binding the variable (with
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1362 @code{let} or other binding constructs) does not create a buffer-local
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1363 binding for it. Only setting the variable (with @code{set} or
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1364 @code{setq}), while the variable does not have a @code{let}-style
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1365 binding that was made in the current buffer, does so.
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1366
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1367 If @var{variable} does not have a default value, then calling this
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1368 command will give it a default value of @code{nil}. If @var{variable}
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1369 already has a default value, that value remains unchanged.
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1370 Subsequently calling @code{makunbound} on @var{variable} will result
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1371 in a void buffer-local value and leave the default value unaffected.
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1372
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 The value returned is @var{variable}.
13166
c61ffdb6d9df Explain when to use make-variable-buffer-local.
Richard M. Stallman <rms@gnu.org>
parents: 12821
diff changeset
1374
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1375 @strong{Warning:} Don't assume that you should use
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1376 @code{make-variable-buffer-local} for user-option variables, simply
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1377 because users @emph{might} want to customize them differently in
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1378 different buffers. Users can make any variable local, when they wish
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1379 to. It is better to leave the choice to them.
13166
c61ffdb6d9df Explain when to use make-variable-buffer-local.
Richard M. Stallman <rms@gnu.org>
parents: 12821
diff changeset
1380
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1381 The time to use @code{make-variable-buffer-local} is when it is crucial
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1382 that no two buffers ever share the same binding. For example, when a
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1383 variable is used for internal purposes in a Lisp program which depends
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1384 on having separate values in separate buffers, then using
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1385 @code{make-variable-buffer-local} can be the best solution.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1386 @end deffn
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1387
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1388 @defun local-variable-p variable &optional buffer
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1389 This returns @code{t} if @var{variable} is buffer-local in buffer
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1390 @var{buffer} (which defaults to the current buffer); otherwise,
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1391 @code{nil}.
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1392 @end defun
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
1393
53436
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1394 @defun local-variable-if-set-p variable &optional buffer
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1395 This returns @code{t} if @var{variable} will become buffer-local in
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1396 buffer @var{buffer} (which defaults to the current buffer) if it is
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1397 set there.
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1398 @end defun
d5e80b7f2917 (Creating Buffer-Local): Add local-variable-if-set-p.
Richard M. Stallman <rms@gnu.org>
parents: 53295
diff changeset
1399
51916
f7b97d07a39c (Creating Buffer-Local): Add buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 51703
diff changeset
1400 @defun buffer-local-value variable buffer
52536
8fdcd48f4b33 (Creating Buffer-Local): Delete duplicate definition of buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1401 This function returns the buffer-local binding of @var{variable} (a
8fdcd48f4b33 (Creating Buffer-Local): Delete duplicate definition of buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1402 symbol) in buffer @var{buffer}. If @var{variable} does not have a
8fdcd48f4b33 (Creating Buffer-Local): Delete duplicate definition of buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1403 buffer-local binding in buffer @var{buffer}, it returns the default
8fdcd48f4b33 (Creating Buffer-Local): Delete duplicate definition of buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
1404 value (@pxref{Default Value}) of @var{variable} instead.
51916
f7b97d07a39c (Creating Buffer-Local): Add buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 51703
diff changeset
1405 @end defun
f7b97d07a39c (Creating Buffer-Local): Add buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 51703
diff changeset
1406
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1407 @defun buffer-local-variables &optional buffer
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1408 This function returns a list describing the buffer-local variables in
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1409 buffer @var{buffer}. (If @var{buffer} is omitted, the current buffer is
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1410 used.) It returns an association list (@pxref{Association Lists}) in
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1411 which each element contains one buffer-local variable and its value.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1412 However, when a variable's buffer-local binding in @var{buffer} is void,
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1413 then the variable appears directly in the resulting list.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1414
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1415 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1416 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1417 (make-local-variable 'foobar)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1418 (makunbound 'foobar)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1419 (make-local-variable 'bind-me)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1420 (setq bind-me 69)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1421 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1422 (setq lcl (buffer-local-variables))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1423 ;; @r{First, built-in variables local in all buffers:}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1424 @result{} ((mark-active . nil)
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1425 (buffer-undo-list . nil)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1426 (mode-name . "Fundamental")
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1427 @dots{}
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1428 @group
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48642
diff changeset
1429 ;; @r{Next, non-built-in buffer-local variables.}
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1430 ;; @r{This one is buffer-local and void:}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1431 foobar
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1432 ;; @r{This one is buffer-local and nonvoid:}
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1433 (bind-me . 69))
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1434 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1435 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1436
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1437 Note that storing new values into the @sc{cdr}s of cons cells in this
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1438 list does @emph{not} change the buffer-local values of the variables.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1439 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1440
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1441 @deffn Command kill-local-variable variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1442 This function deletes the buffer-local binding (if any) for
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1443 @var{variable} (a symbol) in the current buffer. As a result, the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1444 default binding of @var{variable} becomes visible in this buffer. This
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1445 typically results in a change in the value of @var{variable}, since the
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1446 default value is usually different from the buffer-local value just
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1447 eliminated.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1448
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1449 If you kill the buffer-local binding of a variable that automatically
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1450 becomes buffer-local when set, this makes the default value visible in
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1451 the current buffer. However, if you set the variable again, that will
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1452 once again create a buffer-local binding for it.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1453
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1454 @code{kill-local-variable} returns @var{variable}.
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1455
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1456 This function is a command because it is sometimes useful to kill one
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1457 buffer-local variable interactively, just as it is useful to create
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1458 buffer-local variables interactively.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1459 @end deffn
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1460
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1461 @defun kill-all-local-variables
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1462 This function eliminates all the buffer-local variable bindings of the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1463 current buffer except for variables marked as ``permanent''. As a
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1464 result, the buffer will see the default values of most variables.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1465
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1466 This function also resets certain other information pertaining to the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1467 buffer: it sets the local keymap to @code{nil}, the syntax table to the
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1468 value of @code{(standard-syntax-table)}, the case table to
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1469 @code{(standard-case-table)}, and the abbrev table to the value of
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1470 @code{fundamental-mode-abbrev-table}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1471
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1472 The very first thing this function does is run the normal hook
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1473 @code{change-major-mode-hook} (see below).
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1474
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1475 Every major mode command begins by calling this function, which has the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1476 effect of switching to Fundamental mode and erasing most of the effects
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1477 of the previous major mode. To ensure that this does its job, the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1478 variables that major modes set should not be marked permanent.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1479
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1480 @code{kill-all-local-variables} returns @code{nil}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1481 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1482
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1483 @defvar change-major-mode-hook
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1484 The function @code{kill-all-local-variables} runs this normal hook
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1485 before it does anything else. This gives major modes a way to arrange
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1486 for something special to be done if the user switches to a different
60048
ab86eb33656d (Creating Buffer-Local): change-major-mode-hook
Richard M. Stallman <rms@gnu.org>
parents: 56215
diff changeset
1487 major mode. It is also useful for buffer-specific minor modes
ab86eb33656d (Creating Buffer-Local): change-major-mode-hook
Richard M. Stallman <rms@gnu.org>
parents: 56215
diff changeset
1488 that should be forgotten if the user changes the major mode.
ab86eb33656d (Creating Buffer-Local): change-major-mode-hook
Richard M. Stallman <rms@gnu.org>
parents: 56215
diff changeset
1489
ab86eb33656d (Creating Buffer-Local): change-major-mode-hook
Richard M. Stallman <rms@gnu.org>
parents: 56215
diff changeset
1490 For best results, make this variable buffer-local, so that it will
ab86eb33656d (Creating Buffer-Local): change-major-mode-hook
Richard M. Stallman <rms@gnu.org>
parents: 56215
diff changeset
1491 disappear after doing its job and will not interfere with the
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1492 subsequent major mode. @xref{Hooks}.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1493 @end defvar
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1494
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1495 @c Emacs 19 feature
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1496 @cindex permanent local variable
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1497 A buffer-local variable is @dfn{permanent} if the variable name (a
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1498 symbol) has a @code{permanent-local} property that is non-@code{nil}.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1499 Permanent locals are appropriate for data pertaining to where the file
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1500 came from or how to save it, rather than with how to edit the contents.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1501
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1502 @node Default Value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1503 @subsection The Default Value of a Buffer-Local Variable
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1504 @cindex default value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1505
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1506 The global value of a variable with buffer-local bindings is also
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1507 called the @dfn{default} value, because it is the value that is in
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1508 effect whenever neither the current buffer nor the selected frame has
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1509 its own binding for the variable.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1511 The functions @code{default-value} and @code{setq-default} access and
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1512 change a variable's default value regardless of whether the current
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1513 buffer has a buffer-local binding. For example, you could use
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1514 @code{setq-default} to change the default setting of
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1515 @code{paragraph-start} for most buffers; and this would work even when
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1516 you are in a C or Lisp mode buffer that has a buffer-local value for
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1517 this variable.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1518
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1519 @c Emacs 19 feature
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1520 The special forms @code{defvar} and @code{defconst} also set the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1521 default value (if they set the variable at all), rather than any
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1522 buffer-local or frame-local value.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1523
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1524 @defun default-value symbol
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1525 This function returns @var{symbol}'s default value. This is the value
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1526 that is seen in buffers and frames that do not have their own values for
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1527 this variable. If @var{symbol} is not buffer-local, this is equivalent
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1528 to @code{symbol-value} (@pxref{Accessing Variables}).
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1529 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1530
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1531 @c Emacs 19 feature
7194
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1532 @defun default-boundp symbol
3112fb627aa0 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6510
diff changeset
1533 The function @code{default-boundp} tells you whether @var{symbol}'s
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1534 default value is nonvoid. If @code{(default-boundp 'foo)} returns
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1535 @code{nil}, then @code{(default-value 'foo)} would get an error.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1536
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1537 @code{default-boundp} is to @code{default-value} as @code{boundp} is to
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1538 @code{symbol-value}.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1539 @end defun
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1540
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1541 @defspec setq-default [symbol form]@dots{}
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1542 This special form gives each @var{symbol} a new default value, which is
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1543 the result of evaluating the corresponding @var{form}. It does not
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1544 evaluate @var{symbol}, but does evaluate @var{form}. The value of the
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1545 @code{setq-default} form is the value of the last @var{form}.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1546
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1547 If a @var{symbol} is not buffer-local for the current buffer, and is not
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1548 marked automatically buffer-local, @code{setq-default} has the same
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1549 effect as @code{setq}. If @var{symbol} is buffer-local for the current
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1550 buffer, then this changes the value that other buffers will see (as long
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1551 as they don't have a buffer-local value), but not the value that the
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1552 current buffer sees.
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1553
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1554 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1555 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1556 ;; @r{In buffer @samp{foo}:}
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1557 (make-local-variable 'buffer-local)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1558 @result{} buffer-local
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1559 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1560 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1561 (setq buffer-local 'value-in-foo)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1562 @result{} value-in-foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1563 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1564 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1565 (setq-default buffer-local 'new-default)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1566 @result{} new-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1567 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1568 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1569 buffer-local
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1570 @result{} value-in-foo
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1571 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1572 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1573 (default-value 'buffer-local)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1574 @result{} new-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1575 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1576
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1577 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1578 ;; @r{In (the new) buffer @samp{bar}:}
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1579 buffer-local
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1580 @result{} new-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1581 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1582 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1583 (default-value 'buffer-local)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1584 @result{} new-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1585 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1586 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1587 (setq buffer-local 'another-default)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1588 @result{} another-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1589 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1590 @group
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1591 (default-value 'buffer-local)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1592 @result{} another-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1593 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1594
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1595 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1596 ;; @r{Back in buffer @samp{foo}:}
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1597 buffer-local
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1598 @result{} value-in-foo
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1599 (default-value 'buffer-local)
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1600 @result{} another-default
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1601 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1602 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1603 @end defspec
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1604
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1605 @defun set-default symbol value
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1606 This function is like @code{setq-default}, except that @var{symbol} is
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 13166
diff changeset
1607 an ordinary evaluated argument.
6510
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1608
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1609 @example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1610 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1611 (set-default (car '(a b c)) 23)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1612 @result{} 23
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1613 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1614 @group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1615 (default-value 'a)
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1616 @result{} 23
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1617 @end group
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1618 @end example
e18202af3602 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1619 @end defun
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1620
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1621 @node Frame-Local Variables
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1622 @section Frame-Local Variables
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1623
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1624 Just as variables can have buffer-local bindings, they can also have
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1625 frame-local bindings. These bindings belong to one frame, and are in
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1626 effect when that frame is selected. Frame-local bindings are actually
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1627 frame parameters: you create a frame-local binding in a specific frame
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1628 by calling @code{modify-frame-parameters} and specifying the variable
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1629 name as the parameter name.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1630
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1631 To enable frame-local bindings for a certain variable, call the function
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1632 @code{make-variable-frame-local}.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1633
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1634 @deffn Command make-variable-frame-local variable
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1635 Enable the use of frame-local bindings for @var{variable}. This does
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1636 not in itself create any frame-local bindings for the variable; however,
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1637 if some frame already has a value for @var{variable} as a frame
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1638 parameter, that value automatically becomes a frame-local binding.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1639
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1640 If @var{variable} does not have a default value, then calling this
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1641 command will give it a default value of @code{nil}. If @var{variable}
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1642 already has a default value, that value remains unchanged.
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1643
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1644 If the variable is terminal-local, this function signals an error,
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1645 because such variables cannot have frame-local bindings as well.
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1646 @xref{Multiple Displays}. A few variables that are implemented
66665
127ab86e8386 (Frame-Local Variables): Small clarification.
Richard M. Stallman <rms@gnu.org>
parents: 64889
diff changeset
1647 specially in Emacs can be buffer-local, but can never be frame-local.
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1648
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1649 This command returns @var{variable}.
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
1650 @end deffn
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1651
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1652 Buffer-local bindings take precedence over frame-local bindings. Thus,
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1653 consider a variable @code{foo}: if the current buffer has a buffer-local
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1654 binding for @code{foo}, that binding is active; otherwise, if the
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1655 selected frame has a frame-local binding for @code{foo}, that binding is
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1656 active; otherwise, the default binding of @code{foo} is active.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1657
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1658 Here is an example. First we prepare a few bindings for @code{foo}:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1659
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1660 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1661 (setq f1 (selected-frame))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1662 (make-variable-frame-local 'foo)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1663
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1664 ;; @r{Make a buffer-local binding for @code{foo} in @samp{b1}.}
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1665 (set-buffer (get-buffer-create "b1"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1666 (make-local-variable 'foo)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1667 (setq foo '(b 1))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1668
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1669 ;; @r{Make a frame-local binding for @code{foo} in a new frame.}
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1670 ;; @r{Store that frame in @code{f2}.}
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1671 (setq f2 (make-frame))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1672 (modify-frame-parameters f2 '((foo . (f 2))))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1673 @end example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1674
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1675 Now we examine @code{foo} in various contexts. Whenever the
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1676 buffer @samp{b1} is current, its buffer-local binding is in effect,
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1677 regardless of the selected frame:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1678
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1679 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1680 (select-frame f1)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1681 (set-buffer (get-buffer-create "b1"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1682 foo
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1683 @result{} (b 1)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1684
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1685 (select-frame f2)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1686 (set-buffer (get-buffer-create "b1"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1687 foo
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1688 @result{} (b 1)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1689 @end example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1690
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1691 @noindent
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1692 Otherwise, the frame gets a chance to provide the binding; when frame
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1693 @code{f2} is selected, its frame-local binding is in effect:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1694
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1695 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1696 (select-frame f2)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1697 (set-buffer (get-buffer "*scratch*"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1698 foo
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1699 @result{} (f 2)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1700 @end example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1701
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1702 @noindent
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1703 When neither the current buffer nor the selected frame provides
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1704 a binding, the default binding is used:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1705
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1706 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1707 (select-frame f1)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1708 (set-buffer (get-buffer "*scratch*"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1709 foo
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1710 @result{} nil
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1711 @end example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1712
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1713 @noindent
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1714 When the active binding of a variable is a frame-local binding, setting
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1715 the variable changes that binding. You can observe the result with
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1716 @code{frame-parameters}:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1717
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1718 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1719 (select-frame f2)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1720 (set-buffer (get-buffer "*scratch*"))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1721 (setq foo 'nobody)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1722 (assq 'foo (frame-parameters f2))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1723 @result{} (foo . nobody)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1724 @end example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1725
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1726 @node Future Local Variables
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1727 @section Possible Future Local Variables
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1728
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1729 We have considered the idea of bindings that are local to a category
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1730 of frames---for example, all color frames, or all frames with dark
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1731 backgrounds. We have not implemented them because it is not clear that
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1732 this feature is really useful. You can get more or less the same
32596
1cb37313bcac Obsolete variable `after-make-frame-hook'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 30502
diff changeset
1733 results by adding a function to @code{after-make-frame-functions}, set up to
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1734 define a particular frame parameter according to the appropriate
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1735 conditions for each frame.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1736
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1737 It would also be possible to implement window-local bindings. We
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1738 don't know of many situations where they would be useful, and it seems
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1739 that indirect buffers (@pxref{Indirect Buffers}) with buffer-local
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1740 bindings offer a way to handle these situations more robustly.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1741
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1742 If sufficient application is found for either of these two kinds of
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1743 local bindings, we will provide it in a subsequent Emacs version.
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
1744
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1745 @node File Local Variables
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1746 @section File Local Variables
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1747
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1748 This section describes the functions and variables that affect
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1749 processing of file local variables. @xref{File variables, ,
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1750 Local Variables in Files, emacs, The GNU Emacs Manual}, for basic
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1751 information about file local variables.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1752
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1753 @defopt enable-local-variables
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1754 This variable controls whether to process file local variables. A
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1755 value of @code{t} means to process them, querying the user if unsafe
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1756 variables are encountered; @code{nil} means ignore them; anything else
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1757 means to query the user for each file. The default value is @code{t}.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1758 @end defopt
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1759
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1760 @defun hack-local-variables &optional mode-only
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1761 This function parses, and binds or evaluates as appropriate, any local
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1762 variables specified by the contents of the current buffer. The variable
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1763 @code{enable-local-variables} has its effect here. However, this
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1764 function does not look for the @samp{mode:} local variable in the
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1765 @w{@samp{-*-}} line. @code{set-auto-mode} does that, also taking
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1766 @code{enable-local-variables} into account (@pxref{Auto Major Mode}).
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1767
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1768 If the optional argument @var{mode-only} is non-@code{nil}, then all
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1769 this function does is return @code{t} if the @w{@samp{-*-}} line or
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1770 the local variables list specifies a mode and @code{nil} otherwise.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1771 It does not set the mode nor any other file local variable.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1772 @end defun
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1773
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1774 If a file local variable could specify a function that would
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1775 be called later, or an expression that would be executed later, simply
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1776 visiting a file could take over your Emacs. Emacs takes several
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1777 measures to prevent this.
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1778
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1779 @cindex safe local variable
68916
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1780 You can specify safe values for a variable with a
68893
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1781 @code{safe-local-variable} property. If the property is @code{t},
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1782 setting that variable in a file is always considered safe, regardless
68916
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1783 of the value used. If the property is a function of one argument,
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1784 then any value is safe if the function returns non-@code{nil} given
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1785 that value. Many commonly encountered file variables standardly have
68893
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1786 @code{safe-local-variable} properties, including @code{fill-column},
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1787 @code{fill-prefix}, and @code{indent-tabs-mode}.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1788
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1789 @defopt safe-local-variable-values
68893
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1790 This variable provides another way to mark some variable values as
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1791 safe. It is a list of cons cells @code{(@var{var} . @var{val})},
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1792 where @var{var} is a variable name and @var{val} is a value which is
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1793 safe for that variable.
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1794
68916
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1795 When Emacs asks the user whether or not to obey a set of file local
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1796 variable specifications, the user can choose to mark them as safe.
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1797 Doing so adds those variable/value pairs to
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1798 @code{safe-local-variable-values}, and saves it to the user's custom
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1799 file.
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1800 @end defopt
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1801
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1802 @defun safe-local-variable-p sym val
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1803 This function returns non-@code{nil} if it is safe to give @var{sym}
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1804 the value @var{val}, based on the above criteria.
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1805 @end defun
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1806
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1807 @cindex risky local variable
68893
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1808 Some variables are considered @dfn{risky}. A variable whose name
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1809 ends in any of @samp{-command}, @samp{-frame-alist}, @samp{-function},
63584
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1810 @samp{-functions}, @samp{-hook}, @samp{-hooks}, @samp{-form},
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1811 @samp{-forms}, @samp{-map}, @samp{-map-alist}, @samp{-mode-alist},
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1812 @samp{-program}, or @samp{-predicate} is considered risky. The
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1813 variables @samp{font-lock-keywords}, @samp{font-lock-keywords}
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1814 followed by a digit, and @samp{font-lock-syntactic-keywords} are also
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1815 considered risky. Finally, any variable whose name has a
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1816 non-@code{nil} @code{risky-local-variable} property is considered
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1817 risky.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1818
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1819 @defun risky-local-variable-p sym
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1820 This function returns non-@code{nil} if @var{sym} is a risky variable,
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1821 based on the above criteria.
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1822 @end defun
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1823
68893
06f938e505d7 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68887
diff changeset
1824 If a variable is risky, it will not be entered automatically into
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1825 @code{safe-local-variable-values} as described above. Therefore,
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1826 Emacs will always query before setting a risky variable, unless the
68916
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1827 user explicitly allows the setting by customizing
485885718688 (File Local Variables): Clarifications.
Richard M. Stallman <rms@gnu.org>
parents: 68893
diff changeset
1828 @code{safe-local-variable-values} directly.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1829
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1830 @defvar ignored-local-variables
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1831 This variable holds a list of variables that should not be given local
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1832 values by files. Any value specified for one of these variables is
68868
68b8fcd1410c * variables.texi (File Local Variables): Document new file local
Chong Yidong <cyd@stupidchicken.com>
parents: 68648
diff changeset
1833 completely ignored.
62367
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1834 @end defvar
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1835
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1836 The @samp{Eval:} ``variable'' is also a potential loophole, so Emacs
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1837 normally asks for confirmation before handling it.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1838
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1839 @defopt enable-local-eval
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1840 This variable controls processing of @samp{Eval:} in @samp{-*-} lines
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1841 or local variables
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1842 lists in files being visited. A value of @code{t} means process them
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1843 unconditionally; @code{nil} means ignore them; anything else means ask
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1844 the user what to do for each file. The default value is @code{maybe}.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1845 @end defopt
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1846
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1847 Text properties are also potential loopholes, since their values
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1848 could include functions to call. So Emacs discards all text
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1849 properties from string values specified for file local variables.
fbbfd824228f Reorder nodes.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62365
diff changeset
1850
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1851 @node Variable Aliases
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1852 @section Variable Aliases
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1853
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1854 It is sometimes useful to make two variables synonyms, so that both
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1855 variables always have the same value, and changing either one also
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1856 changes the other. Whenever you change the name of a
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1857 variable---either because you realize its old name was not well
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1858 chosen, or because its meaning has partly changed---it can be useful
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1859 to keep the old name as an @emph{alias} of the new one for
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1860 compatibility. You can do this with @code{defvaralias}.
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1861
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1862 @defun defvaralias new-alias base-variable &optional docstring
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1863 This function defines the symbol @var{new-alias} as a variable alias
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1864 for symbol @var{base-variable}. This means that retrieving the value of
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1865 @var{new-alias} returns the value of @var{base-variable}, and changing the
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1866 value of @var{new-alias} changes the value of @var{base-variable}.
46391
5d5a55d8897b Document third argument of defvaralias.
Juanma Barranquero <lekktu@gmail.com>
parents: 45276
diff changeset
1867
51916
f7b97d07a39c (Creating Buffer-Local): Add buffer-local-value.
Richard M. Stallman <rms@gnu.org>
parents: 51703
diff changeset
1868 If the @var{docstring} argument is non-@code{nil}, it specifies the
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1869 documentation for @var{new-alias}; otherwise, the alias gets the same
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1870 documentation as @var{base-variable} has, if any, unless
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1871 @var{base-variable} is itself an alias, in which case @var{new-alias} gets
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1872 the documentation of the variable at the end of the chain of aliases.
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1873
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1874 This function returns @var{base-variable}.
46401
0616af8d6d42 Fix reference to `defvaralias' as a macro.
Juanma Barranquero <lekktu@gmail.com>
parents: 46392
diff changeset
1875 @end defun
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1876
62058
7276665dac33 Follow whitespace conventions.
Richard M. Stallman <rms@gnu.org>
parents: 62020
diff changeset
1877 Variable aliases are convenient for replacing an old name for a
61852
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1878 variable with a new name. @code{make-obsolete-variable} declares that
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1879 the old name is obsolete and therefore that it may be removed at some
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1880 stage in the future.
61729
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1881
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1882 @defun make-obsolete-variable obsolete-name current-name &optional when
62020
846493e4a4fa (Variable Aliases): `make-obsolete-variable' is a function and not a macro.
Luc Teirlinck <teirllm@auburn.edu>
parents: 61859
diff changeset
1883 This function makes the byte-compiler warn that the variable
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1884 @var{obsolete-name} is obsolete. If @var{current-name} is a symbol, it is
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1885 the variable's new name; then the warning message says to use
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1886 @var{current-name} instead of @var{obsolete-name}. If @var{current-name}
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1887 is a string, this is the message and there is no replacement variable.
61852
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1888
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1889 If provided, @var{when} should be a string indicating when the
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1890 variable was first made obsolete---for example, a date or a release
48375a96a41a (Variable Aliases): Clarify text.
Richard M. Stallman <rms@gnu.org>
parents: 61729
diff changeset
1891 number.
62020
846493e4a4fa (Variable Aliases): `make-obsolete-variable' is a function and not a macro.
Luc Teirlinck <teirllm@auburn.edu>
parents: 61859
diff changeset
1892 @end defun
61729
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1893
62058
7276665dac33 Follow whitespace conventions.
Richard M. Stallman <rms@gnu.org>
parents: 62020
diff changeset
1894 You can make two variables synonyms and declare one obsolete at the
61729
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1895 same time using the macro @code{define-obsolete-variable-alias}.
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1896
63478
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1897 @defmac define-obsolete-variable-alias obsolete-name current-name &optional when docstring
755286b69925 (Variable Aliases): Update argument names of `defvaralias',
Juanma Barranquero <lekktu@gmail.com>
parents: 62367
diff changeset
1898 This macro marks the variable @var{obsolete-name} as obsolete and also
63584
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1899 makes it an alias for the variable @var{current-name}. It is
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1900 equivalent to the following:
62098
bc3a702b646e (Variable Aliases): Change description of `define-obsolete-variable-alias'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62058
diff changeset
1901
bc3a702b646e (Variable Aliases): Change description of `define-obsolete-variable-alias'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62058
diff changeset
1902 @example
63584
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1903 (defvaralias @var{obsolete-name} @var{current-name} @var{docstring})
5565eb3af021 Fix formatting ugliness.
Richard M. Stallman <rms@gnu.org>
parents: 63478
diff changeset
1904 (make-obsolete-variable @var{obsolete-name} @var{current-name} @var{when})
62098
bc3a702b646e (Variable Aliases): Change description of `define-obsolete-variable-alias'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 62058
diff changeset
1905 @end example
61729
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1906 @end defmac
bd6904d99629 (Variable Aliases): Describe make-obsolete-variable
Nick Roberts <nickrob@snap.net.nz>
parents: 60048
diff changeset
1907
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1908 @defun indirect-variable variable
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1909 This function returns the variable at the end of the chain of aliases
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1910 of @var{variable}. If @var{variable} is not a symbol, or if @var{variable} is
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1911 not defined as an alias, the function returns @var{variable}.
54724
d2c60b264fa8 * variables.texi (Variable Aliases): Mention
Jesper Harder <harder@ifa.au.dk>
parents: 53436
diff changeset
1912
d2c60b264fa8 * variables.texi (Variable Aliases): Mention
Jesper Harder <harder@ifa.au.dk>
parents: 53436
diff changeset
1913 This function signals a @code{cyclic-variable-indirection} error if
d2c60b264fa8 * variables.texi (Variable Aliases): Mention
Jesper Harder <harder@ifa.au.dk>
parents: 53436
diff changeset
1914 there is a loop in the chain of symbols.
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1915 @end defun
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1916
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1917 @example
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1918 (defvaralias 'foo 'bar)
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1919 (indirect-variable 'foo)
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1920 @result{} bar
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1921 (indirect-variable 'bar)
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1922 @result{} bar
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1923 (setq bar 2)
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1924 bar
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1925 @result{} 2
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1926 @group
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1927 foo
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1928 @result{} 2
52994
d0f419e4965f (Defining Variables): Second argument to `defconst' is not optional.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52784
diff changeset
1929 @end group
39571
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1930 (setq foo 0)
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1931 bar
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1932 @result{} 0
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1933 foo
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1934 @result{} 0
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1935 @end example
9b87a63bcb36 (Variable Aliases): New node.
Gerd Moellmann <gerd@gnu.org>
parents: 39165
diff changeset
1936
53295
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1937 @node Variables with Restricted Values
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1938 @section Variables with Restricted Values
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1939
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1940 Ordinary Lisp variables can be assigned any value that is a valid
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1941 Lisp object. However, certain Lisp variables are not defined in Lisp,
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1942 but in C. Most of these variables are defined in the C code using
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1943 @code{DEFVAR_LISP}. Like variables defined in Lisp, these can take on
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1944 any value. However, some variables are defined using
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1945 @code{DEFVAR_INT} or @code{DEFVAR_BOOL}. @xref{Defining Lisp
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1946 variables in C,, Writing Emacs Primitives}, in particular the
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1947 description of functions of the type @code{syms_of_@var{filename}},
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1948 for a brief discussion of the C implementation.
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1949
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1950 Variables of type @code{DEFVAR_BOOL} can only take on the values
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1951 @code{nil} or @code{t}. Attempting to assign them any other value
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1952 will set them to @code{t}:
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1953
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1954 @example
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1955 (let ((display-hourglass 5))
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1956 display-hourglass)
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1957 @result{} t
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1958 @end example
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1959
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1960 @defvar byte-boolean-vars
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1961 This variable holds a list of all variables of type @code{DEFVAR_BOOL}.
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1962 @end defvar
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1963
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1964 Variables of type @code{DEFVAR_INT} can only take on integer values.
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1965 Attempting to assign them any other value will result in an error:
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1966
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1967 @example
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1968 (setq window-min-height 5.0)
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1969 @error{} Wrong type argument: integerp, 5.0
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1970 @end example
9cffa5a5d3eb (Variables with Restricted Values): New node.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52994
diff changeset
1971
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52150
diff changeset
1972 @ignore
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52150
diff changeset
1973 arch-tag: 5ff62c44-2b51-47bb-99d4-fea5aeec5d3e
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52150
diff changeset
1974 @end ignore