mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-02-02 20:16:25 +00:00
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.
This commit is contained in:
parent
f135afd313
commit
f98e758c2f
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user