aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Távora2023-05-05 19:44:11 +0100
committerJoão Távora2023-05-05 19:46:50 +0100
commit0e8d8a72284f6b3aaa1bbce73d41c7d84bbc4d3c (patch)
tree700969180c5de784fb09db5f48c09f233b31b89e
parentf6476f8536853bd3e5577c76f619c7a9710cc46a (diff)
downloademacs-0e8d8a72284f6b3aaa1bbce73d41c7d84bbc4d3c.tar.gz
emacs-0e8d8a72284f6b3aaa1bbce73d41c7d84bbc4d3c.zip
Fido-mode: never shadow 'external' completion style
As explained in the manual (20.7.2 Fast minibuffer selection) 'fido-mode' and 'fido-vertical-mode' give priority the "flex" completion style. In fact, bug#62015 was recently fixed in commit because that priority was not taking place correctly and some completions were missed. However, an exception must be made for the 'external' completion style. That style, made available by the lisp/external-completion.el library, is specifically designed to work with backends that provide only a partial view of all completions. If we allow 'flex' to step in front of 'external' it could mean that 'flex' matches something and 'external' isn't triggered as it probably should. To reproduce have the rust-mode ELPA package and the rust-analyzer LSP server handy. Then: emacs -Q -f package-initialize main.rs Where main.rs is this content: fn foo1() {} fn foo2() {} fn foo3() {} fn foobar1() {} fn foobar2() {} fn foobar3() {} The rust-analyzer server can be quickly configured to return only 3 workspace symbols max, so evaluate: (setq-default eglot-workspace-configuration '(:rust-analyzer (:workspace (:symbol (:search (:limit 3)))))) Now start M-x eglot and M-x fido-vertical-mode and type C-u M-. to find an arbitrary symbol in this one-file project. Type 'f'. You will see the three foo's are listed, correctly. Now type '3'. You will only see "foo3". But that's wrong because "foobar3" was available, if only the server had been asked for it. This commit fixes the situation and no completions are lost. As an unfortunate side-effect of this commit, the fontification of completions-common-part on the matches is lost, but that is not worse than missing out on completions and there are better ways to recover the fontification anyway (in external-completion.el). See also: https://github.com/joaotavora/eglot/discussions/1219#discussioncomment-5818336 * lisp/icomplete.el (icomplete--fido-ccd): Do not touch entries with 'external in them.
-rw-r--r--lisp/icomplete.el5
1 files changed, 4 insertions, 1 deletions
diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 6ed2cbe395c..e6fdd1f1836 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -427,7 +427,10 @@ if that doesn't produce a completion match."
427 for (cat . alist) in completion-category-defaults collect 427 for (cat . alist) in completion-category-defaults collect
428 `(,cat . ,(cl-loop 428 `(,cat . ,(cl-loop
429 for entry in alist for (prop . val) = entry 429 for entry in alist for (prop . val) = entry
430 if (eq prop 'styles) 430 if (and (eq prop 'styles)
431 ;; Never step in front of 'external', as that
432 ;; might lose us completions.
433 (not (memq 'external val)))
431 collect `(,prop . (flex ,@(delq 'flex val))) 434 collect `(,prop . (flex ,@(delq 'flex val)))
432 else collect entry)))) 435 else collect entry))))
433 436