Make Temp Buffer Resize Mode less intrusive (Bug#1806).
[bpt/emacs.git] / lisp / help.el
index da11389..707c8e3 100644 (file)
@@ -990,6 +990,17 @@ window.  The height of the root window is subject to the values of
   :version "24.2"
   :group 'help)
 
+(defcustom temp-buffer-resize-regexps nil
+  "List of regexps that inhibit Temp Buffer Resize mode.
+Any window of a buffer whose name matches one of these regular
+expressions is left alone by Temp Buffer Resize mode."
+  :type '(repeat
+         :tag "Buffer"
+         :value ""
+         (regexp :format "%v"))
+  :version "24.3"
+  :group 'help)
+
 (define-minor-mode temp-buffer-resize-mode
   "Toggle auto-resizing temporary buffer windows (Temp Buffer Resize Mode).
 With a prefix argument ARG, enable Temp Buffer Resize mode if ARG
@@ -1001,6 +1012,12 @@ show a temporary buffer are automatically resized in height to
 fit the buffer's contents, but never more than
 `temp-buffer-max-height' nor less than `window-min-height'.
 
+A window is resized only if it has been specially created for the
+buffer.  Windows that have shown another buffer before are not
+resized.  A window showing a buffer whose name matches any of the
+expressions in `temp-buffer-resize-regexps' is not resized.  A
+frame is resized only if `temp-buffer-resize-frames' is non-nil.
+
 This mode is used by `help', `apropos' and `completion' buffers,
 and some others."
   :global t :group 'help
@@ -1017,27 +1034,33 @@ WINDOW can be any live window and defaults to the selected one.
 Do not make WINDOW higher than `temp-buffer-max-height' nor
 smaller than `window-min-height'.  Do nothing if WINDOW is not
 vertically combined or some of its contents are scrolled out of
-view."
+view.  Do nothing if the name of WINDOW's buffer matches an
+expression in `temp-buffer-resize-regexps'."
   (setq window (window-normalize-window window t))
-  (let ((height (if (functionp temp-buffer-max-height)
-                   (with-selected-window window
-                     (funcall temp-buffer-max-height (window-buffer)))
-                 temp-buffer-max-height)))
-    (cond
-     ((and (pos-visible-in-window-p (point-min) window)
-          (window-combined-p window))
-      (fit-window-to-buffer window height))
-     ((and temp-buffer-resize-frames
-          (eq window (frame-root-window window))
-          (memq (car (window-parameter window 'quit-restore))
-                ;; If 'same is too strong, we might additionally check
-                ;; whether the second element is 'frame.
-                '(same frame)))
-      (let ((frame (window-frame window)))
-       (fit-frame-to-buffer
-        frame (+ (frame-height frame)
-                 (- (window-total-size window))
-                 height)))))))
+  (let ((buffer-name (buffer-name (window-buffer window))))
+    (unless (catch 'found
+             (dolist (regexp temp-buffer-resize-regexps)
+               (when (string-match regexp buffer-name)
+                 (throw 'found t))))
+      (let ((height (if (functionp temp-buffer-max-height)
+                       (with-selected-window window
+                         (funcall temp-buffer-max-height (window-buffer)))
+                     temp-buffer-max-height))
+           (quit-cadr (cadr (window-parameter window 'quit-restore))))
+       (cond
+        ;; Don't resize WINDOW if it showed another buffer before.
+        ((and (eq quit-cadr 'window)
+              (pos-visible-in-window-p (point-min) window)
+              (window-combined-p window))
+         (fit-window-to-buffer window height))
+        ((and temp-buffer-resize-frames
+              (eq quit-cadr 'frame)
+              (eq window (frame-root-window window)))
+         (let ((frame (window-frame window)))
+           (fit-frame-to-buffer
+            frame (+ (frame-height frame)
+                     (- (window-total-size window))
+                     height)))))))))
 
 ;;; Help windows.
 (defcustom help-window-select 'other