mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -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:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							dc2c75c6b5
						
					
				
				
					commit
					81e7513c86
				
			| @@ -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 | ||||||
|   | |||||||
							
								
								
									
										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) |   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 | ||||||
|   | |||||||
| @@ -704,6 +704,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     694, | ||||||
| /**/ | /**/ | ||||||
|     693, |     693, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user