]> code.delx.au - gnu-emacs/blobdiff - lispref/tips.texi
(Accepting Output): accept-process-output
[gnu-emacs] / lispref / tips.texi
index 585ec8ee4752f74e35878479798c22ffa67eaacc..254e1faf7fffcc61fd655f36ed183b06ab71a2f6 100644 (file)
@@ -1,12 +1,12 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1995, 1998, 1999
-@c   Free Software Foundation, Inc.
+@c Copyright (C) 1990, 1991, 1992, 1993, 1995, 1998, 1999, 2001, 2002,
+@c   2003, 2004, 2005, 2006, 2007  Free Software Foundation, Inc.
 @c See the file elisp.texi for copying conditions.
 @setfilename ../info/tips
 @node Tips, GNU Emacs Internals, GPL, Top
 @appendix Tips and Conventions
-@cindex tips
+@cindex tips for writing Lisp
 @cindex standards of coding style
 @cindex coding standards
 
@@ -23,7 +23,10 @@ all.
 
 @menu
 * Coding Conventions::        Conventions for clean and robust programs.
+* Key Binding Conventions::   Which keys should be bound by which programs.
+* Programming Tips::          Making Emacs code fit smoothly in Emacs.
 * Compilation Tips::          Making compiled code run fast.
+* Warning Tips::              Turning off compiler warnings.
 * Documentation Tips::        Writing readable documentation strings.
 * Comment Tips::             Conventions for writing comments.
 * Library Headers::           Standard headers for library packages.
@@ -32,21 +35,38 @@ all.
 @node Coding Conventions
 @section Emacs Lisp Coding Conventions
 
+@cindex coding conventions in Emacs Lisp
   Here are conventions that you should follow when writing Emacs Lisp
 code intended for widespread use:
 
 @itemize @bullet
+@item
+Simply loading the package should not change Emacs's editing behavior.
+Include a command or commands to enable and disable the feature,
+or to invoke it.
+
+This convention is mandatory for any file that includes custom
+definitions.  If fixing such a file to follow this convention requires
+an incompatible change, go ahead and make the incompatible change;
+don't postpone it.
+
 @item
 Since all global variables share the same name space, and all
 functions share another name space, you should choose a short word to
-distinguish your program from other Lisp programs.@footnote{The
+distinguish your program from other Lisp programs@footnote{The
 benefits of a Common Lisp-style package system are considered not to
-outweigh the costs.}  Then take care to begin the names of all global
+outweigh the costs.}.  Then take care to begin the names of all global
 variables, constants, and functions in your program with the chosen
 prefix.  This helps avoid name conflicts.
 
+Occasionally, for a command name intended for users to use, it is more
+convenient if some words come before the package's name prefix.  And
+constructs that define functions, variables, etc., work better if they
+start with @samp{defun} or @samp{defvar}, so put the name prefix later
+on in the name.
+
 This recommendation applies even to names for traditional Lisp
-primitives that are not primitives in Emacs Lisp---even to
+primitives that are not primitives in Emacs Lisp---such as
 @code{copy-list}.  Believe it or not, there is more than one plausible
 way to define @code{copy-list}.  Play it safe; append your name prefix
 to produce a name like @code{foo-copy-list} or @code{mylib-copy-list}
@@ -58,7 +78,7 @@ in your program.  Call it @code{mylib-twiddle-files} in your program,
 and send mail to @samp{bug-gnu-emacs@@gnu.org} suggesting we add
 it to Emacs.  If and when we do, we can change the name easily enough.
 
-If one prefix is insufficient, your package may use two or three
+If one prefix is insufficient, your package can use two or three
 alternative common prefixes, so long as they make sense.
 
 Separate the prefix from the rest of the symbol name with a hyphen,
@@ -66,12 +86,10 @@ Separate the prefix from the rest of the symbol name with a hyphen,
 Lisp programs.
 
 @item
-It is often useful to put a call to @code{provide} in each separate
-library program, at least if there is more than one entry point to the
-program.
+Put a call to @code{provide} at the end of each separate Lisp file.
 
 @item
-If a file requires certain other library programs to be loaded
+If a file requires certain other Lisp programs to be loaded
 beforehand, then the comments at the beginning of the file should say
 so.  Also, use @code{require} to make sure they are loaded.
 
@@ -100,12 +118,10 @@ run time.  Use of this package is optional, and it is not part of the
 standard Emacs namespace.  If your package loads @code{cl} at run time,
 that could cause name clashes for users who don't use that package.
 
-However, there is no problem with using the @code{cl} package at compile
-time, for the sake of macros.  You do that like this:
-
-@example
-(eval-when-compile (require 'cl))
-@end example
+However, there is no problem with using the @code{cl} package at
+compile time, with @code{(eval-when-compile (require 'cl))}.  That's
+sufficient for using the macros in the @code{cl} package, because the
+compiler expands them before generating the byte-code.
 
 @item
 When defining a major mode, please follow the major mode
@@ -131,18 +147,190 @@ name that ends in @samp{-function}.  If the purpose of a variable is
 to store a list of functions (i.e., the variable is a hook), please
 follow the naming conventions for hooks.  @xref{Hooks}.
 
+@item
+@cindex unloading packages, preparing for
+If loading the file adds functions to hooks, define a function
+@code{@var{feature}-unload-hook}, where @var{feature} is the name of
+the feature the package provides, and make it undo any such changes.
+Using @code{unload-feature} to unload the file will run this function.
+@xref{Unloading}.
+
+@item
+It is a bad idea to define aliases for the Emacs primitives.  Normally
+you should use the standard names instead.  The case where an alias
+may be useful is where it facilitates backwards compatibility or
+portability.
+
+@item
+If a package needs to define an alias or a new function for
+compatibility with some other version of Emacs, name it with the package
+prefix, not with the raw name with which it occurs in the other version.
+Here is an example from Gnus, which provides many examples of such
+compatibility issues.
+
+@example
+(defalias 'gnus-point-at-bol
+  (if (fboundp 'point-at-bol)
+      'point-at-bol
+    'line-beginning-position))
+@end example
+
+@item
+Redefining (or advising) an Emacs primitive is a bad idea.  It may do
+the right thing for a particular program, but there is no telling what
+other programs might break as a result.  In any case, it is a problem
+for debugging, because the advised function doesn't do what its source
+code says it does.  If the programmer investigating the problem is
+unaware that there is advice on the function, the experience can be
+very frustrating.
+
+We hope to remove all the places in Emacs that advise primitives.
+In the mean time, please don't add any more.
+
+@item
+It is likewise a bad idea for one Lisp package to advise a function
+in another Lisp package.
+
+@item
+Likewise, avoid using @code{eval-after-load} (@pxref{Hooks for
+Loading}) in libraries and packages.  This feature is meant for
+personal customizations; using it in a Lisp program is unclean,
+because it modifies the behavior of another Lisp file in a way that's
+not visible in that file.  This is an obstacle for debugging, much
+like advising a function in the other package.
+
+@item
+If a file does replace any of the functions or library programs of
+standard Emacs, prominent comments at the beginning of the file should
+say which functions are replaced, and how the behavior of the
+replacements differs from that of the originals.
+
+@item
+Constructs that define a function or variable should be macros,
+not functions, and their names should start with @samp{def}.
+
+@item
+A macro that defines a function or variable should have a name that
+starts with @samp{define-}.  The macro should receive the name to be
+defined as the first argument.  That will help various tools find the
+definition automatically.  Avoid constructing the names in the macro
+itself, since that would confuse these tools.
+
+@item
+Please keep the names of your Emacs Lisp source files to 13 characters
+or less.  This way, if the files are compiled, the compiled files' names
+will be 14 characters or less, which is short enough to fit on all kinds
+of Unix systems.
+
+@item
+In some other systems there is a convention of choosing variable names
+that begin and end with @samp{*}.  We don't use that convention in Emacs
+Lisp, so please don't use it in your programs.  (Emacs uses such names
+only for special-purpose buffers.)  The users will find Emacs more
+coherent if all libraries use the same conventions.
+
+@item
+If your program contains non-ASCII characters in string or character
+constants, you should make sure Emacs always decodes these characters
+the same way, regardless of the user's settings.  There are two ways
+to do that:
+
+@itemize -
+@item
+Use coding system @code{emacs-mule}, and specify that for
+@code{coding} in the @samp{-*-} line or the local variables list.
+
+@example
+;; XXX.el  -*- coding: emacs-mule; -*-
+@end example
+
+@item
+Use one of the coding systems based on ISO 2022 (such as
+iso-8859-@var{n} and iso-2022-7bit), and specify it with @samp{!} at
+the end for @code{coding}.  (The @samp{!} turns off any possible
+character translation.)
+
+@example
+;; XXX.el -*- coding: iso-latin-2!; -*-
+@end example
+@end itemize
+
+@item
+Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the
+default indentation parameters.
+
+@item
+Don't make a habit of putting close-parentheses on lines by themselves;
+Lisp programmers find this disconcerting.  Once in a while, when there
+is a sequence of many consecutive close-parentheses, it may make sense
+to split the sequence in one or two significant places.
+
+@item
+Please put a copyright notice and copying permission notice on the
+file if you distribute copies.  Use a notice like this one:
+
+@smallexample
+;; Copyright (C) @var{year} @var{name}
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301 USA
+@end smallexample
+
+If you have signed papers to assign the copyright to the Foundation,
+then use @samp{Free Software Foundation, Inc.} as @var{name}.
+Otherwise, use your name.  See also @xref{Library Headers}.
+@end itemize
+
+@node Key Binding Conventions
+@section Key Binding Conventions
+@cindex key binding, conventions for
+
+@itemize @bullet
+@item
+@cindex mouse-2
+@cindex references, following
+Special major modes used for read-only text should usually redefine
+@kbd{mouse-2} and @key{RET} to trace some sort of reference in the text.
+Modes such as Dired, Info, Compilation, and Occur redefine it in this
+way.
+
+In addition, they should mark the text as a kind of ``link'' so that
+@kbd{mouse-1} will follow it also.  @xref{Links and Mouse-1}.
+
 @item
 @cindex reserved keys
 @cindex keys, reserved
-Please do not define @kbd{C-c @var{letter}} as a key in your major
-modes.  Sequences consisting of @kbd{C-c} and a letter (either upper
-or lower case) are reserved for users; they are the @strong{only}
-sequences reserved for users, so do not block them.
+Please do not define @kbd{C-c @var{letter}} as a key in Lisp programs.
+Sequences consisting of @kbd{C-c} and a letter (either upper or lower
+case) are reserved for users; they are the @strong{only} sequences
+reserved for users, so do not block them.
 
 Changing all the Emacs major modes to respect this convention was a
 lot of work; abandoning this convention would make that work go to
 waste, and inconvenience users.  Please comply with it.
 
+@item
+Function keys @key{F5} through @key{F9} without modifier keys are
+also reserved for users to define.
+
+@item
+Applications should not bind mouse events based on button 1 with the
+shift key held down.  These events include @kbd{S-mouse-1},
+@kbd{M-S-mouse-1}, @kbd{C-S-mouse-1}, and so on.  They are reserved for
+users.
+
 @item
 Sequences consisting of @kbd{C-c} followed by a control character or a
 digit are reserved for major modes.
@@ -157,10 +345,6 @@ character are allocated for minor modes.  Using them in a major mode is
 not absolutely prohibited, but if you do that, the major mode binding
 may be shadowed from time to time by minor modes.
 
-@item
-Function keys @key{F5} through @key{F9} without modifier keys are
-reserved for users to define.
-
 @item
 Do not bind @kbd{C-h} following any prefix character (including
 @kbd{C-c}).  If you don't bind @kbd{C-h}, it is automatically available
@@ -187,81 +371,16 @@ is potentially meaningful, then you must not define @kbd{@key{ESC}
 after @key{ESC}.  In these states, you should define @kbd{@key{ESC}
 @key{ESC} @key{ESC}} as the way to escape.  Otherwise, define
 @kbd{@key{ESC} @key{ESC}} instead.
+@end itemize
 
-@item
-Applications should not bind mouse events based on button 1 with the
-shift key held down.  These events include @kbd{S-mouse-1},
-@kbd{M-S-mouse-1}, @kbd{C-S-mouse-1}, and so on.  They are reserved for
-users.
-
-@item
-@cindex mouse-2
-@cindex references, following
-Special major modes used for read-only text should usually redefine
-@kbd{mouse-2} and @key{RET} to trace some sort of reference in the text.
-Modes such as Dired, Info, Compilation, and Occur redefine it in this
-way.
-
-@item
-When a package provides a modification of ordinary Emacs behavior, it is
-good to include a command to enable and disable the feature, provide a
-command named @code{@var{whatever}-mode} which turns the feature on or
-off, and make it autoload (@pxref{Autoload}).  Design the package so
-that simply loading it has no visible effect---that should not enable
-the feature.@footnote{Consider that the package may be loaded
-arbitrarily by Custom for instance.}  Users will request the feature by
-invoking the command.  It is a good idea to define this command
-as a minor mode.
-
-@cindex unloading packages
-If loading the file adds functions to hooks, define a function
-@code{@var{feature}-unload-hook}, where @var{feature} is the name of
-the feature the package provides, and make it undo any such changes.
-Using @code{unload-feature} to unload the file will run this function.
-@xref{Unloading}.
-
-@item
-It is a bad idea to define aliases for the Emacs primitives.  Use the
-standard names instead.
-
-@item
-If a package needs to define an alias or a new function for
-compatibility with some other version of Emacs, name it with the package
-prefix, not with the raw name with which it occurs in the other version.
-Here is an example from Gnus, which provides many examples of such
-compatibility issues.
-
-@example
-(defalias 'gnus-point-at-bol
-  (if (fboundp 'point-at-bol)
-      'point-at-bol
-    'line-beginning-position))
-@end example
-
-@item
-Redefining (or advising) an Emacs primitive is discouraged.  It may do
-the right thing for a particular program, but there is no telling what
-other programs might break as a result.
-
-@item
-If a file does replace any of the functions or library programs of
-standard Emacs, prominent comments at the beginning of the file should
-say which functions are replaced, and how the behavior of the
-replacements differs from that of the originals.
-
-@item
-Avoid using macros that define functions and variables with names that
-are constructed.  It is best for maintenance wen the name of the
-function or variable being defined is given explicitly in the source
-code, as the second element of the list---as it is when you use
-@code{defun}, @code{defalias}, @code{defvar} and @code{defopt}.
+@node Programming Tips
+@section Emacs Programming Tips
+@cindex programming conventions
 
-@item
-Please keep the names of your Emacs Lisp source files to 13 characters
-or less.  This way, if the files are compiled, the compiled files' names
-will be 14 characters or less, which is short enough to fit on all kinds
-of Unix systems.
+  Following these conventions will make your program fit better
+into Emacs when it runs.
 
+@itemize @bullet
 @item
 Don't use @code{next-line} or @code{previous-line} in programs; nearly
 always, @code{forward-line} is more convenient as well as more
@@ -280,11 +399,14 @@ In particular, don't use any of these functions:
 @code{beginning-of-buffer}, @code{end-of-buffer}
 @item
 @code{replace-string}, @code{replace-regexp}
+@item
+@code{insert-file}, @code{insert-buffer}
 @end itemize
 
-If you just want to move point, or replace a certain string, without any
-of the other features intended for interactive users, you can replace
-these functions with one or two lines of simple Lisp code.
+If you just want to move point, or replace a certain string, or insert
+a file or buffer's contents, without any of the other features
+intended for interactive users, you can replace these functions with
+one or two lines of simple Lisp code.
 
 @item
 Use lists rather than vectors, except when there is a particular reason
@@ -296,7 +418,7 @@ accessed in random order (not searched front to back), provided there is
 no need to insert or delete elements (only lists allow that).
 
 @item
-The recommended way to print a message in the echo area is with
+The recommended way to show a message in the echo area is with
 the @code{message} function, not @code{princ}.  @xref{The Echo Area}.
 
 @item
@@ -311,6 +433,20 @@ or @code{beep} to report errors.
 An error message should start with a capital letter but should not end
 with a period.
 
+@item
+A question asked in the minibuffer with @code{y-or-n-p} or
+@code{yes-or-no-p} should start with a capital letter and end with
+@samp{? }.
+
+@item
+When you mention a default value in a minibuffer prompt,
+put it and the word @samp{default} inside parentheses.
+It should look like this:
+
+@example
+Enter the answer (default 42):
+@end example
+
 @item
 In @code{interactive}, if you use a Lisp expression to produce a list
 of arguments, don't try to provide the ``correct'' default values for
@@ -360,72 +496,6 @@ command does: use a new local keymap that contains one command defined
 to switch back to the old local keymap.  Or do what the
 @code{edit-options} command does: switch to another buffer and let the
 user switch back at will.  @xref{Recursive Editing}.
-
-@item
-In some other systems there is a convention of choosing variable names
-that begin and end with @samp{*}.  We don't use that convention in Emacs
-Lisp, so please don't use it in your programs.  (Emacs uses such names
-only for special-purpose buffers.)  The users will find Emacs more
-coherent if all libraries use the same conventions.
-
-@item
-Try to avoid compiler warnings about undefined free variables, by adding
-@code{defvar} definitions for these variables.
-
-Sometimes adding a @code{require} for another package is useful to avoid
-compilation warnings for variables and functions defined in that
-package.  If you do this, often it is better if the @code{require} acts
-only at compile time.  Here's how to do that:
-
-@example
-(eval-when-compile
-  (require 'foo)
-  (defvar bar-baz))
-@end example
-
-If you bind a variable in one function, and use it or set it in another
-function, the compiler warns about the latter function unless the
-variable has a definition.  But often these variables have short names,
-and it is not clean for Lisp packages to define such variable names.
-Therefore, you should rename the variable to start with the name prefix
-used for the other functions and variables in your package.
-
-@item
-Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the
-default indentation parameters.
-
-@item
-Don't make a habit of putting close-parentheses on lines by themselves;
-Lisp programmers find this disconcerting.  Once in a while, when there
-is a sequence of many consecutive close-parentheses, it may make sense
-to split the sequence in one or two significant places.
-
-@item
-Please put a copyright notice on the file if you give copies to anyone.
-Use a message like this one:
-
-@smallexample
-;; Copyright (C) @var{year} @var{name}
-
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License as
-;; published by the Free Software Foundation; either version 2 of
-;; the License, or (at your option) any later version.
-
-;; This program is distributed in the hope that it will be
-;; useful, but WITHOUT ANY WARRANTY; without even the implied
-;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-;; PURPOSE.  See the GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public
-;; License along with this program; if not, write to the Free
-;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-;; MA 02111-1307 USA
-@end smallexample
-
-If you have signed papers to assign the copyright to the Foundation,
-then use @samp{Free Software Foundation, Inc.} as @var{name}.
-Otherwise, use your name.
 @end itemize
 
 @node Compilation Tips
@@ -444,6 +514,13 @@ Lisp programs.
 Profile your program with the @file{elp} library.  See the file
 @file{elp.el} for instructions.
 
+@item
+@cindex @file{benchmark.el}
+@cindex benchmarking
+Check the speed of individual Emacs Lisp forms using the
+@file{benchmark} library.  See the functions @code{benchmark-run} and
+@code{benchmark-run-compiled} in @file{benchmark.el}.
+
 @item
 Use iteration rather than recursion whenever possible.
 Function calls are slow in Emacs Lisp even when a compiled function
@@ -482,8 +559,50 @@ a noticeable speedup in something slow enough that users care about
 the speed.  @xref{Inline Functions}.
 @end itemize
 
+@node Warning Tips
+@section Tips for Avoiding Compiler Warnings
+@cindex byte compiler warnings, how to avoid
+
+@itemize @bullet
+@item
+Try to avoid compiler warnings about undefined free variables, by adding
+dummy @code{defvar} definitions for these variables, like this:
+
+@example
+(defvar foo)
+@end example
+
+Such a definition has no effect except to tell the compiler
+not to warn about uses of the variable @code{foo} in this file.
+
+@item
+If you use many functions and variables from a certain file, you can
+add a @code{require} for that package to avoid compilation warnings
+for them.  For instance,
+
+@example
+(eval-when-compile
+  (require 'foo))
+@end example
+
+@item
+If you bind a variable in one function, and use it or set it in
+another function, the compiler warns about the latter function unless
+the variable has a definition.  But adding a definition would be
+unclean if the variable has a short name, since Lisp packages should
+not define short variable names.  The right thing to do is to rename
+this variable to start with the name prefix used for the other
+functions and variables in your package.
+
+@item
+The last resort for avoiding a warning, when you want to do something
+that usually is a mistake but it's not a mistake in this one case,
+is to put a call to @code{with-no-warnings} around it.
+@end itemize
+
 @node Documentation Tips
 @section Tips for Documentation Strings
+@cindex documentation strings, conventions and tips
 
 @findex checkdoc-minor-mode
   Here are some tips and conventions for the writing of documentation
@@ -528,52 +647,6 @@ Don't limit the documentation string to one line; use as many lines as
 you need to explain the details of how to use the function or
 variable.  Please use complete sentences for the rest of the text too.
 
-@item
-The first line should mention all the important arguments of the
-function, and should mention them in the order that they are written
-in a function call.  If the function has many arguments, then it is
-not feasible to mention them all in the first line; in that case, the
-first line should mention the first few arguments, including the most
-important arguments.
-
-@item
-For consistency, phrase the verb in the first sentence of a function's
-documentation string as an imperative--for instance, use ``Return the
-cons of A and B.'' in preference to ``Returns the cons of A and B@.''
-Usually it looks good to do likewise for the rest of the first
-paragraph.  Subsequent paragraphs usually look better if each sentence
-is indicative and has a proper subject.
-
-@item
-Write documentation strings in the active voice, not the passive, and in
-the present tense, not the future.  For instance, use ``Return a list
-containing A and B.'' instead of ``A list containing A and B will be
-returned.''
-
-@item
-Avoid using the word ``cause'' (or its equivalents) unnecessarily.
-Instead of, ``Cause Emacs to display text in boldface,'' write just
-``Display text in boldface.''
-
-@item
-When a command is meaningful only in a certain mode or situation,
-do mention that in the documentation string.  For example,
-the documentation of @code{dired-find-file} is:
-
-@example
-In Dired, visit the file or directory named on this line.
-@end example
-
-@item
-Do not start or end a documentation string with whitespace.
-
-@item
-@strong{Do not} indent subsequent lines of a documentation string so
-that the text is lined up in the source code with the text of the first
-line.  This looks nice in the source code, but looks bizarre when users
-view the documentation.  Remember that the indentation before the
-starting double-quote is not part of the string!
-
 @item
 When the user tries to use a disabled command, Emacs displays just the
 first paragraph of its documentation string---everything through the
@@ -581,24 +654,12 @@ first blank line.  If you wish, you can choose which information to
 include before the first blank line so as to make this display useful.
 
 @item
-A variable's documentation string should start with @samp{*} if the
-variable is one that users would often want to set interactively.  If
-the value is a long list, or a function, or if the variable would be set
-only in init files, then don't start the documentation string with
-@samp{*}.  @xref{Defining Variables}.
-
-@item
-The documentation string for a variable that is a yes-or-no flag should
-start with words such as ``Non-nil means@dots{}'', to make it clear that
-all non-@code{nil} values are equivalent and indicate explicitly what
-@code{nil} and non-@code{nil} mean.
-
-@item
-The documentation string for a function that is a yes-or-no predicate
-should start with words such as ``Return t if @dots{}'', to indicate
-explicitly what constitutes ``truth''.  The word ``return'' avoids
-starting the sentence with lower-case ``t'', which is somewhat
-distracting.
+The first line should mention all the important arguments of the
+function, and should mention them in the order that they are written
+in a function call.  If the function has many arguments, then it is
+not feasible to mention them all in the first line; in that case, the
+first line should mention the first few arguments, including the most
+important arguments.
 
 @item
 When a function's documentation string mentions the value of an argument
@@ -623,7 +684,7 @@ have the form (KEY . VALUE).  Here, KEY is ...
 
 @item
 Never change the case of a Lisp symbol when you mention it in a doc
-string.  If the symbol's name is @code{foo}, write ``foo'', not
+string.  If the symbol's name is @code{foo}, write ``foo,'' not
 ``Foo'' (which is a different symbol).
 
 This might appear to contradict the policy of writing function
@@ -636,16 +697,14 @@ and that annoys you, rewrite the sentence so that the symbol
 is not at the start of it.
 
 @item
-If a line in a documentation string begins with an open-parenthesis,
-write a backslash before the open-parenthesis, like this:
-
-@example
-The argument FOO can be either a number
-\(a buffer position) or a string (a file name).
-@end example
+Do not start or end a documentation string with whitespace.
 
-This prevents the open-parenthesis from being treated as the start of a
-defun (@pxref{Defuns,, Defuns, emacs, The GNU Emacs Manual}).
+@item
+@strong{Do not} indent subsequent lines of a documentation string so
+that the text is lined up in the source code with the text of the first
+line.  This looks nice in the source code, but looks bizarre when users
+view the documentation.  Remember that the indentation before the
+starting double-quote is not part of the string!
 
 @anchor{Docstring hyperlinks}
 @item
@@ -663,6 +722,7 @@ t and nil without single-quotes.  (In this manual, we use a different
 convention, with single-quotes for all symbols.)
 @end ifnottex
 
+@cindex hyperlinks in documentation strings
 Help mode automatically creates a hyperlink when a documentation string
 uses a symbol name inside single quotes, if the symbol has either a
 function or a variable definition.  You do not need to do anything
@@ -683,8 +743,8 @@ then the hyperlink will refer only to the variable documentation of
 
 If a symbol has a function definition and/or a variable definition, but
 those are irrelevant to the use of the symbol that you are documenting,
-you can write the word @samp{symbol} before the symbol name to prevent
-making any hyperlink.  For example,
+you can write the words @samp{symbol} or @samp{program} before the
+symbol name to prevent making any hyperlink.  For example,
 
 @example
 If the argument KIND-OF-RESULT is the symbol `list',
@@ -715,6 +775,14 @@ file name defaults to @samp{emacs}.  For example,
 See Info node `Font Lock' and Info node `(elisp)Font Lock Basics'.
 @end smallexample
 
+Finally, to create a hyperlink to URLs, write the URL in single
+quotes, preceded by @samp{URL}. For example,
+
+@smallexample
+The home page for the GNU project has more information (see URL
+`http://www.gnu.org/').
+@end smallexample
+
 @item
 Don't write key sequences directly in documentation strings.  Instead,
 use the @samp{\\[@dots{}]} construct to stand for them.  For example,
@@ -737,10 +805,70 @@ It is not practical to use @samp{\\[@dots{}]} very many times, because
 display of the documentation string will become slow.  So use this to
 describe the most important commands in your major mode, and then use
 @samp{\\@{@dots{}@}} to display the rest of the mode's keymap.
+
+@item
+For consistency, phrase the verb in the first sentence of a function's
+documentation string as an imperative---for instance, use ``Return the
+cons of A and B.'' in preference to ``Returns the cons of A and B@.''
+Usually it looks good to do likewise for the rest of the first
+paragraph.  Subsequent paragraphs usually look better if each sentence
+is indicative and has a proper subject.
+
+@item
+The documentation string for a function that is a yes-or-no predicate
+should start with words such as ``Return t if,'' to indicate
+explicitly what constitutes ``truth.''  The word ``return'' avoids
+starting the sentence with lower-case ``t,'' which could be somewhat
+distracting.
+
+@item
+If a line in a documentation string begins with an open-parenthesis,
+write a backslash before the open-parenthesis, like this:
+
+@example
+The argument FOO can be either a number
+\(a buffer position) or a string (a file name).
+@end example
+
+This prevents the open-parenthesis from being treated as the start of a
+defun (@pxref{Defuns,, Defuns, emacs, The GNU Emacs Manual}).
+
+@item
+Write documentation strings in the active voice, not the passive, and in
+the present tense, not the future.  For instance, use ``Return a list
+containing A and B.'' instead of ``A list containing A and B will be
+returned.''
+
+@item
+Avoid using the word ``cause'' (or its equivalents) unnecessarily.
+Instead of, ``Cause Emacs to display text in boldface,'' write just
+``Display text in boldface.''
+
+@item
+When a command is meaningful only in a certain mode or situation,
+do mention that in the documentation string.  For example,
+the documentation of @code{dired-find-file} is:
+
+@example
+In Dired, visit the file or directory named on this line.
+@end example
+
+@item
+When you define a variable that users ought to set interactively, you
+normally should use @code{defcustom}.  However, if for some reason you
+use @code{defvar} instead, start the doc string with a @samp{*}.
+@xref{Defining Variables}.
+
+@item
+The documentation string for a variable that is a yes-or-no flag should
+start with words such as ``Non-nil means,'' to make it clear that
+all non-@code{nil} values are equivalent and indicate explicitly what
+@code{nil} and non-@code{nil} mean.
 @end itemize
 
 @node Comment Tips
 @section Tips on Writing Comments
+@cindex comments, Lisp convention for
 
   We recommend these conventions for where to put comments and how to
 indent them:
@@ -802,19 +930,30 @@ Comments that start with three semicolons, @samp{;;;}, should start at
 the left margin.  These are used, occasionally, for comments within
 functions that should start at the margin.  We also use them sometimes
 for comments that are between functions---whether to use two or three
-semicolons there is a matter of style.
+semicolons depends on whether the comment should be considered a
+``heading'' by Outline minor mode.  By default, comments starting with
+at least three semicolons (followed by a single space and a
+non-whitespace character) are considered headings, comments starting
+with two or less are not.
 
 Another use for triple-semicolon comments is for commenting out lines
 within a function.  We use three semicolons for this precisely so that
-they remain at the left margin.
+they remain at the left margin.  By default, Outline minor mode does
+not consider a comment to be a heading (even if it starts with at
+least three semicolons) if the semicolons are followed by at least two
+spaces.  Thus, if you add an introductory comment to the commented out
+code, make sure to indent it by at least two spaces after the three
+semicolons.
 
 @smallexample
 (defun foo (a)
-;;; This is no longer necessary.
+;;;  This is no longer necessary.
 ;;;  (force-mode-line-update)
   (message "Finished with %s" a))
 @end smallexample
 
+When commenting out entire functions, use two semicolons.
+
 @item ;;;;
 Comments that start with four semicolons, @samp{;;;;}, should be aligned
 to the left margin and are used for headings of major sections of a
@@ -871,8 +1010,8 @@ if we haven't installed it in Emacs yet!
 
 ;; This file is part of GNU Emacs.
 @dots{}
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 @end group
 @end smallexample