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:
parent
dc2c75c6b5
commit
81e7513c86
@ -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
|
||||
|
10
src/testdir/dumps/Test_matchparen_mbyte_1.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_1.dump
Normal 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|
|
10
src/testdir/dumps/Test_matchparen_mbyte_2.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_2.dump
Normal file
@ -0,0 +1,10 @@
|
||||
|a+0&#ffffff0@7>(*0(ffff15| +0&#ffffff0@64
|
||||
|b@3|)*0(ffff15|c+0&#ffffff0@1| @66
|
||||
|~+0#4040ff13&| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
| +0#0000000&@56|1|,|9| @10|A|l@1|
|
10
src/testdir/dumps/Test_matchparen_mbyte_3.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_3.dump
Normal 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|
|
10
src/testdir/dumps/Test_matchparen_mbyte_4.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_4.dump
Normal file
@ -0,0 +1,10 @@
|
||||
|a+0&#ffffff0@7|(*0(ffff15| +0&#ffffff0@64
|
||||
|b@3>)*0(ffff15|c+0&#ffffff0@1| @66
|
||||
|~+0#4040ff13&| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
|~| @73
|
||||
| +0#0000000&@56|2|,|5| @10|A|l@1|
|
10
src/testdir/dumps/Test_matchparen_mbyte_5.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_5.dump
Normal 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|
|
10
src/testdir/dumps/Test_matchparen_mbyte_6.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_6.dump
Normal file
@ -0,0 +1,10 @@
|
||||
|a+0&#ffffff0@7|(*0(ffff15> +0&#ffffff0@64
|
||||
|b@3|)*0(ffff15|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|
|
10
src/testdir/dumps/Test_matchparen_mbyte_7.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_7.dump
Normal 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|
|
10
src/testdir/dumps/Test_matchparen_mbyte_8.dump
Normal file
10
src/testdir/dumps/Test_matchparen_mbyte_8.dump
Normal file
@ -0,0 +1,10 @@
|
||||
|a+0&#ffffff0@7|(*0(ffff15| +0&#ffffff0@64
|
||||
|b@3|)*0(ffff15> +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|
|
@ -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(', 'bbbb)cc'])
|
||||
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
|
||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
694,
|
||||
/**/
|
||||
693,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user