diff --git a/doc/emacs/windows.texi b/doc/emacs/windows.texi index 4e6e7e399b4..ece53130531 100644 --- a/doc/emacs/windows.texi +++ b/doc/emacs/windows.texi @@ -262,6 +262,8 @@ Delete all windows in the selected frame except the selected window Delete the selected window and kill the buffer that was showing in it (@code{kill-buffer-and-window}). The last character in this key sequence is a zero. +@item M-x delete-windows-on @key{RET} @var{buffer} @key{RET} +Delete windows showing the specified @var{buffer}. @item C-x ^ Make selected window taller (@code{enlarge-window}). @item C-x @} @@ -297,6 +299,11 @@ selected window. whole frame. (This command cannot be used while the minibuffer window is active; attempting to do so signals an error.) + @kbd{M-x delete-windows-on} deletes windows that show a specific +buffer. It prompts for the buffer, defaulting to the current buffer. +With prefix argument of zero, @kbd{C-u 0}, this command deletes +windows only on the current display's frames. + @cindex resize window @cindex resizing windows @kindex C-x ^ diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi index f292a1759fc..519decb1d04 100644 --- a/doc/lispintro/emacs-lisp-intro.texi +++ b/doc/lispintro/emacs-lisp-intro.texi @@ -14825,7 +14825,7 @@ According to its documentation as shown by @kbd{C-h f} (the @code{describe-function} command), the @code{find-file-noselect} function reads the named file into a buffer and returns the buffer. (Its most recent version includes an optional @var{wildcards} argument, -too, as well as another to read a file literally and an other you +too, as well as another to read a file literally and another to suppress warning messages. These optional arguments are irrelevant.) However, the @code{find-file-noselect} function does not select the diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi index 2dbe9c27f2d..260f159851b 100644 --- a/doc/lispref/buffers.texi +++ b/doc/lispref/buffers.texi @@ -935,6 +935,10 @@ This is a normal hook run whenever the buffer list changes. Functions (@pxref{Creating Buffers}), @code{rename-buffer} (@pxref{Buffer Names}), @code{kill-buffer} (@pxref{Killing Buffers}), @code{bury-buffer} (see above) and @code{select-window} (@pxref{Selecting Windows}). + +Functions run by this hook should avoid calling @code{select-window} +with a nil @var{norecord} argument or @code{with-temp-buffer} since +either may lead to infinite recursion. @end defvar @node Creating Buffers diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index 95379b342b3..c4cb83977fc 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -4894,6 +4894,16 @@ and the buffer position where the @code{display} property was found, respectively. Both positions can be different when @code{object} is a string. +Note that @var{condition} will only be evaluated when redisplay +examines the text where this display spec is located, so this feature +is best suited for conditions that are relatively stable, i.e.@: +yield, for each particular buffer position, the same results on every +evaluation. If the results change for the same text location, e.g., +if the result depends on the position of point, then the conditional +specification might not do what you want, because redisplay examines +only those parts of buffer text where it has reasons to assume that +something changed since the last display cycle. + @node Display Margins @subsection Displaying in the Margins @cindex display margins diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index 5c99ea2781c..0e57cf9666f 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -16,7 +16,7 @@ described in @ref{Backups and Auto-Saving}. names. A file name is a string. Most of these functions expand file name arguments using the function @code{expand-file-name}, so that @file{~} is handled correctly, as are relative file names (including -@file{../}). @xref{File Name Expansion}. +@file{../} and the empty string). @xref{File Name Expansion}. In addition, certain @dfn{magic} file names are handled specially. For example, when a remote file name is specified, Emacs accesses the @@ -2402,6 +2402,17 @@ This is for the sake of filesystems that have the concept of a superroot above the root directory @file{/}. On other filesystems, @file{/../} is interpreted exactly the same as @file{/}. +Expanding @file{.} or the empty string returns the default directory: + +@example +@group +(expand-file-name "." "/usr/spool/") + @result{} "/usr/spool" +(expand-file-name "" "/usr/spool/") + @result{} "/usr/spool" +@end group +@end example + Note that @code{expand-file-name} does @emph{not} expand environment variables; only @code{substitute-in-file-name} does that: diff --git a/doc/lispref/keymaps.texi b/doc/lispref/keymaps.texi index cc0386c8fc7..6ad665a9502 100644 --- a/doc/lispref/keymaps.texi +++ b/doc/lispref/keymaps.texi @@ -2502,7 +2502,7 @@ can do it this way: Emacs usually shows a @dfn{menu bar} at the top of each frame. @xref{Menu Bars,,,emacs, The GNU Emacs Manual}. Menu bar items are -subcommands of the fake function key @code{menu-bar}, as defined +subcommands of the fake function key @key{MENU-BAR}, as defined in the active keymaps. To add an item to the menu bar, invent a fake function key of your @@ -2554,9 +2554,10 @@ bar item: @end example @noindent -Here, @code{edit} is the fake function key used by the global map for -the @samp{Edit} menu bar item. The main reason to suppress a global -menu bar item is to regain space for mode-specific items. +Here, @code{edit} is the symbol produced by a fake function key, it is +used by the global map for the @samp{Edit} menu bar item. The main +reason to suppress a global menu bar item is to regain space for +mode-specific items. @defvar menu-bar-final-items Normally the menu bar shows global items followed by items defined by the @@ -2601,7 +2602,7 @@ If the value is @code{grow-only}, the tool bar expands automatically, but does not contract automatically. The tool bar contents are controlled by a menu keymap attached to a -fake function key called @code{tool-bar} (much like the way the menu +fake function key called @key{TOOL-BAR} (much like the way the menu bar is controlled). So you define a tool bar item using @code{define-key}, like this: diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 22592a57b05..3f6bee9821d 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1237,6 +1237,7 @@ the conventions listed above: (modify-syntax-entry ?\\ ". " st) ;; Add 'p' so M-c on 'hello' leads to 'Hello', not 'hello'. (modify-syntax-entry ?' "w p" st) + @dots{} st) "Syntax table used while in `text-mode'.") @end group @@ -1246,6 +1247,7 @@ the conventions listed above: (defvar text-mode-map (let ((map (make-sparse-keymap))) (define-key map "\e\t" 'ispell-complete-word) + @dots{} map) "Keymap for `text-mode'. Many other modes, such as `mail-mode', `outline-mode' and @@ -1289,11 +1291,11 @@ illustrate how these modes are written. @smallexample @group ;; @r{Create mode-specific table variables.} -(defvar lisp-mode-abbrev-table nil) -(define-abbrev-table 'lisp-mode-abbrev-table ()) +(define-abbrev-table 'lisp-mode-abbrev-table () + "Abbrev table for Lisp mode.") (defvar lisp-mode-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) + (let ((table (make-syntax-table lisp--mode-syntax-table))) (modify-syntax-entry ?\[ "_ " table) (modify-syntax-entry ?\] "_ " table) (modify-syntax-entry ?# "' 14" table) @@ -1308,10 +1310,9 @@ each calls the following function to set various variables: @smallexample @group -(defun lisp-mode-variables (&optional syntax keywords-case-insensitive) +(defun lisp-mode-variables (&optional syntax keywords-case-insensitive elisp) (when syntax (set-syntax-table lisp-mode-syntax-table)) - (setq local-abbrev-table lisp-mode-abbrev-table) @dots{} @end group @end smallexample @@ -1322,8 +1323,7 @@ variable to handle Lisp comments: @smallexample @group - (make-local-variable 'comment-start) - (setq comment-start ";") + (setq-local comment-start ";") @dots{} @end group @end smallexample @@ -1337,6 +1337,7 @@ common. The following code sets up the common commands: @group (defvar lisp-mode-shared-map (let ((map (make-sparse-keymap))) + (set-keymap-parent map prog-mode-map) (define-key map "\e\C-q" 'indent-sexp) (define-key map "\177" 'backward-delete-char-untabify) map) @@ -1351,7 +1352,7 @@ And here is the code to set up the keymap for Lisp mode: @group (defvar lisp-mode-map (let ((map (make-sparse-keymap)) - (menu-map (make-sparse-keymap "Lisp"))) + (menu-map (make-sparse-keymap "Lisp"))) (set-keymap-parent map lisp-mode-shared-map) (define-key map "\e\C-x" 'lisp-eval-defun) (define-key map "\C-c\C-z" 'run-lisp) @@ -1375,17 +1376,13 @@ Blank lines separate paragraphs. Semicolons start comments. \\@{lisp-mode-map@} Note that `run-lisp' may be used either to start an inferior Lisp job -or to switch back to an existing one. +or to switch back to an existing one." @end group - @group -Entry to this mode calls the value of `lisp-mode-hook' -if that value is non-nil." (lisp-mode-variables nil t) - (set (make-local-variable 'find-tag-default-function) - 'lisp-find-tag-default) - (set (make-local-variable 'comment-start-skip) - "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") + (setq-local find-tag-default-function 'lisp-find-tag-default) + (setq-local comment-start-skip + "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") (setq imenu-case-fold-search t)) @end group @end smallexample diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi index ae9a8ab6323..11a77bd1479 100644 --- a/doc/lispref/nonascii.texi +++ b/doc/lispref/nonascii.texi @@ -1632,11 +1632,16 @@ coding system for a file based on its undecoded contents. Each function in this list should be written to look at text in the current buffer, but should not modify it in any way. The buffer will -contain undecoded text of parts of the file. Each function should -take one argument, @var{size}, which tells it how many characters to -look at, starting from point. If the function succeeds in determining -a coding system for the file, it should return that coding system. -Otherwise, it should return @code{nil}. +contain the text of parts of the file. Each function should take one +argument, @var{size}, which tells it how many characters to look at, +starting from point. If the function succeeds in determining a coding +system for the file, it should return that coding system. Otherwise, +it should return @code{nil}. + +The functions in this list could be called either when the file is +visited and Emacs wants to decode its contents, and/or when the file's +buffer is about to be saved and Emacs wants to determine how to encode +its contents. If a file has a @samp{coding:} tag, that takes precedence, so these functions won't be called. diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi index 1a77a64e01c..0c77cc0ee61 100644 --- a/doc/misc/cc-mode.texi +++ b/doc/misc/cc-mode.texi @@ -148,7 +148,17 @@ CC Mode @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @comment Define an index for syntactic symbols. +@c Version for Texinfo <= 4.x +@ifclear txicommandconditionals +@ifnottex @c In texi2dvi, the @defindex would create an empty cc-mode.ss + @c For Info, unlike tex, @syncodeindex needs a matching @defindex. @defindex ss +@end ifnottex +@end ifclear +@c Version for Texinfo >= 5.x +@ifset txicommandconditionals +@defindex ss +@end ifset @comment Combine key, syntactic symbol and concept indices into one. @syncodeindex ss cp @@ -2282,6 +2292,8 @@ method, ``Top-level commands or the customization interface''. If you make conflicting settings in several of these ways, the way that takes precedence is the one that appears latest in this list: +@c Version of list for Texinfo <= 4.x +@ifclear txicommandconditionals @itemize @w{} @item @table @asis @@ -2292,6 +2304,18 @@ that takes precedence is the one that appears latest in this list: @itemx File Local Variable setting @end table @end itemize +@end ifclear +@c Version of list for Texinfo >= 5.x +@ifset txicommandconditionals +@itemize @asis +@item Style +@item File Style@footnote{In earlier versions of @ccmode{}, a File Style setting took precedence over any other setting apart from a File Local Variable setting.} +@item Top-level command or ``customization interface'' +@item Hook +@item File Local Variable setting +@end itemize +@end ifset + Here is a summary of the different ways of writing your configuration settings: @@ -2548,7 +2572,7 @@ Basics}). @item The style variable @code{c-offsets-alist} (@pxref{c-offsets-alist}) is an association list with an element for each syntactic symbol. It's -handled a little differently from the other style variables. It's +handled a little differently from the other style variables. Its default global binding is the empty list @code{nil}, rather than @code{set-from-style}. Before the style system is initialized, you can add individual elements to @code{c-offsets-alist} by calling @@ -5286,7 +5310,7 @@ The simplest and most used kind of ``offset'' setting in @defopt c-basic-offset @vindex basic-offset @r{(c-)} This style variable holds the basic offset between indentation levels. -It's factory default is 4, but all the built-in styles set it +Its factory default is 4, but all the built-in styles set it themselves, to some value between 2 (for @code{gnu} style) and 8 (for @code{bsd}, @code{linux}, and @code{python} styles). @end defopt diff --git a/doc/misc/ede.texi b/doc/misc/ede.texi index 6d5c1b93a94..7ab386c97a4 100644 --- a/doc/misc/ede.texi +++ b/doc/misc/ede.texi @@ -1038,7 +1038,7 @@ details on using @eieio{} to extending classes, and writing methods. If you intend to extend @ede{}, it is most likely that a new target type is needed in one of the existing project types. The rest of this chapter -will discuss extending the @code{ede-project} class, and it's targets. +will discuss extending the @code{ede-project} class, and its targets. See @file{project-am.el} for basic details on adding targets to it. For the @code{ede-project} type, the core target class is called @@ -1477,7 +1477,7 @@ Get the inode of the directory project @var{PROJ} is in. @end deffn @deffn Method ede-project-root :AFTER this -If a project knows it's root, return it here. +If a project knows its root, return it here. Allows for one-project-object-for-a-tree type systems. @end deffn @@ -1486,7 +1486,7 @@ Find a subproject of @var{PROJ} that corresponds to @var{DIR}. @end deffn @deffn Method ede-project-root-directory :AFTER this &optional file -If a project knows it's root, return it here. +If a project knows its root, return it here. Allows for one-project-object-for-a-tree type systems. Optional @var{FILE} is the file to test. It is ignored in preference of the anchor file for the project. @@ -2516,7 +2516,7 @@ In sources for @var{THIS}, change version numbers to @var{VERSION}. @end deffn @deffn Method project-delete-target :AFTER ot -Delete the current target @var{OT} from it's parent project. +Delete the current target @var{OT} from its parent project. @end deffn @deffn Method ede-target-sourcecode :AFTER this @@ -2715,7 +2715,7 @@ Converts all symbols into the objects to be used. @end deffn @deffn Method project-delete-target :AFTER this -Delete the current target @var{THIS} from it's parent project. +Delete the current target @var{THIS} from its parent project. @end deffn @deffn Method ede-proj-makefile-target-name :AFTER this @@ -4013,7 +4013,7 @@ Type: @code{list} The commands used to execute this compiler. The object which uses this compiler will place these commands after -it's rule definition. +its rule definition. @item :autoconf Type: @code{list} @* @@ -4125,7 +4125,7 @@ Type: @code{list} The commands used to execute this compiler. The object which uses this compiler will place these commands after -it's rule definition. +its rule definition. @item :objectextention Type: @code{string} @@ -4265,7 +4265,7 @@ Type: @code{list} The commands used to execute this compiler. The object which uses this compiler will place these commands after -it's rule definition. +its rule definition. @item :objectextention Type: @code{string} diff --git a/doc/misc/gnus-faq.texi b/doc/misc/gnus-faq.texi index e8ec5020df2..075f5218414 100644 --- a/doc/misc/gnus-faq.texi +++ b/doc/misc/gnus-faq.texi @@ -284,7 +284,7 @@ what's this? @subsubheading Answer You get the message described in the q/a pair above while -starting Gnus, right? It's an other symptom for the same +starting Gnus, right? It's another symptom for the same problem, so read the answer above. @node FAQ 2-3 diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 272c8356c20..b9c91a02a3a 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -9416,7 +9416,7 @@ function must return @code{mid}, @code{mail}, @code{invalid} or @item gnus-button-mid-or-mail-heuristic @findex gnus-button-mid-or-mail-heuristic Function that guesses whether its argument is a message ID or a mail -address. Returns @code{mid} if it's a message IDs, @code{mail} if +address. Returns @code{mid} if it's a message ID, @code{mail} if it's a mail address, @code{ask} if unsure and @code{invalid} if the string is invalid. diff --git a/lisp/autorevert.el b/lisp/autorevert.el index 150693baf13..bc7c616ecb7 100644 --- a/lisp/autorevert.el +++ b/lisp/autorevert.el @@ -816,7 +816,7 @@ the timer when no buffers need to be checked." (when (and (not global-auto-revert-mode) (null auto-revert-buffer-list)) (if (timerp auto-revert-timer) - (cancel-timer auto-revert-timer)) + (cancel-timer auto-revert-timer)) (setq auto-revert-timer nil))))) diff --git a/lisp/frame.el b/lisp/frame.el index cdb2ac4af11..dd1d5b030f5 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -736,7 +736,9 @@ If DISPLAY is nil, that stands for the selected frame's display." (defun make-frame-command () "Make a new frame, on the same terminal as the selected frame. If the terminal is a text-only terminal, this also selects the -new frame." +new frame. + +When called from Lisp, returns the new frame." (interactive) (if (display-graphic-p) (make-frame) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index baf44cb4830..baa8a244c07 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -7473,7 +7473,7 @@ must return `mid', `mail', `invalid' or `ask'." (2.0 . "^[A-Z][a-z][A-Z][a-z][a-z][^a-z]")) ;; ^[A-Z][a-z]{4,4} "An alist of (RATE . REGEXP) pairs for `gnus-button-mid-or-mail-heuristic'. -A negative RATE indicates a message IDs, whereas a positive indicates a mail +A negative RATE indicates a message ID, whereas a positive indicates a mail address. The REGEXP is processed with `case-fold-search' set to nil." :version "22.1" :group 'gnus-article-buttons @@ -7482,7 +7482,7 @@ address. The REGEXP is processed with `case-fold-search' set to nil." (defun gnus-button-mid-or-mail-heuristic (mid-or-mail) "Guess whether MID-OR-MAIL is a message ID or a mail address. -Returns `mid' if MID-OR-MAIL is a message IDs, `mail' if it's a mail +Returns `mid' if MID-OR-MAIL is a message ID, `mail' if it's a mail address, `ask' if unsure and `invalid' if the string is invalid." (let ((case-fold-search nil) (list gnus-button-mid-or-mail-heuristic-alist) diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el index d490f0ca74c..c491f16dd86 100644 --- a/lisp/gnus/message.el +++ b/lisp/gnus/message.el @@ -1732,7 +1732,7 @@ no, only reply back to the author." :type 'boolean) (defcustom message-user-fqdn nil - "Domain part of Message-Ids." + "Domain part of Message-IDs." :version "22.1" :group 'message-headers :link '(custom-manual "(message)News Headers") diff --git a/lisp/international/mule.el b/lisp/international/mule.el index 5393958013b..281e5297d63 100644 --- a/lisp/international/mule.el +++ b/lisp/international/mule.el @@ -1852,9 +1852,12 @@ or nil." Each function in this list should be written to operate on the current buffer, but should not modify it in any way. The buffer -will contain undecoded text of parts of the file. Each function +will contain the text of parts of the file. Each function should take one argument, SIZE, which says how many characters -\(starting from point) it should look at. +\(starting from point) it should look at. The function might be +called both when the file is visited and Emacs wants to decode +its contents, and when the file's buffer is about to be saved +and Emacs wants to determine how to encode its contents. If one of these functions succeeds in determining a coding system, it should return that coding system. Otherwise, it @@ -2501,10 +2504,17 @@ This function is intended to be added to `auto-coding-functions'." (let ((sym-type (coding-system-type sym)) (bfcs-type (coding-system-type buffer-file-coding-system))) - ;; 'charset' will signal an error in - ;; coding-system-equal, since it isn't a - ;; coding-system. So test that up front. - (if (and (not (equal sym-type 'charset)) + ;; If the buffer is unibyte, its encoding is + ;; immaterial (it is just the default value of + ;; buffer-file-coding-system), so we ignore it. + ;; This situation happens when this function is + ;; called as part of visiting a file, as opposed + ;; to when saving a buffer to a file. + (if (and enable-multibyte-characters + ;; 'charset' will signal an error in + ;; coding-system-equal, since it isn't a + ;; coding-system. So test that up front. + (not (equal sym-type 'charset)) (coding-system-equal 'utf-8 sym-type) (coding-system-equal 'utf-8 bfcs-type)) buffer-file-coding-system @@ -2556,7 +2566,8 @@ This function is intended to be added to `auto-coding-functions'." (let ((sym-type (coding-system-type sym)) (bfcs-type (coding-system-type buffer-file-coding-system))) - (if (and (coding-system-equal 'utf-8 sym-type) + (if (and enable-multibyte-characters + (coding-system-equal 'utf-8 sym-type) (coding-system-equal 'utf-8 bfcs-type)) buffer-file-coding-system sym)) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 75e2deaa4ce..716f40c1f3a 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -1843,7 +1843,7 @@ commands to be prefixed by \"-interpreter-exec console\".") ;; Python and Guile commands that have an argument don't enter the ;; recursive reading loop. (let* ((control-command-p (string-match gdb-control-commands-regexp string)) - (command-arg (match-string 3 string)) + (command-arg (and control-command-p (match-string 3 string))) (python-or-guile-p (string-match gdb-python-guile-commands-regexp string))) (if (and control-command-p diff --git a/lisp/window.el b/lisp/window.el index 39f4fa139bb..a8b65657a49 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -4697,6 +4697,8 @@ displayed there." BUFFER-OR-NAME may be a buffer or the name of an existing buffer and defaults to the current buffer. +Interactively, prompt for the buffer. + The following non-nil values of the optional argument FRAME have special meanings: @@ -4713,9 +4715,25 @@ have special meanings: Any other value of FRAME means consider all windows on all frames. -When a window showing BUFFER-OR-NAME is dedicated and the only -window of its frame, that frame is deleted when there are other -frames left." +Interactively, FRAME is the prefix argument, so you can +use \\[universal-argument] 0 to specify all windows only on +the current terminal's frames. + +If a frame's root window shows the buffer specified by +BUFFER-OR-NAME and is dedicated to that buffer and that frame +does not host the active minibuffer window and there is at least +one other frame on that frame's terminal, delete that frame. +Otherwise, do not delete a frame's root window if it shows the +buffer specified by BUFFER-OR-NAME and do not delete any frame's +main window showing that buffer either. Rather, in any such +case, call `switch-to-prev-buffer' to show another buffer in that +window and make sure the window is no more dedicated to its +buffer. + +If the buffer specified by BUFFER-OR-NAME is shown in a +minibuffer window, do nothing for that window. For any window +that does not show that buffer, remove the buffer from that +window's lists of previous and next buffers." (interactive "bDelete windows on (buffer):\nP") (let ((buffer (window-normalize-buffer buffer-or-name)) ;; Handle the "inverted" meaning of the FRAME argument wrt other diff --git a/src/buffer.c b/src/buffer.c index 44b33f5b60d..5fabbc253c8 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -6256,9 +6256,11 @@ The function `kill-all-local-variables' runs this before doing anything else. * DEFVAR_LISP ("buffer-list-update-hook", Vbuffer_list_update_hook, doc: /* Hook run when the buffer list changes. -Functions running this hook are, `get-buffer-create', -`make-indirect-buffer', `rename-buffer', `kill-buffer', -`bury-buffer-internal' and `select-window'. */); +Functions (implicitly) running this hook are `get-buffer-create', +`make-indirect-buffer', `rename-buffer', `kill-buffer', `bury-buffer' +and `select-window'. Functions run by this hook should avoid calling +`select-window' with a nil NORECORD argument or `with-temp-buffer' +since either may lead to infinite recursion. */); Vbuffer_list_update_hook = Qnil; DEFSYM (Qbuffer_list_update_hook, "buffer-list-update-hook");