feat(editor): smartcase + accent-folded search

Supersedes the plain case-insensitive matcher from earlier today (user
decision): an all-lowercase pattern searches case-insensitively, one
capital makes it exact (vim smartcase), and diacritics always fold both
ways — /ete finds été, /été finds ete. fold() strips the Latin-1
accent set (ligatures œ/æ excluded: they fold to two chars); n/N
recompute the smartcase verdict from the remembered pattern so repeats
behave like the original search.
This commit is contained in:
Julien Calixte
2026-07-14 09:29:31 +02:00
parent 11545efb0a
commit 761fd3a750
2 changed files with 101 additions and 38 deletions

View File

@@ -16,10 +16,14 @@ test to close the version.** Run-1 bonus: the first on-device
rejected-push → reconcile → replay → push success (replay commit 59444a94).
- [x] `/` forward search, `n N` — core 2026-07-13, panel-verified 2026-07-14
(including `n`/`N`). Literal, **case-insensitive** substring (Unicode
lowercase fold — `É` matches `é`; no regex on-device; deliberately not
smartcase: a capital silently flipping to exact-match is a surprise, not
a feature, on a writing appliance). `/` reuses the `:` command line's
(including `n`/`N`). Literal substring (no regex on-device), matched
**smartcase + accent-folded** (2026-07-14, user decision — supersedes
the same-day plain-insensitive version): an all-lowercase pattern is
case-insensitive, one capital makes it exact (vim smartcase), and
diacritics always fold both ways — `/ete` finds `été`, `/été` finds
`ete` (Latin-1 repertoire; ligatures `œ`/`æ` excluded — they fold to
two chars). `n`/`N` recompute smartcase from the remembered pattern, so
repeats behave like the original search. `/` reuses the `:` command line's
editing with a `/` prompt (one command-line mode, as in vim), and the
jump happens on **Enter only** — no incremental caret-chasing, for the
same e-ink-refresh reason snippets have no completion popup. Wraps