From 53d8b3ce05322e40498e8fcad672eee6cf3da51d Mon Sep 17 00:00:00 2001 From: Thomas Jensen Date: Sat, 27 Mar 2021 22:04:48 +0100 Subject: [PATCH] Improve Vim syntax file DELIM statement #63 Where DELIM is used to change the escape character for strings, Vim now colors the strings correctly. --- boxes.vim | 142 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 31 deletions(-) diff --git a/boxes.vim b/boxes.vim index 16aafd9..41ecfd5 100644 --- a/boxes.vim +++ b/boxes.vim @@ -12,8 +12,9 @@ " --------------- " Latest version available from: " https://github.com/ascii-boxes/boxes/blob/master/boxes.vim -" Status: This syntax file is not officially part of a boxes release, and simply intended to be downloaded via the link -" above, but we think it's great when it gets packaged and installed with boxes! +" Status: Stable +" Notes: - Vim requires this file to have system-dependent line endings (CR/LF on Windows, just LF otherwise) +" - To activate, copy this file to $VIMRUNTIME/syntax/, for example /usr/share/vim/vim81/syntax/. " Known Issues: " https://github.com/ascii-boxes/boxes/issues?q=is%3Aissue+is%3Aopen+Vim+Syntax " _____________________________________________________________________________________________________________________ @@ -39,9 +40,9 @@ syntax iskeyword a-z,A-Z " " Key Words " -syntax keyword boxesClassicKeywords author designer revision created revdate tags indent skipwhite skipempty nextgroup=boxesString -syntax keyword boxesBlocks elastic replace reverse padding shapes skipwhite skipempty -syntax keyword boxesRegStuff with to once global skipwhite skipempty +syntax keyword boxesClassicKeywords author designer revision created revdate tags indent +syntax keyword boxesBlocks elastic replace reverse padding shapes +syntax keyword boxesRegStuff with to once global syntax keyword boxesParent parent skipwhite nextgroup=boxesParentPath,boxesParentGlobal syntax keyword boxesEnd end skipwhite skipempty nextgroup=boxesNameAtEnd @@ -53,9 +54,6 @@ syntax keyword boxesShapes se sse s ssw sw wsw w wnw syntax keyword boxesPads a[ll] l[eft] r[ight] t top syntax keyword boxesPads b[ottom] h[orizontal] v[ertical] -" Delimiter statement -syntax keyword boxesDelim delim delimiter skipwhite skipempty nextgroup=boxesDelSpec - " " Error - this is matched when the others don't match @@ -63,31 +61,92 @@ syntax keyword boxesDelim delim delimiter skipwhite skipempty nextgroup=boxesDe syntax match boxesError /\S/ -" -" Main syntax definition part -" +" Delim Regions +" Within these regions, a different special character is used as escape character in strings. +syntax region delimRegion01 matchgroup=boxesString start=/[ \t\r\n]\+"[~'`!@%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString01,boxesList01,@boxesDelimContained +syntax region delimRegion02 matchgroup=boxesString start=/[ \t\r\n]\+\~["'`!@%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString02,boxesList02,@boxesDelimContained +syntax region delimRegion03 matchgroup=boxesString start=/[ \t\r\n]\+'["~`!@%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString03,boxesList03,@boxesDelimContained +syntax region delimRegion04 matchgroup=boxesString start=/[ \t\r\n]\+`["~'!@%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString04,boxesList04,@boxesDelimContained +syntax region delimRegion05 matchgroup=boxesString start=/[ \t\r\n]\+!["~'`@%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString05,boxesList05,@boxesDelimContained +syntax region delimRegion06 matchgroup=boxesString start=/[ \t\r\n]\+@["~'`!%&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString06,boxesList06,@boxesDelimContained +syntax region delimRegion07 matchgroup=boxesString start=/[ \t\r\n]\+%["~'`!@&*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString07,boxesList07,@boxesDelimContained +syntax region delimRegion08 matchgroup=boxesString start=/[ \t\r\n]\+&["~'`!@%*=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString08,boxesList08,@boxesDelimContained +syntax region delimRegion09 matchgroup=boxesString start=/[ \t\r\n]\+\*["~'`!@%&=:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString09,boxesList09,@boxesDelimContained +syntax region delimRegion10 matchgroup=boxesString start=/[ \t\r\n]\+=["~'`!@%&*:;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString10,boxesList10,@boxesDelimContained +syntax region delimRegion11 matchgroup=boxesString start=/[ \t\r\n]\+:["~'`!@%&*=;<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString11,boxesList11,@boxesDelimContained +syntax region delimRegion12 matchgroup=boxesString start=/[ \t\r\n]\+;["~'`!@%&*=:<>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString12,boxesList12,@boxesDelimContained +syntax region delimRegion13 matchgroup=boxesString start=/[ \t\r\n]\+<["~'`!@%&*=:;>?/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString13,boxesList13,@boxesDelimContained +syntax region delimRegion14 matchgroup=boxesString start=/[ \t\r\n]\+>["~'`!@%&*=:;\|\\|\/he=s-1 contains=boxesString14,boxesList14,@boxesDelimContained +syntax region delimRegion15 matchgroup=boxesString start=/[ \t\r\n]\+?["~'`!@%&*=:;<>/|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString15,boxesList15,@boxesDelimContained +syntax region delimRegion16 matchgroup=boxesString start=/[ \t\r\n]\+\/["~'`!@%&*=:;<>?|.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString16,boxesList16,@boxesDelimContained +syntax region delimRegion17 matchgroup=boxesString start=/[ \t\r\n]\+|["~'`!@%&*=:;<>?/.\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString17,boxesList17,@boxesDelimContained +syntax region delimRegion18 matchgroup=boxesString start=/[ \t\r\n]\+\.["~'`!@%&*=:;<>?/|\\][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString18,boxesList18,@boxesDelimContained +syntax region delimRegion matchgroup=boxesString start=/[ \t\r\n]\+\\["~'`!@%&*=:;<>?/|.][ \t\r\n]/ end=/\\|\\|\/he=s-1 contains=boxesString,boxesList,@boxesDelimContained + +" Trivial elements such as words, numbers, braces syntax match boxesComma contained display /,/ syntax match boxesBraces display /[{}]/ -syntax match boxesDelSpec contained display /[^ \t\r]\+/ -syntax match boxesNameAtEnd display /[a-zA-ZäöüÄÖÜ][a-zA-Z0-9_\-üäöÜÄÖß]*/ skipwhite skipempty -syntax match boxesWord display /[a-zA-ZäöüÄÖÜ][a-zA-Z0-9_\-üäöÜÄÖß]*/ +syntax match boxesNameAtEnd display /[a-zA-Z][a-zA-Z0-9_-]*/ +syntax match boxesWord display /[a-zA-Z][a-zA-Z0-9_-]*/ syntax match boxesNumber display /[-+]\=\d\+/ -" TODO Introduce a region between delim and delim|end which exists multiple times to cover all escape characters -" with specialized string definitions +" These items may appear inside a DELIM region +syntax cluster boxesDelimContained contains=boxesComment,boxesWord,boxesElasticList +syntax cluster boxesDelimContained add=boxesError,boxesBlocks,boxesSample,boxesPads,boxesNumber,boxesBraces +syntax cluster boxesDelimContained add=boxesClassicKeywords,boxesRegStuff,boxesShapes " a list, used inside shape blocks and for the elastic list -syntax region boxesList matchgroup=Normal start="(" end=")" contains=boxesString,boxesShapes,boxesComma,boxesError,boxesComment +syntax cluster boxesListContained contains=boxesShapes,boxesComma,boxesError,boxesComment +syntax region boxesList01 contained matchgroup=Normal start="(" end=")" contains=boxesString01,@boxesListContained +syntax region boxesList02 contained matchgroup=Normal start="(" end=")" contains=boxesString02,@boxesListContained +syntax region boxesList03 contained matchgroup=Normal start="(" end=")" contains=boxesString03,@boxesListContained +syntax region boxesList04 contained matchgroup=Normal start="(" end=")" contains=boxesString04,@boxesListContained +syntax region boxesList05 contained matchgroup=Normal start="(" end=")" contains=boxesString05,@boxesListContained +syntax region boxesList06 contained matchgroup=Normal start="(" end=")" contains=boxesString06,@boxesListContained +syntax region boxesList07 contained matchgroup=Normal start="(" end=")" contains=boxesString07,@boxesListContained +syntax region boxesList08 contained matchgroup=Normal start="(" end=")" contains=boxesString08,@boxesListContained +syntax region boxesList09 contained matchgroup=Normal start="(" end=")" contains=boxesString09,@boxesListContained +syntax region boxesList10 contained matchgroup=Normal start="(" end=")" contains=boxesString10,@boxesListContained +syntax region boxesList11 contained matchgroup=Normal start="(" end=")" contains=boxesString11,@boxesListContained +syntax region boxesList12 contained matchgroup=Normal start="(" end=")" contains=boxesString12,@boxesListContained +syntax region boxesList13 contained matchgroup=Normal start="(" end=")" contains=boxesString13,@boxesListContained +syntax region boxesList14 contained matchgroup=Normal start="(" end=")" contains=boxesString14,@boxesListContained +syntax region boxesList15 contained matchgroup=Normal start="(" end=")" contains=boxesString15,@boxesListContained +syntax region boxesList16 contained matchgroup=Normal start="(" end=")" contains=boxesString16,@boxesListContained +syntax region boxesList17 contained matchgroup=Normal start="(" end=")" contains=boxesString17,@boxesListContained +syntax region boxesList18 contained matchgroup=Normal start="(" end=")" contains=boxesString18,@boxesListContained +syntax region boxesList matchgroup=Normal start="(" end=")" contains=boxesString,@boxesListContained " Strings -syntax region boxesString display start=/\z\(["~'`!@%&*=:;<>?/|.\\]\)/ skip=/\\\\\|\\\z1/ end=/\z1/ oneline +syntax region boxesString01 contained display start=/\z\([~'`!@%&*=:;<>?/|.\\]\)/ skip=/""\|"\z1/ end=/\z1/ oneline +syntax region boxesString02 contained display start=/\z\(["'`!@%&*=:;<>?/|.\\]\)/ skip=/\~\~\|\~\z1/ end=/\z1/ oneline +syntax region boxesString03 contained display start=/\z\(["~`!@%&*=:;<>?/|.\\]\)/ skip=/''\|'\z1/ end=/\z1/ oneline +syntax region boxesString04 contained display start=/\z\(["~'!@%&*=:;<>?/|.\\]\)/ skip=/``\|`\z1/ end=/\z1/ oneline +syntax region boxesString05 contained display start=/\z\(["~'`@%&*=:;<>?/|.\\]\)/ skip=/!!\|!\z1/ end=/\z1/ oneline +syntax region boxesString06 contained display start=/\z\(["~'`!%&*=:;<>?/|.\\]\)/ skip=/@@\|@\z1/ end=/\z1/ oneline +syntax region boxesString07 contained display start=/\z\(["~'`!@&*=:;<>?/|.\\]\)/ skip=/%%\|%\z1/ end=/\z1/ oneline +syntax region boxesString08 contained display start=/\z\(["~'`!@%*=:;<>?/|.\\]\)/ skip=/&&\|&\z1/ end=/\z1/ oneline +syntax region boxesString09 contained display start=/\z\(["~'`!@%&=:;<>?/|.\\]\)/ skip=/\*\*\|\*\z1/ end=/\z1/ oneline +syntax region boxesString10 contained display start=/\z\(["~'`!@%&*:;<>?/|.\\]\)/ skip=/==\|=\z1/ end=/\z1/ oneline +syntax region boxesString11 contained display start=/\z\(["~'`!@%&*=;<>?/|.\\]\)/ skip=/::\|:\z1/ end=/\z1/ oneline +syntax region boxesString12 contained display start=/\z\(["~'`!@%&*=:<>?/|.\\]\)/ skip=/;;\|;\z1/ end=/\z1/ oneline +syntax region boxesString13 contained display start=/\z\(["~'`!@%&*=:;>?/|.\\]\)/ skip=/<<\|<\z1/ end=/\z1/ oneline +syntax region boxesString14 contained display start=/\z\(["~'`!@%&*=:;>\|>\z1/ end=/\z1/ oneline +syntax region boxesString15 contained display start=/\z\(["~'`!@%&*=:;<>/|.\\]\)/ skip=/??\|?\z1/ end=/\z1/ oneline +syntax region boxesString16 contained display start=/\z\(["~'`!@%&*=:;<>?|.\\]\)/ skip=/\/\/\|\/\z1/ end=/\z1/ oneline +syntax region boxesString17 contained display start=/\z\(["~'`!@%&*=:;<>?/.\\]\)/ skip=/||\||\z1/ end=/\z1/ oneline +syntax region boxesString18 contained display start=/\z\(["~'`!@%&*=:;<>?/|\\]\)/ skip=/\.\.\|\.\z1/ end=/\z1/ oneline +syntax region boxesString display start=/\z\(["~'`!@%&*=:;<>?/|.]\)/ skip=/\\\\\|\\\z1/ end=/\z1/ oneline " File path of a 'parent' definition syntax match boxesParentGlobal display "\s:global:\s*$" syntax match boxesParentPath contained display "[^:]\{-}$" " a BOX definition with aliases -syntax region boxesNames matchgroup=boxesBoxStmt start=/\[ \t\r\n]\+\[ \t\r\n]\+\/ nextgroup=delimRegion15,delimRegion06,delimRegion03,delimRegion04,delimRegion05,delimRegion02,delimRegion07,delimRegion08,delimRegion09,delimRegion10,delimRegion11,delimRegion12,delimRegion13,delimRegion14,delimRegion01,delimRegion16,delimRegion17,delimRegion18,delimRegion " Comments may appear anywhere in the file syntax match boxesComment display /#.*$/ @@ -95,8 +154,6 @@ syntax match boxesComment display /#.*$/ " The SAMPLE block syntax region boxesSample matchgroup=boxesBlocks start="sample" end=+^[ \t]*ends[ \t\r]*$+ keepend - - " " Synchronisation " @@ -112,24 +169,47 @@ syntax sync minlines=40 maxlines=200 if !exists("did_boxes_syntax_inits") let did_boxes_syntax_inits = 1 - hi link boxesNames Special - hi link boxesNameAtEnd Special + hi link boxesString01 String + hi link boxesString02 String + hi link boxesString03 String + hi link boxesString04 String + hi link boxesString05 String + hi link boxesString06 String + hi link boxesString07 String + hi link boxesString08 String + hi link boxesString09 String + hi link boxesString10 String + hi link boxesString11 String + hi link boxesString12 String + hi link boxesString13 String + hi link boxesString14 String + hi link boxesString15 String + hi link boxesString16 String + hi link boxesString17 String + hi link boxesString18 String + hi link boxesString String + hi link boxesBoxStmt PreProc hi link boxesEnd PreProc - hi link boxesNumber Number - hi link boxesString String - hi link boxesDelSpec boxesString - hi link boxesComment Comment - hi link boxesError Error - hi link boxesClassicKeywords Keyword + hi link boxesNames Special + hi link boxesNameAtEnd Special + hi link boxesParent PreProc hi link boxesParentGlobal PreProc hi link boxesParentPath String - hi link boxesBlocks Statement + + hi link boxesClassicKeywords Keyword hi link boxesDelim Keyword + hi link boxesBlocks Statement hi link boxesRegStuff Label + hi link boxesShapes Type hi link boxesPads Type + hi link boxesNumber Number + + hi link boxesComment Comment + hi link boxesError Error + hi clear boxesSample hi clear boxesWord hi clear boxesBraces @@ -144,4 +224,4 @@ let b:current_syntax = "boxes" -"EOF vim: sw=4 nowrap : +"EOF vim: sw=4 nowrap: