From 78c60342022bc44307ad789aaef163ab96ebd08b Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 28 Sep 2026 11:48:17 -0300 Subject: A regular expression search comes back: costly patterns refused, long lines windowed, 300 ms deadline mvzr backtracks with no bound on its work (a*a*a*a*x over a hundred a's takes a second, each repeat multiplying by the haystack length), and a search runs holding the editor's turn, so one pasted pattern froze the editor. pardes does not write or vendor a regex engine, so regexp.zig bounds what it hands mvzr: more than four repeats is refused, a line longer than a window sized from measured worst cases is searched in half-overlapping windows, and a deadline stops the search. addr names each failure; normal s/S keeps what it found. The prescan also stops reading an escaped backslash before n as a newline, and ends a class where mvzr does. Co-Authored-By: Claude Opus 5.5 --- docs/helix-keys.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'docs/helix-keys.md') diff --git a/docs/helix-keys.md b/docs/helix-keys.md index f2855b3a..087b83d0 100644 --- a/docs/helix-keys.md +++ b/docs/helix-keys.md @@ -249,7 +249,10 @@ compiles a runtime pattern with no allocator, called the way sam searches (`src/regexp.zig`, shared with a pane's `addr` file): each line is its own haystack, so `^` and `$` match at every line's start and end and `.` never crosses a newline, and a pattern naming `\n` runs over the whole selection. -Where helix's `^` is only the selection's start, this is sam's. +Where helix's `^` is only the selection's start, this is sam's. mvzr +backtracks without bound, so the caps docs/fs.md gives for `addr` hold +here too: more than four repeats will not compile (the selection is left +alone) and a search past 300 ms keeps the matches it found so far. | Key | Behavior | Notes | Status | | --- | --- | --- | --- | -- cgit v1.3