emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/substitute-command-keys 5d4c75a 1/2: New Lisp implementation of


From: Stefan Kangas
Subject: scratch/substitute-command-keys 5d4c75a 1/2: New Lisp implementation of describe_vector
Date: Sun, 23 Aug 2020 11:49:38 -0400 (EDT)

branch: scratch/substitute-command-keys
commit 5d4c75a613b11a4b77ed51a15786cafcb8e896c2
Author: Stefan Kangas <stefankangas@gmail.com>
Commit: Stefan Kangas <stefankangas@gmail.com>

    New Lisp implementation of describe_vector
    
    * lisp/help.el (help--describe-keymap): New Lisp implementation of
    describe_vector.
    * src/keymap.c (Fdescribe_vector_internal): Remove defun.
    (syms_of_keymap): Remove defsubr for Fdescribe_vector_internal.
---
 lisp/help.el | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/keymap.c | 23 -------------------
 2 files changed, 71 insertions(+), 25 deletions(-)

diff --git a/lisp/help.el b/lisp/help.el
index d9f4dcd..71f78d7 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -1277,8 +1277,8 @@ PARTIAL, SHADOW, NOMENU are as in `describe_map_tree'."
          done vect)
     (while (and (consp tail) (not done))
       (cond ((or (vectorp (car tail)) (char-table-p (car tail)))
-             (describe-vector-internal (car tail) prefix transl partial
-                                       shadow map t mention-shadow))
+             (help--describe-keymap (car tail) prefix transl partial
+                                shadow map mention-shadow))
             ((consp (car tail))
              (let ((event (caar tail))
                    definition this-shadowed)
@@ -1366,6 +1366,75 @@ PARTIAL, SHADOW, NOMENU are as in `describe_map_tree'."
         ;; Next item in list.
         (setq vect (cdr vect))))))
 
+(defun help--describe-keymap
+    (keymap prefix transl partial shadow entire-map mention-shadow)
+  "Insert in the current buffer a description of the contents of KEYMAP.
+
+PREFIX is a string describing the key which leads to this keymap.
+
+If PARTIAL, it means do not mention suppressed commands.
+
+SHADOW is a list of keymaps that shadow this map.  If it is
+non-nil, look up the key in those maps and don't mention it if it
+is defined by any of them.
+
+ENTIRE-MAP is the keymap in which this keymap appears.
+If the definition in effect in the whole map does not match
+the one in this keymap, we ignore this one."
+  ;; Converted from describe_vector in keymap.c.
+  (let* ((first t)
+         (idx 0))
+    (while (< idx (length keymap))
+      (let* ((val (aref keymap idx))
+             (definition (keymap--get-keyelt val nil))
+             (start-idx idx)
+             this-shadowed
+             found-range)
+        (when (and definition
+                   ;; Don't mention suppressed commands.
+                   (not (and partial
+                             (symbolp definition)
+                             (get definition 'suppress-keymap)))
+                   ;; If this binding is shadowed by some other map,
+                   ;; ignore it.
+                   (not (and shadow
+                             (help--shadow-lookup shadow (vector start-idx) t 
nil)
+                             (if mention-shadow
+                                 (prog1 nil (setq this-shadowed t))
+                               t)))
+                   ;; Ignore this definition if it is shadowed by an earlier
+                   ;; one in the same keymap.
+                   (not (and entire-map
+                             (not (eq (lookup-key entire-map (vector 
start-idx) t)
+                                      definition)))))
+          (when first
+            (insert "\n")
+            (setq first nil))
+          (when (and prefix (> (length prefix) 0))
+            (insert (format "%s" prefix)))
+          (insert (key-description (vector start-idx) prefix))
+          ;; Find all consecutive characters or rows that have the
+          ;; same definition.
+          (while (equal (keymap--get-keyelt (aref keymap (1+ idx)) nil)
+                        definition)
+            (setq found-range t)
+            (setq idx (1+ idx)))
+          ;; If we have a range of more than one character,
+          ;; print where the range reaches to.
+          (when found-range
+            (insert " .. ")
+            (when (and prefix (> (length prefix) 0))
+              (insert (format "%s" prefix)))
+            (insert (key-description (vector idx) prefix)))
+          (if transl
+              (help--describe-translation definition)
+            (help--describe-command definition))
+          (when this-shadowed
+            (goto-char (1- (point)))
+            (insert "  (binding currently shadowed)")
+            (goto-char (1+ (point))))))
+      (setq idx (1+ idx)))))
+
 
 (declare-function x-display-pixel-height "xfns.c" (&optional terminal))
 (declare-function x-display-pixel-width "xfns.c" (&optional terminal))
diff --git a/src/keymap.c b/src/keymap.c
index 7aa11f4..46ca61c 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -3328,28 +3328,6 @@ DESCRIBER is the output function used; nil means use 
`princ'.  */)
   return unbind_to (count, Qnil);
 }
 
-DEFUN ("describe-vector-internal", Fdescribe_vector_internal, 
Sdescribe_vector_internal, 8, 8, 0,
-       doc: /* Insert a description of contents of VECTOR.  */)
-  (Lisp_Object vector, Lisp_Object prefix, Lisp_Object transl,
-   Lisp_Object partial, Lisp_Object shadow, Lisp_Object entire_map,
-   Lisp_Object keymap_p, Lisp_Object mention_shadow)
-{
-  ptrdiff_t count = SPECPDL_INDEX ();
-  specbind (Qstandard_output, Fcurrent_buffer ());
-  CHECK_VECTOR_OR_CHAR_TABLE (vector);
-
-  bool b_transl = NILP (transl) ? false : true;
-  bool b_partial = NILP (partial) ? false : true;
-  bool b_keymap_p = NILP (keymap_p) ? false : true;
-  bool b_mention_shadow = NILP (mention_shadow) ? false : true;
-
-  describe_vector (vector, prefix, Qnil,
-                  b_transl ? describe_translation : describe_command,
-                  b_partial, shadow, entire_map,
-                  b_keymap_p, b_mention_shadow);
-  return unbind_to (count, Qnil);
-}
-
 /* Insert in the current buffer a description of the contents of VECTOR.
    We call ELT_DESCRIBER to insert the description of one value found
    in VECTOR.
@@ -3753,7 +3731,6 @@ This is used for internal purposes only.  */);
   defsubr (&Skey_description);
   defsubr (&Skeymap__get_keyelt);
   defsubr (&Sdescribe_vector);
-  defsubr (&Sdescribe_vector_internal);
   defsubr (&Ssingle_key_description);
   defsubr (&Stext_char_description);
   defsubr (&Swhere_is_internal);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]