emacs/etc
João Távora aa181cd352 Rewrite flex completion with Gotoh algorithm
The greedy regexp matching, broken scoring and broken highlight were
sources of frequent complaints about the 'flex' matching style.  This
commit fixes that.

Inspired by the 'hotfuzz' style (available at
https://github.com/axelf4/hotfuzz) it uses a modified version of Gotoh's
1982 dynamic programming algorithm. It is strictly more correct than the
"old" flex.  For example, when matching the pattern 'goto' to no longer
will 'eglot-format' be sorted before some hypothetical much better
'goobarbaz-goto'.  And of course the highlighting is also correctly
placed on the 'goto', not scattered across the candidate.

Regarding performance, it is faster than the naive 'flex', primarily
because of the Elisp rewrite in minibuffer.el.  The matching and costing
algorithm matters but is not the bottleneck.

The Elisp parts of the style were almost completely decoupled from the
pcm/substring styles in lisp/minibuffer.el.  Only
'completion-flex-try-completion' uses some of pcm's code for pattern
augmentation.

* src/minibuf.c (completion--flex-cost-gotoh): New function.

* lisp/minibuffer.el (completion-flex--pattern-str): New variable.
(flex-score-match-tightness): Make obsolete.
(completion--flex-all-completions-1): New helper function.
(completion-flex-try-completion, completion-flex-all-completions): Rewrite.
(completion-substring--all-completions): No longer take transform-pattern-fn.
(completion--flex-adjust-metadata): Tweak.
(completion--flex-score, completion--flex-score-1)
(completion--flex-score-last-md, completion-flex--make-flex-pattern): Delete.

* test/lisp/minibuffer-tests.el (completion--sorted-flex-completions):
New helper function.
(completion-flex-test-non-ascii): New test.
(completion--pcm-score): Delete.
(completion-pcm-test-3, completion-pcm-test-4)
(completion-substring-test-1, completion-substring-test-2)
(completion-flex-test-2, completion-flex-test-3): Tweak.

* etc/NEWS: Describe change.
2026-02-13 23:46:11 +00:00
..
charsets ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
e Add auto-margin enable/disable to term 2025-03-02 16:01:13 -05:00
forms ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
gnus
images ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
nxml
org ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
refcards ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
schema ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
srecode ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
themes ; * etc/themes/modus-themes.el: Update comment. 2026-01-02 07:45:14 +01:00
tutorials ; List my areas of interest in maintaining. 2026-02-12 19:15:39 +01:00
AUTHORS Update files for Emacs 30.2 2025-08-14 04:05:28 -04:00
CALC-NEWS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ChangeLog.1 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
compilation.txt ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
COPYING
copyright-assign.txt Add assignment form as etc/copyright-assign.txt 2024-06-23 00:24:31 +02:00
DEBUG ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
DEVEL.HUMOR ; Fix punctuation in etc/* 2024-07-27 01:51:47 +02:00
DISTRIB ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
edt-user.el ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
EGLOT-NEWS Eglot: simplify Imenu setup again 2026-01-21 23:09:19 +00:00
emacs-buffer.gdb ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
emacs-mail.desktop
emacs.desktop
emacs.icon
emacs.metainfo.xml ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
emacs.service
emacs_lldb.py ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
emacsclient-mail.desktop Add 'server-eval-args-left' to server.el 2023-10-29 14:10:23 +02:00
emacsclient.desktop Make emacsclient handle org-protocol:// links 2023-09-18 12:54:22 +02:00
enriched.txt ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ERC-NEWS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ETAGS.EBNF ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ETAGS.README ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
future-bug ; Fix typos 2025-01-23 03:14:37 +01:00
gnus-tut.txt ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
grep.txt ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
HELLO ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
HISTORY Update files for Emacs 30.2 2025-08-14 04:05:28 -04:00
JOKES
MACHINES ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
MH-E-NEWS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS Rewrite flex completion with Gotoh algorithm 2026-02-13 23:46:11 +00:00
NEWS.1-17 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.18 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.19 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.20 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.21 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.22 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.23 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.24 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.25 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.26 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.27 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.28 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.29 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEWS.30 ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NEXTSTEP ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
NXML-NEWS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ORG-NEWS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
org.gnu.emacs.defaults.gschema.xml ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
package-autosuggest.eld Detect more package suggestions 2026-02-09 21:12:21 +01:00
package-keyring.gpg * etc/package-keyring.gpg: Update expiration and add new key 2024-10-22 12:35:18 -04:00
PROBLEMS ; Mention in PROBLEMS the issue with XIM character-selection window 2026-01-03 12:30:12 +02:00
ps-prin0.ps ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
ps-prin1.ps ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
publicsuffix.txt ; * etc/publicsuffix.txt: Update from upstream. 2024-12-22 13:50:41 +02:00
README ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
rgb.txt Revert "Update etc/rgb.txt from X.Org upstream" 2023-10-16 08:56:53 +08:00
ses-example.ses ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
spook.lines
symbol-releases.eld * etc/symbol-releases.eld: 'any' and 'all' added in Emacs 31 2026-02-01 18:20:56 +01:00
TERMS ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
TODO ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00
w32-feature.el ; Add 2026 to copyright years. 2026-01-01 12:54:34 +00:00

This directory contains the architecture-independent files used by or
with Emacs.  This includes some text files of documentation for GNU
Emacs or of interest to Emacs users, and the file of dumped docstrings
for Emacs functions and variables.

COPYRIGHT AND LICENSE INFORMATION FOR IMAGE FILES

File: emacs.icon
  Author: Sun Microsystems, Inc
  Copyright (C) 1999, 2001-2026 Free Software Foundation, Inc.
  License: GNU General Public License version 3 or later (see COPYING)