diff options
| author | Johannes Altmanninger <aclopte@gmail.com> | 2023-05-28 22:55:46 +0200 |
|---|---|---|
| committer | Johannes Altmanninger <aclopte@gmail.com> | 2023-06-02 22:38:32 +0200 |
| commit | b7e9d9bae301ecf1e803c133b094e0cd708b730b (patch) | |
| tree | 00baccc686d5dadb56d5da3e676d77aff98d1d6f | |
| parent | 7f950bc4a97a9eac6714573faf5928ad88d0eb4b (diff) | |
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
| -rw-r--r-- | rc/detection/modeline.kak | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/rc/detection/modeline.kak b/rc/detection/modeline.kak index a2c5fef7..6e067b1a 100644 --- a/rc/detection/modeline.kak +++ b/rc/detection/modeline.kak @@ -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 } } } |
