From 02229ebd63284d420d9b214bfab9197ed940723f Mon Sep 17 00:00:00 2001 From: Sebastian Gniazdowski Date: Thu, 12 May 2016 17:22:57 +0200 Subject: [PATCH] 'main': optimization that in my tests shows 2.7s -> 2.2s Consider indexing long buffers (say 300 chars). E.g. following line: integer offset=${${buf[start_pos+1,len]}[(i)$needle]} will gradually go into large indices for first index [a,] and be kept at large index for second index [,b]. Instead, we can remove already processed characters from buf: proc_buf="${proc_buf[offset + $#arg + 1,-1]}" $offset and $#arg are small, first index will not be large. $proc_buf will be smaller and smaller and the second index [,-1] will run shorter and shorter. --- highlighters/main/main-highlighter.zsh | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index a0f8dba..983ab35 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -199,6 +199,8 @@ _zsh_highlight_main_highlighter() # local this_word=':start:' next_word integer in_redirection + # Processing buffer + local proc_buf="$buf" for arg in ${interactive_comments-${(z)buf}} \ ${interactive_comments+${(zZ+c+)buf}}; do if (( in_redirection )); then @@ -234,14 +236,26 @@ _zsh_highlight_main_highlighter() # indistinguishable from 'echo foo echo bar' (one command with three # words for arguments). local needle=$'[;\n]' - integer offset=${${buf[start_pos+1,len]}[(i)$needle]} - (( start_pos += offset - 1 )) + integer offset=$(( ${proc_buf[(i)$needle]} - 1 )) + (( start_pos += offset )) (( end_pos = start_pos + $#arg )) else - ((start_pos+=(len-start_pos)-${#${${buf[start_pos+1,len]}##([[:space:]]|\\[[:space:]])#}})) + integer offset=$(((len-start_pos)-${#${proc_buf##([[:space:]]|\\[[:space:]])#}})) + ((start_pos+=offset)) ((end_pos=$start_pos+${#arg})) fi + # Above `if` computes new start_pos and end_pos. + # Here we compute new proc_buf. We advance it + # (chop off characters from the beginning) + # beyond what end_pos points to, by skipping + # as many characters as end_pos was advanced. + # + # end_pos was advanced by $offset (via start_pos) + # and by $#arg. Note the `start_pos=$end_pos` + # below. + proc_buf="${proc_buf[offset + $#arg + 1,-1]}" + if [[ -n ${interactive_comments+'set'} && $arg[1] == $histchars[3] ]]; then if [[ $this_word == *(':regular:'|':start:')* ]]; then style=comment