Eglot: try even harder to avoid other completion styles (bug#68699)
authorJoão Távora <joaotavora@gmail.com>
Thu, 25 Jan 2024 01:37:57 +0000 (01:37 +0000)
committerJoão Távora <joaotavora@gmail.com>
Thu, 25 Jan 2024 01:37:57 +0000 (01:37 +0000)
Any completion style except for eglot--dumb-flex spells trouble for
Eglot, for the well known reason that LSP is geared towards completion
tooltips and none of Emacs' partial-completion shenanigans.

This commit puts a "try-completion" function that doesn't return nil
in the eglot--dumb-flex completion style so that other styles aren't
tried (partial-completion, in particular, errors out).

The function often doesn't do anything very useful, but at least it
doesn't stop the more usual *Completions* buffer from appearing.

* lisp/progmodes/eglot.el (eglot--dumb-tryc): New helper.
(completion-styles-alist): Add it to the dumb-flex style.

lisp/progmodes/eglot.el

index 511000927cf9db8d3646a59636a5dda41a421d60..c5fbf5eb9d5ea2b1d23abef1940a25344d0fb571 100644 (file)
@@ -3060,9 +3060,13 @@ for which LSP on-type-formatting should be requested."
            finally (cl-return comp)))
 
 (defun eglot--dumb-allc (pat table pred _point) (funcall table pat pred t))
+(defun eglot--dumb-tryc (pat table pred point)
+  (if-let ((probe (funcall table pat pred nil)))
+      (cons probe (length probe))
+    (cons pat point)))
 
 (add-to-list 'completion-category-defaults '(eglot-capf (styles eglot--dumb-flex)))
-(add-to-list 'completion-styles-alist '(eglot--dumb-flex ignore eglot--dumb-allc))
+(add-to-list 'completion-styles-alist '(eglot--dumb-flex eglot--dumb-tryc eglot--dumb-allc))
 
 (defun eglot-completion-at-point ()
   "Eglot's `completion-at-point' function."