From 994de513a23210f1f4d50d24270f8f988abdd21c Mon Sep 17 00:00:00 2001 From: Gerion Entrup Date: Wed, 19 Jul 2017 00:13:52 +0200 Subject: [PATCH] t-vim: extended escape mode With this change it is possible to define one or more escapechars, that are used by vim to recognize parts that should not be interpreted. --- 2context.vim | 50 +++++++++++++++++++++++++++++++++----------------- t-vim.tex | 12 ++---------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/2context.vim b/2context.vim index 9c72ba1..b208e65 100644 --- a/2context.vim +++ b/2context.vim @@ -8,6 +8,11 @@ " output buffer. The script parses content line-by-line from the first buffer " and pastes the modified result on the second buffer. +" Compare a char of at with some Unicode +function UnicodeCompare(string, bytepos, ochar) + return strpart(a:string, a:bytepos, max([strlen(a:ochar), 1])) ==# a:ochar +endfunction + " Split screen and go to the second buffer, ensure modifiable is set, and the " buffer is empty. sblast @@ -38,9 +43,9 @@ if !exists("highlight") let highlight=[] endif -" Set escapecomments -if !exists("escapecomments") - let escapecomments=0 +" Set escapechar +if !exists("escapechar") + let escapechar='' endif let s:strip = strlen( matchstr( getline(s:lstart), '^\s*' ) ) @@ -71,37 +76,48 @@ let s:lines = [] let s:buffer_lnum = 1 let s:lnum = s:lstart +let s:lenesc = strlen(escapechar) + while s:lnum <= s:lstop " Get the current line let s:line = getline(s:lnum) let s:len = strlen(s:line) - let s:new = '' + let s:new = '' " Loop over each character in the line - let s:col = s:strip + 1 - while s:col <= s:len + let s:col = s:strip + while s:col < s:len let s:startcol = s:col " The start column for processing text - let s:id = synID (s:lnum, s:col, 1) - let s:col = s:col + 1 + let s:temp = '' +" ignore escaped sequences + if UnicodeCompare(s:line, s:col, escapechar) + let s:nextesc = stridx(s:line, escapechar, s:col + 1) + let s:temp = strpart(s:line, s:col + s:lenesc, s:nextesc - s:col - s:lenesc) + let s:col = s:nextesc + s:lenesc + let s:startcol = s:col + endif + if s:col > s:len + let s:id = 0 " dummy id if whole line is escaped + else + let s:id = synID (s:lnum, s:col + 1, 1) + let s:col = s:col + 1 " Speed loop (it's small - that's the trick) -" Go along till we find a change in synID - while s:col <= s:len && s:id == synID(s:lnum, s:col, 1) - let s:col = s:col + 1 - endwhile +" Go along till we find a change in synID or an escapechar + while s:col < s:len && !UnicodeCompare(s:line, s:col, escapechar) && s:id == synID(s:lnum, s:col + 1, 1) + let s:col = s:col + 1 + endwhile + endif " Output the text with the same synID, with class set to {s:id_name} let s:id = synIDtrans (s:id) let s:id_name = synIDattr (s:id, "name", "gui") - let s:temp = strpart(s:line, s:startcol - 1, s:col - s:startcol) + let s:part = strpart(s:line, s:startcol, s:col - s:startcol) + let s:temp = s:temp . escape( s:part, '\{}') " Remove line endings (on unix machines reading windows files) let s:temp = substitute(s:temp, '\r*$', '', '') " It might have happened that that one has been the last item in a row, so " we don't need to print in in that case if strlen(s:temp) > 0 -" Change special TeX characters to escape sequences. - if !(escapecomments && s:id_name == "Comment") - let s:temp = escape( s:temp, '\{}') - endif if !empty(s:id_name) let s:temp = '\SYN[' . s:id_name . ']{' . s:temp . '}' endif diff --git a/t-vim.tex b/t-vim.tex index 542261f..9d0bb50 100644 --- a/t-vim.tex +++ b/t-vim.tex @@ -129,7 +129,7 @@ -c "let contextstartline=\externalfilterparameter\c!start \letterbar\space % let contextstopline=\externalfilterparameter\c!stop \letterbar\space % let strip=\getvalue{\vimtyping@id-\c!strip-\externalfilterparameter\c!strip}" % - -c "let escapecomments=\getvalue{\vimtyping@id-\c!escape-\externalfilterparameter\c!escape}" % + -c "let escapechar='°'" % -c "let highlight=[\externalfilterparameter\c!highlight]" % \vimrc_extras\space -c "source \vimtyping@script_name" % @@ -140,18 +140,10 @@ \setvalue{\vimtyping@id-\c!strip-\v!off}{0} \setvalue{\vimtyping@id-\c!strip-\v!on}{1} -\setvalue{\vimtyping@id-\c!escape-\v!off}{0} -\setvalue{\vimtyping@id-\c!escape-\v!on}{1} - - % Undocumented ... but useful if the user makes a mistake \setvalue{\vimtyping@id-\c!strip-\v!no}{0} \setvalue{\vimtyping@id-\c!strip-\v!yes}{1} -\setvalue{\vimtyping@id-\c!escape-\v!no}{0} -\setvalue{\vimtyping@id-\c!escape-\v!yes}{1} - - \setupvimtyping [% \c!tab=4, % \c!start=1, @@ -163,7 +155,7 @@ % \c!style=\tttf, % \c!color=, \c!strip=\v!off, - \c!escape=\v!off, + % \c!escapechar=, % \c!highlight=, % \c!highlightcolor=lightgray, \c!filtercommand=\vimtyping@filter_command, -- 2.13.0