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 ---
This commit is contained in:
+27
-17
@@ -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<list,delimiters>> 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 = '\%(\\\|\\\@<!' . r_repeat_del . '\)'
|
||||
|
||||
" Regex Start:
|
||||
" Left-Flanking is not followed by space (or need of line)
|
||||
let r_left_prefix = '\%(^\|[[:space:]]\@<=\)'
|
||||
let r_left_prefix = '\\\@<!'
|
||||
" -- not followed by Unicode whitespace,
|
||||
let r_left_suffix = '\%([[:space:]\n]\@!\)'
|
||||
|
||||
" Left Case1: not followed by punctuation
|
||||
let r_left_suffix1 = '\%(\%([[:space:]\n' . punctuation . ']\)\@!\)'
|
||||
" Left Case1: not followed by punctuation, start with blacklist
|
||||
" -- Can escape the leftflank
|
||||
let r_left_prefix1 = '\%(^\|\\\@<!\)'
|
||||
let r_left_prefix1 = '\%(^\|' . r_unescaped_repeat . '\@<!\)'
|
||||
let r_left_suffix1 = '\%(\%([[:space:]\n' . punctuation . ']\|' . r_unescaped_repeat . '\)\@!\)'
|
||||
|
||||
" Left Case2: followed by punctuation so must be preceded by Unicode whitespace or start of line or a punctuation character.
|
||||
let r_left_suffix2 = '\%([' . punctuation . ']\@=\)'
|
||||
" Left Case2: followed by punctuation so must be preceded by whitelisted Unicode whitespace or start of line or a punctuation character.
|
||||
let r_left_prefix2 = '\%(\%(^\|[[:space:]\n' . punctuation . ']\)\@<=\)'
|
||||
let r_left_suffix2 = '\%([' . punctuation . ']\@=\)'
|
||||
|
||||
" Left Concatenate
|
||||
let r_start = '\%(' . r_left_prefix1 . r_left_del . r_left_suffix1
|
||||
let r_start .= '\|' . r_left_prefix2 . r_left_del . r_left_suffix2 . '\)'
|
||||
let r_start = '\%(' . r_left_prefix1 . '\zs' . r_left_repeat . '\ze' . r_left_suffix1
|
||||
let r_start .= '\|' . r_left_prefix2 . '\zs' . r_left_repeat . '\ze' . r_left_suffix2 . '\)'
|
||||
|
||||
" Regex End:
|
||||
" not preceded by Unicode whitespace
|
||||
let r_right_prefix = '\(^\|[^[:space:]]\@<=\)'
|
||||
|
||||
" Right Case1: not preceded by a punctuation character (or start of line)
|
||||
let r_right_prefix1 = '\%(\%(^\|[^[:space:]' . punctuation . ']\)\@<=\)'
|
||||
let r_right_suffix1 = ''
|
||||
let r_right_prefix1 = '\%(^\|\%([[:space:]\n' . punctuation . ']\|' . r_unescaped_repeat . '\)\@<!\)'
|
||||
let r_right_suffix1 = '\%($\|' . r_unescaped_repeat . '\@!\)'
|
||||
|
||||
" Right Case2: preceded by a punctuation character and followed by Unicode whitespace or end of line or a punctuation character
|
||||
" Right Case2: preceded by a punctuation character and followed by Unicode whitespace or end of line or a punctuation character
|
||||
let r_right_prefix2 = '\%([' . punctuation . ']\@<=\)'
|
||||
let r_right_suffix2 = '\%(\%($\|[[:space:]' . punctuation . ']\)\@<=\)'
|
||||
|
||||
" Right Concatenate
|
||||
let r_end = '\%(' . r_right_prefix1 . r_right_del . r_right_suffix1
|
||||
let r_end .= '\|' . r_right_prefix2 . r_right_del . r_right_suffix2 . '\)'
|
||||
let r_end = '\%(' . r_right_prefix1 . r_right_repeat . r_right_suffix1
|
||||
let r_end .= '\|' . r_right_prefix2 . r_right_repeat . r_right_suffix2 . '\)'
|
||||
|
||||
call add(res, [r_start, r_end])
|
||||
endfor
|
||||
|
||||
Reference in New Issue
Block a user