From: Nicolas Richard <theonewiththeevillook@yahoo.fr>
To: Stefan Monnier <monnier@IRO.UMontreal.CA>
Cc: Nicolas Richard <theonewiththeevillook@yahoo.fr>,
13948@debbugs.gnu.org, Brian Malehorn <bmalehorn@gmail.com>
Subject: bug#13948: no key-binding-locus
Date: Fri, 06 Jun 2014 19:57:15 +0200 [thread overview]
Message-ID: <871tv1gbus.fsf@yahoo.fr> (raw)
In-Reply-To: <jwvbnu8hiad.fsf-monnier+emacsbugs@gnu.org> (Stefan Monnier's message of "Wed, 04 Jun 2014 10:20:37 -0400")
Stefan Monnier <monnier@IRO.UMontreal.CA> writes:
>> to be honest, I did it because (eq widget-global-map global-map) =>
>> t and I didn't want to see these two results everytime.
>
> Ah, good point. I think a more general solution would be preferable,
> where we provide a list of "advertized vars" and if the keymap is found
> in this list, don't look via mapatoms.
>
> This list of advertized vars could be built dynamically mimicking
> current-active-maps.
I don't know how to do that. My problem is that when a minor or major
mode is defined, the symbol that holds the keymap is not stored afaics.
Thus when current-active-maps is run, the information is no more
accessible, and mimicking it doesn't bring me much.
I could make a list of (intern (format "%s-map" major-mode)) and (intern
(format "%s-map" minor-mode)) for currently active minor-modes and check
in those. But that will not solve the global map problem, so it still
needs some special casing.
>>> Could you turn it into a self-contained patch (e.g. move the yf/*
>>> functions to help*.el and rename it accordingly)?
My current suggestion is as follows.
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -647,6 +647,48 @@ 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 key-binding-keymap (key &optional accept-default no-remap _position)
+ "Determine in which keymap KEY is defined.
+When the key was found, return an active keymap in which it was
+found."
+ (let ((active-maps (current-active-maps t))
+ 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))
+ (key-binding-keymap (vector 'remap found))
+ map))))
+
+(defun describe-key--binding-locus (key)
+ "Describe in which keymap KEY is defined.
+Return the description (a string) or nil."
+ (let ((map (key-binding-keymap key t)))
+ (if (eq map (current-global-map))
+ " (found in global map)"
+ (let ((symbols))
+ (mapatoms
+ (lambda (x)
+ (when (and (boundp x)
+ ;; Avoid let-bound symbols
+ (special-variable-p x)
+ (eq (symbol-value x) map))
+ (push x symbols))))
+ (when symbols
+ (format " (found in %s)"
+ (mapconcat #'symbol-name symbols ", ")))))))
+
(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,
@@ -753,9 +795,8 @@ temporarily enables it to allow getting help on disabled items and buttons."
(setq defn-up-tricky (key-binding sequence nil nil (event-start up-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 (describe-key--binding-locus key)))
(describe-function-1 defn)
(when up-event
(unless (or (null defn-up)
--
Nico.
next prev parent reply other threads:[~2014-06-06 17:57 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-13 20:34 bug#13948: no key-binding-locus Brian Malehorn
2013-04-23 19:41 ` Josh
2014-06-02 10:15 ` Nicolas Richard
2014-06-02 13:55 ` Stefan Monnier
2014-06-04 10:51 ` Nicolas Richard
2014-06-04 13:50 ` Stefan Monnier
2014-06-04 14:00 ` Nicolas Richard
2014-06-04 14:20 ` Stefan Monnier
2014-06-06 17:57 ` Nicolas Richard [this message]
2014-06-06 18:27 ` Stefan Monnier
2014-06-10 19:46 ` Nicolas Richard
2014-06-10 22:24 ` Stefan Monnier
2014-06-11 11:23 ` Nicolas Richard
2014-06-11 18:06 ` Stefan Monnier
2014-06-11 20:20 ` Nicolas Richard
2014-06-11 22:00 ` Stefan Monnier
2014-06-12 8:16 ` Nicolas Richard
2014-06-12 16:09 ` Nicolas Richard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871tv1gbus.fsf@yahoo.fr \
--to=theonewiththeevillook@yahoo.fr \
--cc=13948@debbugs.gnu.org \
--cc=bmalehorn@gmail.com \
--cc=monnier@IRO.UMontreal.CA \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.