]> code.delx.au - gnu-emacs/blobdiff - lispref/tips.texi
*** empty log message ***
[gnu-emacs] / lispref / tips.texi
index ec53dc420dd094cda3d0580679cbe3c6218ac243..07689b4c9a402a6a7d541bca75086c269087dcd3 100644 (file)
@@ -1,7 +1,7 @@
 @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, 2002, 2003,
+@c   2004, 2005, 2006 Free Software Foundation, Inc.
 @c See the file elisp.texi for copying conditions.
 @setfilename ../info/tips
 @node Tips, GNU Emacs Internals, GPL, Top
@@ -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.
@@ -36,6 +39,16 @@ all.
 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
@@ -43,10 +56,12 @@ 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
 variables, constants, and functions in your program with the chosen
-prefix.  This helps avoid name conflicts.
+prefix.  This helps avoid name conflicts.  (Occasionally, for a command
+name intended for users to use, it is cleaner if some words come
+before the package name prefix.)
 
 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 +73,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 +81,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.
 
@@ -101,11 +114,7 @@ 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
+time, with @code{(eval-when-compile (require 'cl))}.
 
 @item
 When defining a major mode, please follow the major mode
@@ -131,18 +140,140 @@ 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
+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 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 when 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{defcustom}.
+
+@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
+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
+
+@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 +288,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 +314,15 @@ 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
 
-@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 +341,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 +360,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 +375,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 +438,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 +456,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,6 +501,46 @@ 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
+
+@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
 
@@ -538,7 +597,7 @@ 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
+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
@@ -581,11 +640,10 @@ 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}.
+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
@@ -707,13 +765,22 @@ documentation will be shown, even if the symbol is also defined as a
 variable or as a function.
 
 To make a hyperlink to Info documentation, write the name of the Info
-node in single quotes, preceded by @samp{info node} or @samp{Info
-node}.  The Info file name defaults to @samp{emacs}.  For example,
+node (or anchor) in single quotes, preceded by @samp{info node},
+@samp{Info node}, @samp{info anchor} or @samp{Info anchor}.  The Info
+file name defaults to @samp{emacs}.  For example,
 
 @smallexample
 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,
@@ -801,19 +868,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
@@ -870,8 +948,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