0
0
mirror of https://github.com/vim/vim.git synced 2025-07-24 10:45:12 -04:00

patch 9.1.0694: matchparen is slow on a long line

Problem:  The matchparen plugin is slow on a long line.
Solution: Don't use a regexp to get char at and before cursor.
          (zeertzjq)

Example:

```vim
  call setline(1, repeat(' foobar', 100000))
  runtime plugin/matchparen.vim
  normal! $hhhhhhhh
```

closes: #15568

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq 2024-08-24 16:32:24 +02:00 committed by Christian Brabandt
parent dc2c75c6b5
commit 81e7513c86
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
11 changed files with 114 additions and 6 deletions

View File

@ -60,12 +60,8 @@ func s:Highlight_Matching_Pair()
let before = 0
let text = getline(c_lnum)
let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
if empty(matches)
let [c_before, c] = ['', '']
else
let [c_before, c] = matches[1:2]
endif
let c_before = text->strpart(0, c_col - 1)->slice(-1)
let c = text->strpart(c_col - 1)->slice(0, 1)
let plist = split(&matchpairs, '.\zs[:,]')
let i = index(plist, c)
if i < 0

View File

@ -0,0 +1,10 @@
>a+0&#ffffff0@7|*&| +&@64
|b@3|*&|c+&@1| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|1|,|1| @10|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7>*0&#40ffff15| +0&#ffffff0@64
|b@3|*0&#40ffff15|c+0&#ffffff0@1| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|1|,|9| @10|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*&| +&@64
|b@3|*&|c+&>c| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|2|,|9|-|8| @8|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*0&#40ffff15| +0&#ffffff0@64
|b@3>*0&#40ffff15|c+0&#ffffff0@1| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|2|,|5| @10|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*&| +&@64
>b@3|*&|c+&@1| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
| +0#0000000&@56|2|,|1| @10|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*0&#40ffff15> +0&#ffffff0@64
|b@3|*0&#40ffff15|c+0&#ffffff0@1| @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|1|,|1|2|-|1@1| @6|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*&| +&@64
|b@3|*&|c+&@1> @66
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|2|,|1|0|-|9| @7|A|l@1|

View File

@ -0,0 +1,10 @@
|a+0&#ffffff0@7|*0&#40ffff15| +0&#ffffff0@64
|b@3|*0&#40ffff15> +0&#ffffff0@68
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|-+2#0000000&@1| |I|N|S|E|R|T| |-@1| +0&&@44|2|,|8|-|7| @8|A|l@1|

View File

@ -108,5 +108,35 @@ func Test_matchparen_pum_clear()
call StopVimInTerminal(buf)
endfunc
" Test that matchparen works with multibyte chars in 'matchpairs'
func Test_matchparen_mbyte()
CheckScreendump
let lines =<< trim END
source $VIMRUNTIME/plugin/matchparen.vim
call setline(1, ['aaaaaaaa', 'bbbbcc'])
set matchpairs+=:
END
call writefile(lines, 'XmatchparenMbyte', 'D')
let buf = RunVimInTerminal('-S XmatchparenMbyte', #{rows: 10})
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_1', {})
call term_sendkeys(buf, "$")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_2', {})
call term_sendkeys(buf, "j")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_3', {})
call term_sendkeys(buf, "2h")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_4', {})
call term_sendkeys(buf, "0")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_5', {})
call term_sendkeys(buf, "kA")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_6', {})
call term_sendkeys(buf, "\<Down>")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_7', {})
call term_sendkeys(buf, "\<C-W>")
call VerifyScreenDump(buf, 'Test_matchparen_mbyte_8', {})
call StopVimInTerminal(buf)
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
694,
/**/
693,
/**/