emacs-diffs
[Top][All Lists]
Advanced

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

master b836405138: Add new user option ecomplete-auto-select


From: Lars Ingebrigtsen
Subject: master b836405138: Add new user option ecomplete-auto-select
Date: Thu, 8 Sep 2022 08:53:52 -0400 (EDT)

branch: master
commit b83640513808c2a88bb150550e74d3b62bb0f616
Author: Phil Sainty <psainty@orcon.net.nz>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Add new user option ecomplete-auto-select
    
    * lisp/ecomplete.el (ecomplete-auto-select): New user option
    (bug#53935).
    (ecomplete-display-matches): Use it.
---
 etc/NEWS          |  6 ++++++
 lisp/ecomplete.el | 57 +++++++++++++++++++++++++++++++++++--------------------
 2 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 76c66a8e39..bf24665ee4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1213,6 +1213,12 @@ change the input method's translation rules, customize 
the user option
 
 * Changes in Specialized Modes and Packages in Emacs 29.1
 
+** ecomplete
+
+---
+*** New user option 'ecomplete-auto-select'.
+If non-nil and there's only one matching option, auto-select that.
+
 ** Dired
 
 +++
diff --git a/lisp/ecomplete.el b/lisp/ecomplete.el
index aa415a3e9e..76438fd25a 100644
--- a/lisp/ecomplete.el
+++ b/lisp/ecomplete.el
@@ -81,6 +81,11 @@ string that was matched."
                (function-item :tag "Sort by newness" ecomplete-newness)
                (function :tag "Other")))
 
+(defcustom ecomplete-auto-select nil
+  "Whether `ecomplete-display-matches' should automatically select a sole 
option."
+  :type 'boolean
+  :version "29.1")
+
 ;;; Internal variables.
 
 (defvar ecomplete-database nil)
@@ -159,10 +164,14 @@ string that was matched."
 (defun ecomplete-display-matches (type word &optional choose)
   "Display the top-rated elements TYPE that match WORD.
 If CHOOSE, allow the user to choose interactively between the
-matches."
+matches.
+
+Auto-select when `ecomplete-message-display-abbrev-auto-select' is
+non-nil and there is only a single completion option available."
   (let* ((matches (ecomplete-get-matches type word))
+         (match-list (and matches (split-string matches "\n")))
+         (max-lines (and matches (- (length match-list) 2)))
         (line 0)
-        (max-lines (when matches (- (length (split-string matches "\n")) 2)))
         (message-log-max nil)
         command highlight)
     (if (not matches)
@@ -173,25 +182,31 @@ matches."
          (progn
            (message "%s" matches)
            nil)
-       (setq highlight (ecomplete-highlight-match-line matches line))
-       (let ((local-map (make-sparse-keymap))
-              (prev-func (lambda () (setq line (max (1- line) 0))))
-              (next-func (lambda () (setq line (min (1+ line) max-lines))))
-             selected)
-         (define-key local-map (kbd "RET")
-           (lambda () (setq selected (nth line (split-string matches "\n")))))
-         (define-key local-map (kbd "M-n") next-func)
-         (define-key local-map (kbd "<down>") next-func)
-         (define-key local-map (kbd "M-p") prev-func)
-         (define-key local-map (kbd "<up>") prev-func)
-         (let ((overriding-local-map local-map))
-           (while (and (null selected)
-                       (setq command (read-key-sequence highlight))
-                       (lookup-key local-map command))
-             (apply (key-binding command) nil)
-             (setq highlight (ecomplete-highlight-match-line matches line))))
-         (message (or selected "Abort"))
-         selected)))))
+        (if (and ecomplete-auto-select
+                 max-lines
+                 (zerop max-lines))
+            ;; Auto-select when only one option is available.
+            (nth 0 match-list)
+          ;; Interactively choose from the filtered completions.
+         (let ((local-map (make-sparse-keymap))
+                (prev-func (lambda () (setq line (max (1- line) 0))))
+                (next-func (lambda () (setq line (min (1+ line) max-lines))))
+               selected)
+           (define-key local-map (kbd "RET")
+                        (lambda () (setq selected (nth line match-list))))
+           (define-key local-map (kbd "M-n") next-func)
+           (define-key local-map (kbd "<down>") next-func)
+           (define-key local-map (kbd "M-p") prev-func)
+           (define-key local-map (kbd "<up>") prev-func)
+           (let ((overriding-local-map local-map))
+              (setq highlight (ecomplete-highlight-match-line matches line))
+             (while (and (null selected)
+                         (setq command (read-key-sequence highlight))
+                         (lookup-key local-map command))
+               (apply (key-binding command) nil)
+               (setq highlight (ecomplete-highlight-match-line matches line))))
+           (message (or selected "Abort"))
+            selected))))))
 
 (defun ecomplete-highlight-match-line (matches line)
   (with-temp-buffer



reply via email to

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