[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#13948: no key-binding-locus
From: |
Nicolas Richard |
Subject: |
bug#13948: no key-binding-locus |
Date: |
Wed, 11 Jun 2014 13:23:17 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3.91 (gnu/linux) |
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Here's another attempt. Like the previous patch, I define
>> key-binding-keymap which finds the keymap by mimicking key-binding, and
>> describe-key--binding-locus which matches the keymap to a symbol and
>> makes a description suitable for describe-key.
>
> Looks pretty good. Feel free to install it into `trunk'.
I can send a patch, including a ChangeLog entry, but I don't have
permission to commit.
>> + (when (integerp found)
>> + ;; prefix was found but not the whole sequence
>> + (setq found nil)))
>
> If key-binding returned a command, then we should never hit this case.
> It's OK to keep the code, but you might like to add a comment mentioning
> that we don't expect this case to happen.
We do hit the case, because we look in active keymaps one by one,
instead of using the keymap (cons 'keymap active-keymaps) like
key-binding does.
>> + ;; look into these advertised symbols first
>> + (while (and (not found) advertised-syms)
>> + (let ((sym (pop advertised-syms)))
>> + (setq found
>> + (when (and
>> + (boundp sym)
>> + (eq map (symbol-value sym)))
>> + sym))))
>> + ;; only look in other symbols otherwise
>> + (when (not found)
>> + (mapatoms
>> + (lambda (x)
>> + (when (and (boundp x)
>> + ;; avoid let-bound symbols
>> + (special-variable-p x)
>> + (eq (symbol-value x) map))
>> + (push x found))))
>> + (when (and (consp found)
>> + (null (cdr found)))
>> + (setq found (car found))))
>
> I think this code will be simpler if you use catch/throw (you can then
> use dolist over advertised-syms, for example and you don't need
> `found').
Shall I return only the first symbol that matches, also in the mapatoms
case ? I assume yes because of your next suggestion :
> I think it's better to make this function return the symbol rather than
> a string, and let the caller turn it into a string.
Ok.
Here's the patch.
>From 685224012675c7b608ad67825cb7ff4d88ce8392 Mon Sep 17 00:00:00 2001
From: Nicolas Richard <theonewiththeevillook@yahoo.fr>
Date: Tue, 10 Jun 2014 20:06:27 +0200
Subject: [PATCH] describe-key: mention the keymap in which the binding was
found.
* help.el (help--key-binding-keymap): New function.
(help--binding-locus): New function.
(describe-key): Mention the keymap in which the binding was found.
---
lisp/ChangeLog | 6 ++++
lisp/help.el | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 84 insertions(+), 8 deletions(-)
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2f40577..9912407 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2014-06-11 Nicolas Richard <theonewiththeevillook@yahoo.fr>
+
+ * help.el (help--key-binding-keymap): New function.
+ (help--binding-locus): New function.
+ (describe-key): Mention the keymap in which the binding was found.
+
2014-05-26 Paul Eggert <eggert@cs.ucla.edu>
Include sources used to create macuvs.h.
diff --git a/lisp/help.el b/lisp/help.el
index 72a9524..0effdfa 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -647,6 +647,67 @@ temporarily enables it to allow getting help on disabled
items and buttons."
(princ (format "%s%s is undefined" key-desc mouse-msg))
(princ (format "%s%s runs the command %S" key-desc mouse-msg defn)))))
+(defun help--key-binding-keymap (key &optional accept-default no-remap
position)
+ "Return a keymap holding a binding for KEY within current keymaps.
+The effect of the arguments KEY, ACCEPT-DEFAULT, NO-REMAP and
+POSITION is as documented in the function `key-binding'."
+ (let* ((active-maps (current-active-maps t position))
+ map found)
+ ;; We loop over active maps like key-binding does.
+ (while (and
+ (not found)
+ (setq map (pop active-maps)))
+ (setq found (lookup-key map key accept-default))
+ (when (integerp found)
+ ;; Prefix was found but not the whole sequence.
+ (setq found nil)))
+ (when found
+ (if (and (symbolp found)
+ (not no-remap)
+ (command-remapping found))
+ ;; The user might want to know in which map the binding is
+ ;; found, or in which map the remapping is found. The
+ ;; default is to show where the remapping is done.
+ (key-binding-keymap (vector 'remap found))
+ map))))
+
+(defun help--binding-locus (key position)
+ "Describe in which keymap KEY is defined.
+Return a symbol pointing to that keymap if one exists ; otherwise
+return nil."
+ (let ((map (key-binding-keymap key t nil position)))
+ (when map
+ (catch 'found
+ (let ((advertised-syms (nconc
+ (list 'overriding-terminal-local-map
+ 'overriding-local-map)
+ (delq nil
+ (mapcar
+ (lambda (mode-and-map)
+ (let ((mode (car mode-and-map)))
+ (when (symbol-value mode)
+ (intern-soft
+ (format "%s-map" mode)))))
+ minor-mode-map-alist))
+ (list 'global-map
+ (intern-soft (format "%s-map"
major-mode)))))
+ found)
+ ;; Look into these advertised symbols first.
+ (dolist (sym advertised-syms)
+ (when (and
+ (boundp sym)
+ (eq map (symbol-value sym)))
+ (throw 'found sym)))
+ ;; Only look in other symbols otherwise.
+ (mapatoms
+ (lambda (x)
+ (when (and (boundp x)
+ ;; Avoid let-bound symbols.
+ (special-variable-p x)
+ (eq (symbol-value x) map))
+ (throw 'found x))))
+ nil)))))
+
(defun describe-key (&optional key untranslated up-event)
"Display documentation of the function invoked by KEY.
KEY can be any kind of a key sequence; it can include keyboard events,
@@ -709,6 +770,7 @@ temporarily enables it to allow getting help on disabled
items and buttons."
(mouse-msg (if (or (memq 'click modifiers) (memq 'down modifiers)
(memq 'drag modifiers)) " at that spot" ""))
(defn (key-binding key t))
+ key-locus key-locus-up key-locus-up-tricky
defn-up defn-up-tricky ev-type
mouse-1-remapped mouse-1-tricky)
@@ -747,15 +809,19 @@ temporarily enables it to allow getting help on disabled
items and buttons."
(setcar up-event (elt mouse-1-remapped 0)))
(t (setcar up-event 'mouse-2))))
(setq defn-up (key-binding sequence nil nil (event-start up-event)))
+ (setq key-locus-up (help--binding-locus sequence (event-start
up-event)))
(when mouse-1-tricky
(setq sequence (vector up-event))
(aset sequence 0 'mouse-1)
- (setq defn-up-tricky (key-binding sequence nil nil (event-start
up-event))))))
+ (setq defn-up-tricky (key-binding sequence nil nil (event-start
up-event)))
+ (setq key-locus-up-tricky (help--binding-locus sequence
(event-start up-event))))))
+ (setq key-locus (help--binding-locus key (event-start event)))
(with-help-window (help-buffer)
(princ (help-key-description key untranslated))
- (princ (format "\
-%s runs the command %S, which is "
- mouse-msg defn))
+ (princ (format "%s runs the command %S%s, which is "
+ mouse-msg defn (if key-locus
+ (format " (found in %s)" key-locus)
+ "")))
(describe-function-1 defn)
(when up-event
(unless (or (null defn-up)
@@ -765,13 +831,15 @@ temporarily enables it to allow getting help on disabled
items and buttons."
----------------- up-event %s----------------
-%s%s%s runs the command %S, which is "
+%s%s%s runs the command %S%s, which is "
(if mouse-1-tricky "(short click) " "")
(key-description (vector up-event))
mouse-msg
(if mouse-1-remapped
" is remapped to <mouse-2>, which" "")
- defn-up))
+ defn-up (if key-locus-up
+ (format " (found in %s)" key-locus-up)
+ "")))
(describe-function-1 defn-up))
(unless (or (null defn-up-tricky)
(integerp defn-up-tricky)
@@ -781,10 +849,12 @@ temporarily enables it to allow getting help on disabled
items and buttons."
----------------- up-event (long click) ----------------
Pressing <%S>%s for longer than %d milli-seconds
-runs the command %S, which is "
+runs the command %S%s, which is "
ev-type mouse-msg
mouse-1-click-follows-link
- defn-up-tricky))
+ defn-up-tricky (if key-locus-up-tricky
+ (format " (found in %s)"
key-locus-up-tricky)
+ "")))
(describe-function-1 defn-up-tricky)))))))
(defun describe-mode (&optional buffer)
--
2.0.0
--
Nico.
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/02
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/02
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/04
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/04
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/04
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/04
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/06
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/06
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/10
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/10
- bug#13948: no key-binding-locus,
Nicolas Richard <=
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/11
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/11
- bug#13948: no key-binding-locus, Stefan Monnier, 2014/06/11
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/12
- bug#13948: no key-binding-locus, Nicolas Richard, 2014/06/12