rc detection modeline: optimize modeline pre-filtering

modeline-parse leads by matching an expensive regex against the entire buffer,
which can take a long time on huge files.

Perl takes too long on this regex and it seems not even ripgrep
optimizes the \z component

	$ ruby -e '10000.times { puts "a" * 10000 }' > big
	$ time rg --multiline --only-matching '\A(.+\n){1,5}|(.+\n){1,5}\z' big | wc -l
	10
	__________________________
	Executed in  419.81 millis
	   usr time  399.84 millis
	   sys time   20.78 millis

where

	$ time kak big -e q
	__________________________
	Executed in  179.19 millis
	   usr time  133.61 millis
	   sys time   53.50 millis

Let's lose the regex.

Fixes #4911
main
Johannes Altmanninger 2023-05-28 22:55:46 +02:00
parent 7f950bc4a9
commit b7e9d9bae3
1 changed files with 4 additions and 3 deletions

View File

@ -114,9 +114,10 @@ define-command -hidden modeline-parse-impl %{
# [text]{white}{vi:|vim:|ex:}[white]{options}
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
define-command modeline-parse -docstring "Read and interpret vi-format modelines at the beginning/end of the buffer" %{
try %{ evaluate-commands -draft %{
execute-keys <percent> "s(?S)\A(.+\n){,%opt{modelines}}|(.+\n){,%opt{modelines}}\z<ret>" \
s^\S*?\s+?\w+:\s?[^\n]+<ret> x
try %{ evaluate-commands -draft -save-regs ^ %{
execute-keys -save-regs "" gk %opt{modelines} JK x Z
execute-keys gj %opt{modelines} KJ x <a-z> a
execute-keys s^\S*?\s+?\w+:\s?[^\n]+<ret> x
evaluate-commands -draft -itersel modeline-parse-impl
} }
}