mirror of
https://github.com/neovim/neovim.git
synced 2024-09-17 20:58:20 -04:00
vim-patch:9.1.0694: matchparen is slow on a long line (#30134)
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: vim/vim#15568
81e7513c86
This commit is contained in:
parent
84f1c5e072
commit
cf44121f7f
@ -60,12 +60,8 @@ func s:Highlight_Matching_Pair()
|
|||||||
let before = 0
|
let before = 0
|
||||||
|
|
||||||
let text = getline(c_lnum)
|
let text = getline(c_lnum)
|
||||||
let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
|
let c_before = text->strpart(0, c_col - 1)->slice(-1)
|
||||||
if empty(matches)
|
let c = text->strpart(c_col - 1)->slice(0, 1)
|
||||||
let [c_before, c] = ['', '']
|
|
||||||
else
|
|
||||||
let [c_before, c] = matches[1:2]
|
|
||||||
endif
|
|
||||||
let plist = split(&matchpairs, '.\zs[:,]')
|
let plist = split(&matchpairs, '.\zs[:,]')
|
||||||
let i = index(plist, c)
|
let i = index(plist, c)
|
||||||
if i < 0
|
if i < 0
|
||||||
|
@ -120,8 +120,7 @@ describe('matchparen', function()
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
feed('i<C-X><C-N><C-N>')
|
feed('i<C-X><C-N><C-N>')
|
||||||
screen:expect {
|
screen:expect([[
|
||||||
grid = [[
|
|
||||||
aa |
|
aa |
|
||||||
aaa |
|
aaa |
|
||||||
aaaa |
|
aaaa |
|
||||||
@ -131,7 +130,79 @@ describe('matchparen', function()
|
|||||||
{4: aaaa }{1: }|
|
{4: aaaa }{1: }|
|
||||||
{1:~ }|
|
{1:~ }|
|
||||||
{5:-- }{6:match 2 of 3} |
|
{5:-- }{6:match 2 of 3} |
|
||||||
]],
|
]])
|
||||||
}
|
end)
|
||||||
|
|
||||||
|
-- oldtest: Test_matchparen_mbyte()
|
||||||
|
it("works with multibyte chars in 'matchpairs'", function()
|
||||||
|
local screen = Screen.new(30, 10)
|
||||||
|
screen:set_default_attr_ids({
|
||||||
|
[0] = { bold = true, foreground = Screen.colors.Blue },
|
||||||
|
[1] = { background = Screen.colors.Cyan },
|
||||||
|
[2] = { bold = true },
|
||||||
|
})
|
||||||
|
screen:attach()
|
||||||
|
|
||||||
|
exec([[
|
||||||
|
source $VIMRUNTIME/plugin/matchparen.vim
|
||||||
|
call setline(1, ['aaaaaaaa(', 'bbbb)cc'])
|
||||||
|
set matchpairs+=(:)
|
||||||
|
]])
|
||||||
|
|
||||||
|
screen:expect([[
|
||||||
|
^aaaaaaaa( |
|
||||||
|
bbbb)cc |
|
||||||
|
{0:~ }|*7
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('$')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa{1:^(} |
|
||||||
|
bbbb{1:)}cc |
|
||||||
|
{0:~ }|*7
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('j')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa( |
|
||||||
|
bbbb)c^c |
|
||||||
|
{0:~ }|*7
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('2h')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa{1:(} |
|
||||||
|
bbbb{1:^)}cc |
|
||||||
|
{0:~ }|*7
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('0')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa( |
|
||||||
|
^bbbb)cc |
|
||||||
|
{0:~ }|*7
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('kA')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa{1:(}^ |
|
||||||
|
bbbb{1:)}cc |
|
||||||
|
{0:~ }|*7
|
||||||
|
{2:-- INSERT --} |
|
||||||
|
]])
|
||||||
|
feed('<Down>')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa( |
|
||||||
|
bbbb)cc^ |
|
||||||
|
{0:~ }|*7
|
||||||
|
{2:-- INSERT --} |
|
||||||
|
]])
|
||||||
|
feed('<C-W>')
|
||||||
|
screen:expect([[
|
||||||
|
aaaaaaaa{1:(} |
|
||||||
|
bbbb{1:)}^ |
|
||||||
|
{0:~ }|*7
|
||||||
|
{2:-- INSERT --} |
|
||||||
|
]])
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@ -108,5 +108,35 @@ func Test_matchparen_pum_clear()
|
|||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user