From f98e758c2fda69b27a61d0d782fe21c6934c4585 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sat, 21 Oct 1995 22:23:48 +0000 Subject: [PATCH] Fix key bindings. (electric-help-mode): Use mouse-leave-buffer-hook. (electric-help-retain): Remove mouse-leave-buffer-hook. (with-electric-help): New argument minheight. (electric-help-execute-extended): New function. (electric-help-ctrl-x-prefix): New function. (electric-help-command-loop): Make messages more consistent. Include strategic sit-for 0, so that pos-visible-in-window-p will return the right thing. Make 2nd arg of Electric-command-loop return 'noprompt if we are in isearch-mode. Eval to-be-executed at the very end. (ehelp-map): Electrify apropos too. --- lisp/ehelp.el | 83 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/lisp/ehelp.el b/lisp/ehelp.el index fda84b7a357..756583bfe27 100644 --- a/lisp/ehelp.el +++ b/lisp/ehelp.el @@ -45,8 +45,20 @@ (if electric-help-map () (let ((map (make-keymap))) - ;; allow all non-self-inserting keys - search, scroll, etc + ;; allow all non-self-inserting keys - search, scroll, etc, but + ;; let M-x and C-x exit ehelp mode and retain buffer: (suppress-keymap map) + (define-key map "\C-u" 'electric-help-undefined) + (define-key map [?\C-0] 'electric-help-undefined) + (define-key map [?\C-1] 'electric-help-undefined) + (define-key map [?\C-2] 'electric-help-undefined) + (define-key map [?\C-3] 'electric-help-undefined) + (define-key map [?\C-4] 'electric-help-undefined) + (define-key map [?\C-5] 'electric-help-undefined) + (define-key map [?\C-6] 'electric-help-undefined) + (define-key map [?\C-7] 'electric-help-undefined) + (define-key map [?\C-8] 'electric-help-undefined) + (define-key map [?\C-9] 'electric-help-undefined) (define-key map (char-to-string help-char) 'electric-help-help) (define-key map "?" 'electric-help-help) (define-key map " " 'scroll-up) @@ -60,9 +72,11 @@ ;;a better key than this? (define-key map "r" 'electric-help-retain) (define-key map "R" 'electric-help-retain) + (define-key map "\ex" 'electric-help-execute-extended) + (define-key map "\C-x" 'electric-help-ctrl-x-prefix) (setq electric-help-map map))) - + (defun electric-help-mode () "`with-electric-help' temporarily places its buffer in this mode. \(On exit from `with-electric-help', the buffer is put in `default-major-mode'.)" @@ -71,6 +85,7 @@ (setq major-mode 'help) (setq mode-line-buffer-identification '(" Help: %b")) (use-local-map electric-help-map) + (setq mouse-leave-buffer-hook '(electric-help-retain)) ;; this is done below in with-electric-help ;(run-hooks 'electric-help-mode-hook) ) @@ -78,10 +93,11 @@ ;;;###autoload (defun with-electric-help (thunk &optional buffer noerase) "Pop up an \"electric\" help buffer. -Arguments are THUNK &optional BUFFER NOERASE. BUFFER defaults to `*Help*'. -THUNK is a function of no arguments which is called to initialize -the contents of BUFFER. BUFFER will be erased before THUNK is called unless -NOERASE is non-nil. THUNK will be called with `standard-output' bound to +The arguments are THUNK &optional BUFFER NOERASE MINHEIGHT. +THUNK is a function of no arguments which is called to initialize the +contents of BUFFER. BUFFER defaults to `*Help*'. BUFFER will be +erased before THUNK is called unless NOERASE is non-nil. THUNK will +be called while BUFFER is current and with `standard-output' bound to the buffer specified by BUFFER. If THUNK returns nil, we display BUFFER starting at the top, and @@ -89,14 +105,21 @@ shrink the window to fit. If THUNK returns non-nil, we don't do those things. After THUNK has been called, this function \"electrically\" pops up a window in which BUFFER is displayed and allows the user to scroll through that buffer -in electric-help-mode. +in electric-help-mode. The window's height will be at least MINHEIGHT if +this value is non-nil. + +If THUNK returns nil, we display BUFFER starting at the top, and +shrink the window to fit. If THUNK returns non-nil, we don't do those +things. + When the user exits (with `electric-help-exit', or otherwise) the help buffer's window disappears (i.e., we use `save-window-excursion') BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." (setq buffer (get-buffer-create (or buffer "*Help*"))) (let ((one (one-window-p t)) (config (current-window-configuration)) - (bury nil)) + (bury nil) + (to-be-executed nil)) (unwind-protect (save-excursion (if one (goto-char (window-start (selected-window)))) @@ -104,8 +127,9 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." (pop-to-buffer buffer)) (save-excursion (set-buffer buffer) + (if (and minheight (< (window-height) minheight)) + (enlarge-window (- minheight (window-height)))) (electric-help-mode) - (setq buffer-read-only nil) (or noerase (erase-buffer))) (let ((standard-output buffer)) (if (not (funcall thunk)) @@ -133,7 +157,8 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." ;; so that when we say "Press space to bury" we mean it (replace-buffer-in-windows buffer) ;; must do this outside of save-window-excursion - (bury-buffer buffer)))))) + (bury-buffer buffer))) + (eval to-be-executed)))) (defun electric-help-command-loop () (catch 'exit @@ -155,9 +180,13 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." (Electric-command-loop 'exit (function (lambda () + (sit-for 0) ;necessary if last command was end-of-buffer or + ;beginning-of-buffer - otherwise pos-visible-in-window-p + ;will yield a wrong result. (let ((min (pos-visible-in-window-p (point-min))) (max (pos-visible-in-window-p (point-max)))) - (cond ((and min max) + (cond (isearch-mode 'noprompt) + ((and min max) (cond (standard "Press q to exit, r to retain ") (neither) (t (setq neither (substitute-command-keys "Press \\[electric-help-exit] to exit, \\[electric-help-retain] to retain "))))) @@ -166,11 +195,11 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." (up) (t (setq up (substitute-command-keys "Press \\[scroll-up] to scroll, \\[electric-help-exit] to exit, \\[electric-help-retain] to retain "))))) (max - (cond (standard "Press DEL to scroll back, q to exit ") + (cond (standard "Press DEL to scroll back, q to exit, r to retain ") (down) (t (setq down (substitute-command-keys "Press \\[scroll-down] to scroll back, \\[electric-help-exit] to exit, \\[electric-help-retain] to retain "))))) (t - (cond (standard "Press SPC to scroll, DEL to scroll back, q to exit ") + (cond (standard "Press SPC to scroll, DEL to scroll back, q to exit, r to retain ") (both) (t (setq both (substitute-command-keys "Press \\[scroll-up] to scroll, \\[scroll-down] to scroll back, \\[electric-help-exit] to exit, \\[electric-help-retain] to retain "))))))))) t)))) @@ -194,15 +223,20 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode') when we exit." \(The *Help* buffer will not be selected, but \\[switch-to-buffer-other-window] RET will select it.)" (interactive) - (throw 'exit '(retain))) + ;; Make sure that we don't throw twice, even if two events cause + ;; calling this function: + (if mouse-leave-buffer-hook + (progn + (setq mouse-leave-buffer-hook nil) + (throw 'exit '(retain))))) (defun electric-help-undefined () (interactive) (error "%s is undefined -- Press %s to exit" (mapconcat 'single-key-description (this-command-keys) " ") - (if (eq (key-binding "Q") 'electric-help-exit) - "Q" + (if (eq (key-binding "q") 'electric-help-exit) + "q" (substitute-command-keys "\\[electric-help-exit]")))) @@ -270,6 +304,22 @@ will select it.)" (set-buffer-modified-p m)))))) (with-electric-help 'ignore name t)))) + + +;; This is to be bound to M-x in ehelp mode. Retains ehelp buffer and then +;; continues with execute-extended-command. +(defun electric-help-execute-extended (prefixarg) + (interactive "p") + (setq to-be-executed '(execute-extended-command nil)) + (electric-help-retain)) + +;; This is to be buond to C-x in ehelp mode. Retains ehelp buffer and then +;; continues with ctrl-x prefix. +(defun electric-help-ctrl-x-prefix (prefixarg) + (interactive "p") + (setq to-be-executed '(progn (message nil) (setq unread-command-char ?\C-x))) + (electric-help-retain)) + (defun electric-describe-key () (interactive) @@ -321,6 +371,7 @@ will select it.)" (if ehelp-map nil (let ((map (copy-keymap help-map))) + (substitute-key-definition 'apropos 'electric-apropos map) (substitute-key-definition 'command-apropos 'electric-command-apropos map) (substitute-key-definition 'describe-key 'electric-describe-key map) (substitute-key-definition 'describe-mode 'electric-describe-mode map) -- 2.39.2