emacs-diffs
[Top][All Lists]
Advanced

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

scratch/a-modest-completion-redesign-proposal 68bce24 1/2: Redesign comp


From: João Távora
Subject: scratch/a-modest-completion-redesign-proposal 68bce24 1/2: Redesign completion style definition mechanism
Date: Sun, 10 Nov 2019 18:03:19 -0500 (EST)

branch: scratch/a-modest-completion-redesign-proposal
commit 68bce2475a6bbd9f48776f055bc3761efebdfb25
Author: Stefan Monnier <address@hidden>
Commit: João Távora <address@hidden>

    Redesign completion style definition mechanism
    
    * lisp/minibuffer.el (completion-styles-alist): Don't define flex
    here.
    (completion-styles-try-completion)
    (completion-styles-all-completions): New generics.
    (completion--nth-completion): Use them.  Return a cons of
    completions and metadata.
    (completion-all-completions): Adjust metadata here.
    (completion--flex-adjust-metadata): Return adjusted metadata
    entries.
    (completion-styles-try-completion flex)
    (completion-styles-all-completions flex): Implement.
---
 lisp/minibuffer.el | 70 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 43 insertions(+), 27 deletions(-)

diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 5b993e7..08b230d 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -807,11 +807,6 @@ Additionally the user can use the char \"*\" as a glob 
pattern.")
 I.e. when completing \"foo_bar\" (where _ is the position of point),
 it will consider all completions candidates matching the glob
 pattern \"*foo*bar*\".")
-    (flex
-     completion-flex-try-completion completion-flex-all-completions
-     "Completion of an in-order subset of characters.
-When completing \"foo\" the glob \"*f*o*o*\" is used, so that
-\"foo\" can complete to \"frodo\".")
     (initials
      completion-initials-try-completion completion-initials-all-completions
      "Completion of acronyms and initialisms.
@@ -907,8 +902,25 @@ This overrides the defaults specified in 
`completion-category-defaults'."
         (delete-dups (append (cdr over) (copy-sequence completion-styles)))
        completion-styles)))
 
+(cl-defgeneric completion-styles-try-completion
+    (style string table pred point &rest _)
+  "Implementation of the `completion-try-completion' for STYLE."
+  (funcall (nth 1 (assq style completion-styles-alist))
+           string table pred point))
+
+(cl-defgeneric completion-styles-all-completions
+    (style string table pred point &rest _)
+  "Implementation of the `completion-all-completions' for STYLE.
+Should return a pair (COMPLETIONS . PROPS) where PROPS
+is an alist of metadata properties like those of `completion-metadata'."
+  (list
+   (funcall (nth 2 (assq style completion-styles-alist))
+            string table pred point)))
+
 (defun completion--nth-completion (n string table pred point metadata)
-  "Call the Nth method of completion styles."
+  "Call the Nth method of completion styles.
+N can be 1 for to mean \"completion-try-completion\" or 2 to mean
+\"completion-all-completions\"."
   ;; We provide special support for quoting/unquoting here because it cannot
   ;; reliably be done within the normal completion-table routines: Completion
   ;; styles such as `substring' or `partial-completion' need to match the
@@ -938,20 +950,17 @@ This overrides the defaults specified in 
`completion-category-defaults'."
               (setq point (pop new))
               (cl-assert (<= point (length string)))
               (pop new))))
-         (result-and-style
+         (result
           (completion--some
-           (lambda (style)
-             (let ((probe (funcall (nth n (assq style
-                                                completion-styles-alist))
-                                   string table pred point)))
-               (and probe (cons probe style))))
-           (completion--styles md)))
-         (adjust-fn (get (cdr result-and-style) 'completion--adjust-metadata)))
-    (when (and adjust-fn metadata)
-      (setcdr metadata (cdr (funcall adjust-fn metadata))))
+           (lambda (style) (condition-case err (funcall (pcase-exhaustive n
+                                 (1 #'completion-styles-try-completion)
+                                 (2 #'completion-styles-all-completions)
+                                 (_ n))
+                               style string table pred point)))
+           (completion--styles md))))
     (if requote
-        (funcall requote (car result-and-style) n)
-      (car result-and-style))))
+        (funcall requote result n)
+      result)))
 
 (defun completion-try-completion (string table pred point &optional metadata)
   "Try to complete STRING using completion table TABLE.
@@ -971,7 +980,13 @@ The return value is a list of completions and may contain 
the base-size
 in the last `cdr'."
   ;; FIXME: We need to additionally return the info needed for the
   ;; second part of completion-base-position.
-  (completion--nth-completion 2 string table pred point metadata))
+  (pcase-let* ((`(,comps . ,props)
+                (completion--nth-completion
+                 2 string table pred point metadata)))
+    (when (and metadata props)
+      (setf (cdr metadata)
+            (append props (cdr metadata))))
+    comps))
 
 (defun minibuffer--bitset (modified completions exact)
   (logior (if modified    4 0)
@@ -3482,8 +3497,6 @@ that is non-nil."
 ;;; "flex" completion, also known as flx/fuzzy/scatter completion
 ;; Completes "foo" to "frodo" and "farfromsober"
 
-(put 'flex 'completion--adjust-metadata 'completion--flex-adjust-metadata)
-
 (defun completion--flex-adjust-metadata (metadata)
   (cl-flet ((compose-flex-sort-fn
              (existing-sort-fn) ; wish `cl-flet' had proper indentation...
@@ -3499,8 +3512,7 @@ that is non-nil."
                         (let ((s1 (get-text-property 0 'completion-score c1))
                               (s2 (get-text-property 0 'completion-score c2)))
                           (> (or s1 0) (or s2 0))))))))))
-    `(metadata
-      (display-sort-function
+    `((display-sort-function
        . ,(compose-flex-sort-fn
            (completion-metadata-get metadata 'display-sort-function)))
       (cycle-sort-function
@@ -3525,7 +3537,8 @@ which is at the core of flex logic.  The extra
               (list elem)))
           pattern))
 
-(defun completion-flex-try-completion (string table pred point)
+(cl-defmethod completion-styles-try-completion ((_style (eql flex))
+                                                string table pred point &rest 
_)
   "Try to flex-complete STRING in TABLE given PRED and POINT."
   (pcase-let ((`(,all ,pattern ,prefix ,suffix ,_carbounds)
                (completion-substring--all-completions
@@ -3541,15 +3554,18 @@ which is at the core of flex logic.  The extra
     ;; "farfromsober".
     (completion-pcm--merge-try pattern all prefix suffix)))
 
-(defun completion-flex-all-completions (string table pred point)
+(cl-defmethod completion-styles-all-completions ((_style (eql flex))
+                                                 string table pred point &rest 
_)
   "Get flex-completions of STRING in TABLE, given PRED and POINT."
   (pcase-let ((`(,all ,pattern ,prefix ,_suffix ,_carbounds)
                (completion-substring--all-completions
                 string table pred point
                 #'completion-flex--make-flex-pattern)))
     (when all
-      (nconc (completion-pcm--hilit-commonality pattern all)
-             (length prefix)))))
+      (cons
+       (nconc (completion-pcm--hilit-commonality pattern all)
+              (length prefix))
+       (completion--flex-adjust-metadata nil)))))
 
 ;; Initials completion
 ;; Complete /ums to /usr/monnier/src or lch to list-command-history.



reply via email to

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