annotate man/lispref/tips.texi @ 4407:4ee73bbe4f8e

Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings. 2007-12-26 Aidan Kehoe <kehoea@parhasard.net> * casetab.c: Extend and correct some case table documentation. * search.c (search_buffer): Correct a bug where only the first entry for a character in the case equivalence table was examined in determining if the Boyer-Moore search algorithm is appropriate. If there are case mappings outside of the charset and row of the characters specified in the search string, those case mappings can be safely ignored (and Boyer-Moore search can be used) if we know from the buffer statistics that the corresponding characters cannot occur. * search.c (boyer_moore): Assert that we haven't been passed a string with varying characters sets or rows within character sets. That's what simple_search is for. In the very rare event that a character in the search string has a canonical case mapping that is not in the same character set and row, don't try to search for the canonical character, search for some other character that is in the the desired character set and row. Assert that the case table isn't corrupt. Do not search for any character case mappings that cannot possibly occur in the buffer, given the buffer metadata about its contents.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 26 Dec 2007 17:30:16 +0100
parents e2e5b8d4abd5
children 99f8ebc082d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/tips.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Tips, Building XEmacs and Object Allocation, MULE, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @appendix Tips and Standards
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 @cindex tips
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 @cindex standards of coding style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 @cindex coding standards
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 This chapter describes no additional features of XEmacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 Instead it gives advice on making effective use of the features described
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 in the previous chapters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 * Style Tips:: Writing clean and robust programs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 * Compilation Tips:: Making compiled code run fast.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 * Documentation Tips:: Writing readable documentation strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 * Comment Tips:: Conventions for writing comments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 * Library Headers:: Standard headers for library packages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 @node Style Tips
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 @section Writing Clean Lisp Programs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 Here are some tips for avoiding common errors in writing Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 intended for widespread use:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 Since all global variables share the same name space, and all functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 share another name space, you should choose a short word to distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 your program from other Lisp programs. Then take care to begin the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 names of all global variables, constants, and functions with the chosen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 prefix. This helps avoid name conflicts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 This recommendation applies even to names for traditional Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 primitives that are not primitives in XEmacs Lisp---even to @code{cadr}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 Believe it or not, there is more than one plausible way to define
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 @code{cadr}. Play it safe; append your name prefix to produce a name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 like @code{foo-cadr} or @code{mylib-cadr} instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 If you write a function that you think ought to be added to Emacs under
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 a certain name, such as @code{twiddle-files}, don't call it by that name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 in your program. Call it @code{mylib-twiddle-files} in your program,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 and send mail to @samp{bug-gnu-emacs@@prep.ai.mit.edu} suggesting we add
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 it to Emacs. If and when we do, we can change the name easily enough.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 If one prefix is insufficient, your package may use two or three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 alternative common prefixes, so long as they make sense.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 Separate the prefix from the rest of the symbol name with a hyphen,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 @samp{-}. This will be consistent with XEmacs itself and with most Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Lisp programs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 It is often useful to put a call to @code{provide} in each separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 library program, at least if there is more than one entry point to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 If a file requires certain other library programs to be loaded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 beforehand, then the comments at the beginning of the file should say
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 so. Also, use @code{require} to make sure they are loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 If one file @var{foo} uses a macro defined in another file @var{bar},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 @var{foo} should contain this expression before the first use of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 macro:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (eval-when-compile (require '@var{bar}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (And @var{bar} should contain @code{(provide '@var{bar})}, to make the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 @code{require} work.) This will cause @var{bar} to be loaded when you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 byte-compile @var{foo}. Otherwise, you risk compiling @var{foo} without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 the necessary macro loaded, and that would produce compiled code that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 won't work right. @xref{Compiling Macros}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 Using @code{eval-when-compile} avoids loading @var{bar} when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 the compiled version of @var{foo} is @emph{used}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 If you define a major mode, make sure to run a hook variable using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 @code{run-hooks}, just as the existing major modes do. @xref{Hooks}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 If the purpose of a function is to tell you whether a certain condition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 is true or false, give the function a name that ends in @samp{p}. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 the name is one word, add just @samp{p}; if the name is multiple words,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 add @samp{-p}. Examples are @code{framep} and @code{frame-live-p}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 If a user option variable records a true-or-false condition, give it a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 name that ends in @samp{-flag}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 Please do not define @kbd{C-c @var{letter}} as a key in your major
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 modes. These sequences are reserved for users; they are the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 @strong{only} sequences reserved for users, so we cannot do without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 Instead, define sequences consisting of @kbd{C-c} followed by a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 non-letter. These sequences are reserved for major modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 Changing all the major modes in Emacs 18 so they would follow this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 convention was a lot of work. Abandoning this convention would make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 that work go to waste, and inconvenience users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 Sequences consisting of @kbd{C-c} followed by @kbd{@{}, @kbd{@}},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 @kbd{<}, @kbd{>}, @kbd{:} or @kbd{;} are also reserved for major modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 Sequences consisting of @kbd{C-c} followed by any other punctuation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 character are allocated for minor modes. Using them in a major mode is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 not absolutely prohibited, but if you do that, the major mode binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 may be shadowed from time to time by minor modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 You should not bind @kbd{C-h} following any prefix character (including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 @kbd{C-c}). If you don't bind @kbd{C-h}, it is automatically available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 as a help character for listing the subcommands of the prefix character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 You should not bind a key sequence ending in @key{ESC} except following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 another @key{ESC}. (That is, it is ok to bind a sequence ending in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 @kbd{@key{ESC} @key{ESC}}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 The reason for this rule is that a non-prefix binding for @key{ESC} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 any context prevents recognition of escape sequences as function keys in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 that context.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 Applications should not bind mouse events based on button 1 with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 shift key held down. These events include @kbd{S-mouse-1},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 @kbd{M-S-mouse-1}, @kbd{C-S-mouse-1}, and so on. They are reserved for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 Modes should redefine @kbd{mouse-2} as a command to follow some sort of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 reference in the text of a buffer, if users usually would not want to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 alter the text in that buffer by hand. Modes such as Dired, Info,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 Compilation, and Occur redefine it in this way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 When a package provides a modification of ordinary Emacs behavior, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 good to include a command to enable and disable the feature, Provide a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 command named @code{@var{whatever}-mode} which turns the feature on or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 off, and make it autoload (@pxref{Autoload}). Design the package so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 that simply loading it has no visible effect---that should not enable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 the feature. Users will request the feature by invoking the command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 It is a bad idea to define aliases for the Emacs primitives. Use the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 standard names instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 Redefining an Emacs primitive is an even worse idea.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
163 It may do the right thing for a particular program, but
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 there is no telling what other programs might break as a result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 If a file does replace any of the functions or library programs of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 standard XEmacs, prominent comments at the beginning of the file should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 say which functions are replaced, and how the behavior of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 replacements differs from that of the originals.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 Please keep the names of your XEmacs Lisp source files to 13 characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 or less. This way, if the files are compiled, the compiled files' names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 will be 14 characters or less, which is short enough to fit on all kinds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 of Unix systems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 Don't use @code{next-line} or @code{previous-line} in programs; nearly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 always, @code{forward-line} is more convenient as well as more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 predictable and robust. @xref{Text Lines}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 Don't call functions that set the mark, unless setting the mark is one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 of the intended features of your program. The mark is a user-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 feature, so it is incorrect to change the mark except to supply a value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 for the user's benefit. @xref{The Mark}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 In particular, don't use these functions:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 @code{beginning-of-buffer}, @code{end-of-buffer}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 @code{replace-string}, @code{replace-regexp}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 If you just want to move point, or replace a certain string, without any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 of the other features intended for interactive users, you can replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 these functions with one or two lines of simple Lisp code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 Use lists rather than vectors, except when there is a particular reason
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 to use a vector. Lisp has more facilities for manipulating lists than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 for vectors, and working with lists is usually more convenient.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 Vectors are advantageous for tables that are substantial in size and are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 accessed in random order (not searched front to back), provided there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 no need to insert or delete elements (only lists allow that).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 The recommended way to print a message in the echo area is with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 the @code{message} function, not @code{princ}. @xref{The Echo Area}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 When you encounter an error condition, call the function @code{error}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (or @code{signal}). The function @code{error} does not return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 @xref{Signaling Errors}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 Do not use @code{message}, @code{throw}, @code{sleep-for},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 or @code{beep} to report errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 An error message should start with a capital letter but should not end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 with a period.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 Try to avoid using recursive edits. Instead, do what the Rmail @kbd{e}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 command does: use a new local keymap that contains one command defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 to switch back to the old local keymap. Or do what the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 @code{edit-options} command does: switch to another buffer and let the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 user switch back at will. @xref{Recursive Editing}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 In some other systems there is a convention of choosing variable names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 that begin and end with @samp{*}. We don't use that convention in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 Lisp, so please don't use it in your programs. (Emacs uses such names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 only for program-generated buffers.) The users will find Emacs more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 coherent if all libraries use the same conventions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 default indentation parameters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 Don't make a habit of putting close-parentheses on lines by themselves;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 Lisp programmers find this disconcerting. Once in a while, when there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 is a sequence of many consecutive close-parentheses, it may make sense
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 to split them in one or two significant places.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 Please put a copyright notice on the file if you give copies to anyone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 Use the same lines that appear at the top of the Lisp files in XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 itself. If you have not signed papers to assign the copyright to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 Foundation, then place your name in the copyright notice in place of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 Foundation's name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 @node Compilation Tips
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 @section Tips for Making Compiled Code Fast
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 @cindex execution speed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 @cindex speedups
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 Here are ways of improving the execution speed of byte-compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 Lisp programs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 @cindex profiling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 @cindex timing programs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 @cindex @file{profile.el}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 Use the @file{profile} library to profile your program. See the file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 @file{profile.el} for instructions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 Use iteration rather than recursion whenever possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 Function calls are slow in XEmacs Lisp even when a compiled function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 is calling another compiled function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 Using the primitive list-searching functions @code{memq}, @code{member},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 @code{assq}, or @code{assoc} is even faster than explicit iteration. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 may be worth rearranging a data structure so that one of these primitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 search functions can be used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 @item
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
287 Certain built-in functions are handled specially in byte-compiled code,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 avoiding the need for an ordinary function call. It is a good idea to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 use these functions rather than alternatives. To see whether a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 is handled specially by the compiler, examine its @code{byte-compile}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 property. If the property is non-@code{nil}, then the function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 handled specially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 For example, the following input will show you that @code{aref} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 compiled specially (@pxref{Array Functions}) while @code{elt} is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 (@pxref{Sequence Functions}):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (get 'aref 'byte-compile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 @result{} byte-compile-two-args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 (get 'elt 'byte-compile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 If calling a small function accounts for a substantial part of your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 program's running time, make the function inline. This eliminates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 the function call overhead. Since making a function inline reduces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 the flexibility of changing the program, don't do it unless it gives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 a noticeable speedup in something slow enough that users care about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 the speed. @xref{Inline Functions}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 @node Documentation Tips
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 @section Tips for Documentation Strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 Here are some tips for the writing of documentation strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 Every command, function, or variable intended for users to know about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 should have a documentation string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 An internal variable or subroutine of a Lisp program might as well have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 a documentation string. In earlier Emacs versions, you could save space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 by using a comment instead of a documentation string, but that is no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 longer the case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 The first line of the documentation string should consist of one or two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 complete sentences that stand on their own as a summary. @kbd{M-x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 apropos} displays just the first line, and if it doesn't stand on its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 own, the result looks bad. In particular, start the first line with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 capital letter and end with a period.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 The documentation string can have additional lines that expand on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 details of how to use the function or variable. The additional lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 should be made up of complete sentences also, but they may be filled if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 that looks good.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 For consistency, phrase the verb in the first sentence of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 documentation string as an infinitive with ``to'' omitted. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 instance, use ``Return the cons of A and B.'' in preference to ``Returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 the cons of A and B@.'' Usually it looks good to do likewise for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 rest of the first paragraph. Subsequent paragraphs usually look better
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 if they have proper subjects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 Write documentation strings in the active voice, not the passive, and in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 the present tense, not the future. For instance, use ``Return a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 containing A and B.'' instead of ``A list containing A and B will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 returned.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 Avoid using the word ``cause'' (or its equivalents) unnecessarily.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 Instead of, ``Cause Emacs to display text in boldface,'' write just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 ``Display text in boldface.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 Do not start or end a documentation string with whitespace.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 Format the documentation string so that it fits in an Emacs window on an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 80-column screen. It is a good idea for most lines to be no wider than
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
372 60 characters. The first line can be wider if necessary to fit the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 information that ought to be there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 However, rather than simply filling the entire documentation string, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 can make it much more readable by choosing line breaks with care.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 Use blank lines between topics if the documentation string is long.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 428
diff changeset
378
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 @strong{Do not} indent subsequent lines of a documentation string so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 that the text is lined up in the source code with the text of the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 line. This looks nice in the source code, but looks bizarre when users
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 view the documentation. Remember that the indentation before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 starting double-quote is not part of the string!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 A variable's documentation string should start with @samp{*} if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 variable is one that users would often want to set interactively. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 the value is a long list, or a function, or if the variable would be set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 only in init files, then don't start the documentation string with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 @samp{*}. @xref{Defining Variables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 The documentation string for a variable that is a yes-or-no flag should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 start with words such as ``Non-nil means@dots{}'', to make it clear that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 all non-@code{nil} values are equivalent and indicate explicitly what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 @code{nil} and non-@code{nil} mean.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 When a function's documentation string mentions the value of an argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 of the function, use the argument name in capital letters as if it were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 a name for that value. Thus, the documentation string of the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 @code{/} refers to its second argument as @samp{DIVISOR}, because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 actual argument name is @code{divisor}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 Also use all caps for meta-syntactic variables, such as when you show
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 the decomposition of a list or vector into subunits, some of which may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 vary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 When a documentation string refers to a Lisp symbol, write it as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 would be printed (which usually means in lower case), with single-quotes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 around it. For example: @samp{`lambda'}. There are two exceptions:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 write @code{t} and @code{nil} without single-quotes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 When a documentation string refers to a Lisp symbol, write it as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 would be printed (which usually means in lower case), with single-quotes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 around it. For example: @samp{lambda}. There are two exceptions: write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 t and nil without single-quotes. (In this manual, we normally do use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 single-quotes for those symbols.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 Don't write key sequences directly in documentation strings. Instead,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 use the @samp{\\[@dots{}]} construct to stand for them. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 instead of writing @samp{C-f}, write @samp{\\[forward-char]}. When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 Emacs displays the documentation string, it substitutes whatever key is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 currently bound to @code{forward-char}. (This is normally @samp{C-f},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 but it may be some other character if the user has moved key bindings.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 @xref{Keys in Documentation}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 In documentation strings for a major mode, you will want to refer to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 key bindings of that mode's local map, rather than global ones.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 Therefore, use the construct @samp{\\<@dots{}>} once in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 documentation string to specify which key map to use. Do this before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 the first use of @samp{\\[@dots{}]}. The text inside the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 @samp{\\<@dots{}>} should be the name of the variable containing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 local keymap for the major mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 It is not practical to use @samp{\\[@dots{}]} very many times, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 display of the documentation string will become slow. So use this to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 describe the most important commands in your major mode, and then use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 @samp{\\@{@dots{}@}} to display the rest of the mode's keymap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 @node Comment Tips
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 @section Tips on Writing Comments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 We recommend these conventions for where to put comments and how to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 indent them:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 @table @samp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 @item ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 Comments that start with a single semicolon, @samp{;}, should all be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 aligned to the same column on the right of the source code. Such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 comments usually explain how the code on the same line does its job. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 Lisp mode and related modes, the @kbd{M-;} (@code{indent-for-comment})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 command automatically inserts such a @samp{;} in the right place, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 aligns such a comment if it is already present.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 This and following examples are taken from the Emacs sources.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (setq base-version-list ; there was a base
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (assoc (substring fn 0 start-vn) ; version to which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 file-version-assoc-list)) ; this looks like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 ; a subversion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 @item ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 Comments that start with two semicolons, @samp{;;}, should be aligned to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 the same level of indentation as the code. Such comments usually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 describe the purpose of the following lines or the state of the program
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 at that point. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (prog1 (setq auto-fill-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 ;; update modeline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (redraw-modeline)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
1755
e2e5b8d4abd5 [xemacs-hg @ 2003-10-16 04:10:20 by stephent]
stephent
parents: 446
diff changeset
491 Every function that has no documentation string (because it is used only
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 internally within the package it belongs to), should have instead a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 two-semicolon comment right before the function, explaining what the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 function does and how to call it properly. Explain precisely what each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 argument means and how the function interprets its possible values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 @item ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 Comments that start with three semicolons, @samp{;;;}, should start at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 the left margin. Such comments are used outside function definitions to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 make general statements explaining the design principles of the program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 ;;; This Lisp code is run in XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 ;;; when it is to operate as a server
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 ;;; for other processes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 Another use for triple-semicolon comments is for commenting out lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 within a function. We use triple-semicolons for this precisely so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 they remain at the left margin.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (defun foo (a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 ;;; This is no longer necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 ;;; (force-mode-line-update)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (message "Finished with %s" a))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 @item ;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 Comments that start with four semicolons, @samp{;;;;}, should be aligned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 to the left margin and are used for headings of major sections of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 program. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 ;;;; The kill ring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 The indentation commands of the Lisp modes in XEmacs, such as @kbd{M-;}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (@code{indent-for-comment}) and @key{TAB} (@code{lisp-indent-line})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 automatically indent comments according to these conventions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 depending on the number of semicolons. @xref{Comments,,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
537 Manipulating Comments, xemacs, The XEmacs User's Manual}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 @node Library Headers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 @section Conventional Headers for XEmacs Libraries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 @cindex header comments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 @cindex library header comments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 XEmacs has conventions for using special comments in Lisp libraries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 to divide them into sections and give information such as who wrote
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 them. This section explains these conventions. First, an example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 ;; Copyright (C) 1992 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 ;; Author: Eric S. Raymond <esr@@snark.thyrsus.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 ;; Maintainer: Eric S. Raymond <esr@@snark.thyrsus.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 ;; Created: 14 Jul 1992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 ;; Version: 1.2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 ;; Keywords: docs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 @var{copying permissions}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 The very first line should have this format:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 ;;; @var{filename} --- @var{description}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 The description should be complete in one line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 After the copyright notice come several @dfn{header comment} lines,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 each beginning with @samp{;; @var{header-name}:}. Here is a table of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 the conventional possibilities for @var{header-name}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 @table @samp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 @item Author
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 This line states the name and net address of at least the principal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 author of the library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 If there are multiple authors, you can list them on continuation lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 led by @code{;;} and a tab character, like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 @group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 ;; Author: Ashwin Ram <Ram-Ashwin@@cs.yale.edu>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 ;; Dave Sill <de5@@ornl.gov>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 ;; Dave Brennan <brennan@@hal.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 ;; Eric Raymond <esr@@snark.thyrsus.com>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 @end group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 @item Maintainer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 This line should contain a single name/address as in the Author line, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 an address only, or the string @samp{FSF}. If there is no maintainer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 line, the person(s) in the Author field are presumed to be the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 maintainers. The example above is mildly bogus because the maintainer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 line is redundant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 The idea behind the @samp{Author} and @samp{Maintainer} lines is to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 possible a Lisp function to ``send mail to the maintainer'' without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 having to mine the name out by hand.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 Be sure to surround the network address with @samp{<@dots{}>} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 you include the person's full name as well as the network address.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 @item Created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 This optional line gives the original creation date of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 file. For historical interest only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 @item Version
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 If you wish to record version numbers for the individual Lisp program, put
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 them in this line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 @item Adapted-By
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 In this header line, place the name of the person who adapted the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 library for installation (to make it fit the style conventions, for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 example).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 @item Keywords
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 This line lists keywords for the @code{finder-by-keyword} help command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 This field is important; it's how people will find your package when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 they're looking for things by topic area. To separate the keywords, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 can use spaces, commas, or both.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 Just about every Lisp library ought to have the @samp{Author} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 @samp{Keywords} header comment lines. Use the others if they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 appropriate. You can also put in header lines with other header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 names---they have no standard meanings, so they can't do any harm.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 We use additional stylized comments to subdivide the contents of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 library file. Here is a table of them:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 @table @samp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 @item ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 This begins introductory comments that explain how the library works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 It should come right after the copying permissions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 @item ;;; Change log:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 This begins change log information stored in the library file (if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 store the change history there). For most of the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 files distributed with XEmacs, the change history is kept in the file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 @file{ChangeLog} and not in the source file at all; these files do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 not have a @samp{;;; Change log:} line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 @item ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 This begins the actual code of the program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 @item ;;; @var{filename} ends here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 This is the @dfn{footer line}; it appears at the very end of the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 Its purpose is to enable people to detect truncated versions of the file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 from the lack of a footer line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 @end table