Skip to content

markdownError look-behind is slower than necessary - #232

Open
jvoisin wants to merge 1 commit into
tpope:masterfrom
jvoisin:mderr
Open

markdownError look-behind is slower than necessary#232
jvoisin wants to merge 1 commit into
tpope:masterfrom
jvoisin:mderr

Conversation

@jvoisin

@jvoisin jvoisin commented Sep 9, 2026

Copy link
Copy Markdown

Problem: The markdownError syntax rule uses an unbounded look-behind
"\w@<=\w@=" which fires on every underscore and rescans
backward further than needed, making it the highest-cost inline
rule on snake_case-heavy text.
Solution: Bound the look-behind to one byte and use "\ze" for the trailing
word-character check: "\w@1<=
\ze\w". Byte-identical highlighting,
~27% faster for that rule on underscore-heavy input.

The rule flags an underscore between two word characters (e.g. foo_bar). "\w@1<=" checks exactly the preceding byte instead of the unbounded "\w@<=", and "\ze" ends the match before the following word character instead of a separate look-ahead. The match boundaries are unchanged, including for consecutive underscores such as "a__b" and "a_b_c".

Signed-off-by: Julien Voisin <julien.voisin@dustri.org

Problem:  The markdownError syntax rule uses an unbounded look-behind
          "\w\@<=_\w\@=" which fires on every underscore and rescans
          backward further than needed, making it the highest-cost inline
          rule on snake_case-heavy text.
Solution: Bound the look-behind to one byte and use "\ze" for the trailing
          word-character check: "\w\@1<=_\ze\w". Byte-identical highlighting,
          ~27% faster for that rule on underscore-heavy input.

The rule flags an underscore between two word characters (e.g. foo_bar).
"\w\@1<=" checks exactly the preceding byte instead of the unbounded
"\w\@<=", and "\ze" ends the match before the following word character
instead of a separate look-ahead. The match boundaries are unchanged,
including for consecutive underscores such as "a__b" and "a_b_c".

Signed-off-by: Julien Voisin <julien.voisin@dustri.org
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant