From 72d02207b021b968a185ed68b949c7a15f82c3d4 Mon Sep 17 00:00:00 2001 From: Tinmarino Date: Sat, 18 Mar 2023 01:45:02 -0300 Subject: [PATCH] Syntax: Fasten highlighting, from 200ms to 20ms for first screen update Problem: The loading of a .md file was slow due to multiple nested lookback. It is advised in vim help to prefer \zs, see :h /\@< Anyway, it is useless to nest them. 089.080 000.085 000.085: sourcing /home/mtourneb/.vim/after/syntax/vimwiki.vim 089.264 005.184: opening buffers 089.322 000.058: BufEnter autocommands 089.323 000.001: editing files in windows 089.414 000.091: VimEnter autocommands 089.415 000.001: before starting main loop 303.698 214.283: first screen update 303.700 000.002: --- VIM STARTED --- Solution: Remove the function s:expand_delimiter in vars.vim. It was doing a duplicate job with vimwiki#u#hi_expand_regex And ... well avoid lookback as much as possible 091.784 000.087 000.087: sourcing /home/mtourneb/.vim/after/syntax/vimwiki.vim 091.991 006.034: opening buffers 092.050 000.059: BufEnter autocommands 092.052 000.002: editing files in windows 092.172 000.120: VimEnter autocommands 092.173 000.001: before starting main loop 112.574 020.401: first screen update 112.578 000.004: --- VIM STARTED --- --- autoload/vimwiki/u.vim | 44 +++++++++++++++---------- autoload/vimwiki/vars.vim | 43 +++++------------------- test/search.vader | 7 +++- test/syntax.vader | 4 ++- test/syntax_markdown_gfm_typeface.vader | 4 +-- 5 files changed, 46 insertions(+), 56 deletions(-) diff --git a/autoload/vimwiki/u.vim b/autoload/vimwiki/u.vim index 26e91cd..d2e3851 100644 --- a/autoload/vimwiki/u.vim +++ b/autoload/vimwiki/u.vim @@ -295,13 +295,19 @@ endfunction function! vimwiki#u#get_punctuation_string() abort " Faster " See: https://github.github.com/gfm/#ascii-punctuation-character - return '!"#$%&''()*+,-./:;<=>?@\[\\\]^`{}|~' + " res = '!"#$%&''()*+,-./:;<=>?@\[\\\]^`{}|~' + " But I removed the * as it is treated as a special case + return '!"#$%&''()+,-./:;<=>?@\[\\\]^`{}|~' endfunction function! vimwiki#u#hi_expand_regex(lst) abort " Helper: Expand regex from reduced typeface delimiters " :param: list> with reduced regex + " 1: Left delimiter + " 2: right delimiter + " 3: possible characters to ignore (default '$^' => never match) + " 4: can multiply delimiter (boolean) (default 0 => do not repeat) " Return: list with extended regex delimiters (not inside a word) " -- [['\*_', '_\*']] -> [['\*_\S\@=', '\S\@<=_\*\%(\s\|$\)\@=']] " Note: For purposes of this definition, the beginning and the end of the line count as Unicode whitespace. @@ -313,42 +319,46 @@ function! vimwiki#u#hi_expand_regex(lst) abort for a_delimiter in a:lst let r_left_del = a_delimiter[0] let r_right_del = a_delimiter[1] + let r_repeat_del = len(a_delimiter) >= 3 ? a_delimiter[2] : '$^' + let b_can_mult = len(a_delimiter) >= 4 ? a_delimiter[3] : 0 + + " Craft the repeatable middle + let r_mult = b_can_mult ? '\+' : '' + let r_left_repeat = '\%(\%(' . r_left_del . '\)' . r_mult . '\)' + let r_right_repeat = '\%(\%(' . r_right_del . '\)' . r_mult . '\)' + let r_unescaped_repeat = '\%(\\\|\\\@ 1 && a:delim[-2:-2] ==# '\') ? a:delim[-2:-1] : a:delim[-1:] - " Hardcode for markdown - let c_start = '[_*]' - let c_end = '[_*]' - - let rx_mult = a:b_can_mult ? '\+' : '' - - let rx_start = '\%(^\|\%(\\\@ output silent execute a:search_command redir END + + " The location list should not be empty Assert !empty(getloclist(0)), a:test_name.": no location list result" + + " The location list should contains entries Assert match(output, '\d of \d') > -1, a:test_name.": no result message" " Tests that VimwikiSearch is quoting the pattern correctly. @@ -30,7 +36,6 @@ Execute (Search test wiki): AssertEqual "= Test Wiki =", getline(1) AssertEqual "vimwiki", &filetype - call TestSearch('VimwikiSearch foo', 'pattern with no spaces') call TestSearch('VimwikiSearch foo bar', 'pattern with spaces') call TestSearch('VimwikiSearch foo\bar', 'pattern with ''\''') diff --git a/test/syntax.vader b/test/syntax.vader index c27181a..181f2b0 100644 --- a/test/syntax.vader +++ b/test/syntax.vader @@ -37,6 +37,7 @@ Given vimwiki (Markdown typeface with escape sequence #1044: _ __ * ** {{{2): a ~~staaill deleted~~ Del 9 $$Eq\$$ uation follows$ Math 10 `code \` not finished inline` Code 11 + 012345678901234567890 Execute (Set syntax markdown): call SetSyntax('markdown') @@ -48,7 +49,8 @@ Execute (Assert Syntax of escape typeface): AssertEqual 'VimwikiBold4' , SyntaxAt(4, 14) . 4 AssertEqual 'VimwikiItalic5' , SyntaxAt(5, 14) . 5 " See: #1303 where an escape start can close the region - AssertEqual '6' , SyntaxAt(6, 14) . 6 + " Fixed removing vars.vim::expand_delimiter + AssertEqual 'VimwikiItalic6' , SyntaxAt(6, 14) . 6 AssertEqual 'VimwikiSuperScript7', SyntaxAt(7, 14) . 7 AssertEqual 'VimwikiSubScript8' , SyntaxAt(8, 14) . 8 AssertEqual 'VimwikiDelText9' , SyntaxAt(9, 14) . 9 diff --git a/test/syntax_markdown_gfm_typeface.vader b/test/syntax_markdown_gfm_typeface.vader index 75cade9..33820f1 100644 --- a/test/syntax_markdown_gfm_typeface.vader +++ b/test/syntax_markdown_gfm_typeface.vader @@ -623,8 +623,8 @@ Execute (Set Markdown): Execute (Assert Syntax): CommentLine 'Empty emphasis' - AssertEqual '', SyntaxAt(1, 1) - AssertEqual '', SyntaxAt(2, 1) + AssertEqual '1', SyntaxAt(1, 1) . 1 + AssertEqual '2', SyntaxAt(2, 1) . 2 Given vimwiki (Typeface: https://github.github.com/gfm/#example-446):