]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve behavior with project-switch-use-entire-map=t
authorDmitry Gutov <dmitry@gutov.dev>
Thu, 19 Oct 2023 22:24:56 +0000 (01:24 +0300)
committerDmitry Gutov <dmitry@gutov.dev>
Thu, 19 Oct 2023 22:24:56 +0000 (01:24 +0300)
* lisp/progmodes/project.el (project--keymap-prompt): New function.
(project--switch-project-command): Use it when
project-switch-use-entire-map is non-nil.  Also check that CHOICE
is not a number (bug#63648).  And print incorrect inputs too.

lisp/progmodes/project.el

index 4a47b4e94a10e9ab105cec077f08a92547b4bd7c..0d6539113cc0cd78412dbedbdd800be54e45c4c9 100644 (file)
@@ -1941,6 +1941,15 @@ Otherwise, use the face `help-key-binding' in the prompt."
   :version "30.1")
 
 (defun project--keymap-prompt ()
+  "Return a prompt for the project switching using the prefix map."
+  (let (keys)
+    (map-keymap
+     (lambda (evt _)
+       (when (characterp evt) (push evt keys)))
+     project-prefix-map)
+    (mapconcat (lambda (key) (help-key-description (string key) nil)) keys " ")))
+
+(defun project--menu-prompt ()
   "Return a prompt for the project switching dispatch menu."
   (mapconcat
    (pcase-lambda (`(,cmd ,label ,key))
@@ -1979,11 +1988,22 @@ Otherwise, use the face `help-key-binding' in the prompt."
               (when-let ((cmd (nth 0 row))
                          (keychar (nth 2 row)))
                 (define-key temp-map (vector keychar) cmd)))))
-         command)
+         command
+         choice)
     (while (not command)
       (let* ((overriding-local-map commands-map)
-             (choice (read-key-sequence (project--keymap-prompt))))
+             (prompt (if project-switch-use-entire-map
+                         (project--keymap-prompt)
+                       (project--menu-prompt))))
+        (when choice
+          (setq prompt (concat prompt
+                               (format " %s: %s"
+                                       (propertize "Unrecognized input"
+                                                   'face 'warning)
+                                       (help-key-description choice nil)))))
+        (setq choice (read-key-sequence (concat "Choose: " prompt)))
         (when (setq command (lookup-key commands-map choice))
+          (when (numberp command) (setq command nil))
           (unless (or project-switch-use-entire-map
                       (assq command commands-menu))
             ;; TODO: Add some hint to the prompt, like "key not