;;; help.el --- help commands for Emacs
-;; Copyright (C) 1985-1986, 1993-1994, 1998-2011
+;; Copyright (C) 1985-1986, 1993-1994, 1998-2012
;; Free Software Foundation, Inc.
;; Maintainer: FSF
(add-hook 'temp-buffer-setup-hook 'help-mode-setup)
(add-hook 'temp-buffer-show-hook 'help-mode-finish)
-;; The variable `help-window' below is used by `help-mode-finish' to
-;; communicate the window displaying help (the "help window") to the
-;; macro `with-help-window'. The latter sets `help-window' to t before
-;; invoking `with-output-to-temp-buffer'. If and only if `help-window'
-;; is eq to t, `help-mode-finish' (called by `temp-buffer-setup-hook')
-;; sets `help-window' to the window selected by `display-buffer'.
-;; Exiting `with-help-window' and calling `help-print-return-message'
-;; reset `help-window' to nil.
-(defvar help-window nil
- "Window chosen for displaying help.")
-
;; `help-window-point-marker' is a marker you can move to a valid
;; position of the buffer shown in the help window in order to override
;; the standard positioning mechanism (`point-min') chosen by
(aref key 1)
(aref key 0)))
(modifiers (event-modifiers event))
- (standard-output (if insert (current-buffer) t))
+ (standard-output (if insert (current-buffer) standard-output))
(mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers)
(memq 'drag modifiers)) " at that spot" ""))
(defn (key-binding key t))
The value is the maximum height (in lines) which
`resize-temp-buffer-window' will give to a window displaying a
temporary buffer. It can also be a function to be called to
-choose the height for such a buffer. It gets one argumemt, the
+choose the height for such a buffer. It gets one argument, the
buffer, and should return a positive integer. At the time the
function is called, the window to be resized is selected."
:type '(choice integer function)
:version "20.4")
(define-minor-mode temp-buffer-resize-mode
- "Toggle mode which makes windows smaller for temporary buffers.
-With prefix argument ARG, turn the resizing of windows displaying
-temporary buffers on if ARG is positive or off otherwise.
+ "Toggle auto-shrinking temp buffer windows (Temp Buffer Resize mode).
+With a prefix argument ARG, enable Temp Buffer Resize mode if ARG
+is positive, and disable it otherwise. If called from Lisp,
+enable the mode if ARG is omitted or nil.
-This mode makes a window the right height for its contents, but
-never more than `temp-buffer-max-height' nor less than
-`window-min-height'.
+When Temp Buffer Resize mode is enabled, the windows in which we
+show a temporary buffer are automatically reduced in height to
+fit the buffer's contents, but never more than
+`temp-buffer-max-height' nor less than `window-min-height'.
This mode is used by `help', `apropos' and `completion' buffers,
and some others."
not vertically combined or some of its contents are scrolled out
of view."
(when (and (pos-visible-in-window-p (point-min))
- (window-iso-combined-p))
+ (window-combined-p))
(fit-window-to-buffer
nil
(if (functionp temp-buffer-max-height)
(message "%s"
(substitute-command-keys (concat quit-part scroll-part)))))
-(defun help-window-setup ()
+(defun help-window-setup (help-window)
"Set up help window for `with-help-window'.
-This relies on `display-buffer-window' being correctly set up by
-`display-buffer'."
- (let* ((help-window (car-safe display-buffer-window))
- (help-buffer (when (window-live-p help-window)
+HELP-WINDOW is the window used for displaying the help buffer."
+ (let* ((help-buffer (when (window-live-p help-window)
(window-buffer help-window)))
- (help-value (cdr-safe display-buffer-window)))
+ (help-setup (when (window-live-p help-window)
+ (car (window-parameter help-window 'quit-restore)))))
(when help-buffer
;; Handle `help-window-point-marker'.
(when (eq (marker-buffer help-window-point-marker) help-buffer)
(cond
((or (eq help-window (selected-window))
(and (or (eq help-window-select t)
+ (eq help-setup 'frame)
(and (eq help-window-select 'other)
(eq (window-frame help-window) (selected-frame))
(> (length (window-list nil 'no-mini)) 2)))
;; The help window is or gets selected ...
(help-window-display-message
(cond
- ((eq help-value 'new-window)
+ ((eq help-setup 'window)
;; ... and is new, ...
- "Type \"q\" to delete this window")
- ((eq help-value 'new-frame)
- ;; ... is on a new frame ...
- "Type \"q\" to delete this frame")
- ((eq help-value 'reuse-other-window)
+ "Type \"q\" to delete help window")
+ ((eq help-setup 'frame)
+ "Type \"q\" to delete help frame")
+ ((eq help-setup 'other)
;; ... or displayed some other buffer before.
"Type \"q\" to restore previous buffer"))
help-window t))
;; other one is the selected one.
(help-window-display-message
(cond
- ((eq help-value 'new-window)
+ ((eq help-setup 'window)
"Type \\[delete-other-windows] to delete the help window")
- ((eq help-value 'reuse-other-window)
- "Type \"q\" in other window to quit"))
+ ((eq help-setup 'other)
+ "Type \"q\" in help window to restore its previous buffer"))
help-window 'other))
(t
- ;; Not much to say here.
+ ;; The help window is not selected ...
(help-window-display-message
- "Type \"q\" in help window to quit" help-window))))))
+ (cond
+ ((eq help-setup 'window)
+ ;; ... and is new, ...
+ "Type \"q\" in help window to delete it")
+ ((eq help-setup 'other)
+ ;; ... or displayed some other buffer before.
+ "Type \"q\" in help window to restore previous buffer"))
+ help-window))))))
;; `with-help-window' is a wrapper for `with-output-to-temp-buffer'
;; providing the following additional twists:
(defmacro with-help-window (buffer-name &rest body)
"Display buffer with name BUFFER-NAME in a help window evaluating BODY.
Select help window if the actual value of the user option
-`help-window-select' says so. Return last value in BODY.
-
-You can specify where and how to show the buffer by binding the
-variable `temp-buffer-show-specifiers' to an appropriate value."
+`help-window-select' says so. Return last value in BODY."
(declare (indent 1) (debug t))
`(progn
- ;; Reset `display-buffer-window': `display-buffer' is
- ;; supposed to set this to the window displaying the buffer plus
- ;; some additional information.
- (setq display-buffer-window nil)
;; Make `help-window-point-marker' point nowhere. The only place
;; where this should be set to a buffer position is within BODY.
(set-marker help-window-point-marker nil)
- (prog1
- ;; Return value returned by `with-output-to-temp-buffer'.
- (with-output-to-temp-buffer ,buffer-name
- (progn ,@body))
- (when display-buffer-window (help-window-setup)))))
+ (let* (help-window
+ (temp-buffer-show-hook
+ (cons (lambda () (setq help-window (selected-window)))
+ temp-buffer-show-hook)))
+ ;; Return value returned by `with-output-to-temp-buffer'.
+ (prog1
+ (with-output-to-temp-buffer ,buffer-name
+ (progn ,@body))
+ (help-window-setup help-window)))))
;; Called from C, on encountering `help-char' when reading a char.
;; Don't print to *Help*; that would clobber Help history.