1" Vim syntax file 2" Language: CWEB 3" Maintainer: Andreas Scherer <[email protected]> 4" Last Change: April 30, 2001 5 6" Details of the CWEB language can be found in the article by Donald E. Knuth 7" and Silvio Levy, "The CWEB System of Structured Documentation", included as 8" file "cwebman.tex" in the standard CWEB distribution, available for 9" anonymous ftp at ftp://labrea.stanford.edu/pub/cweb/. 10 11" TODO: Section names and C/C++ comments should be treated as TeX material. 12" TODO: The current version switches syntax highlighting off for section 13" TODO: names, and leaves C/C++ comments as such. (On the other hand, 14" TODO: switching to TeX mode in C/C++ comments might be colour overkill.) 15 16" For version 5.x: Clear all syntax items 17" For version 6.x: Quit when a syntax file was already loaded 18if version < 600 19 syntax clear 20elseif exists("b:current_syntax") 21 finish 22endif 23 24" For starters, read the TeX syntax; TeX syntax items are allowed at the top 25" level in the CWEB syntax, e.g., in the preamble. In general, a CWEB source 26" code can be seen as a normal TeX document with some C/C++ material 27" interspersed in certain defined regions. 28if version < 600 29 source <sfile>:p:h/tex.vim 30else 31 runtime! syntax/tex.vim 32 unlet b:current_syntax 33endif 34 35" Read the C/C++ syntax too; C/C++ syntax items are treated as such in the 36" C/C++ section of a CWEB chunk or in inner C/C++ context in "|...|" groups. 37syntax include @webIncludedC <sfile>:p:h/cpp.vim 38 39" Inner C/C++ context (ICC) should be quite simple as it's comprised of 40" material in "|...|"; however the naive definition for this region would 41" hickup at the innocious "\|" TeX macro. Note: For the time being we expect 42" that an ICC begins either at the start of a line or after some white space. 43syntax region webInnerCcontext start="\(^\|[ \t\~`(]\)|" end="|" contains=@webIncludedC,webSectionName,webRestrictedTeX,webIgnoredStuff 44 45" Genuine C/C++ material. This syntactic region covers both the definition 46" part and the C/C++ part of a CWEB section; it is ended by the TeX part of 47" the next section. 48syntax region webCpart start="@[dfscp<(]" end="@[ \*]" contains=@webIncludedC,webSectionName,webRestrictedTeX,webIgnoredStuff 49 50" Section names contain C/C++ material only in inner context. 51syntax region webSectionName start="@[<(]" end="@>" contains=webInnerCcontext contained 52 53" The contents of "control texts" is not treated as TeX material, because in 54" non-trivial cases this completely clobbers the syntax recognition. Instead, 55" we highlight these elements as "strings". 56syntax region webRestrictedTeX start="@[\^\.:t=q]" end="@>" oneline 57 58" Double-@ means single-@, anywhere in the CWEB source. (This allows e-mail 59" address <someone@@fsf.org> without going into C/C++ mode.) 60syntax match webIgnoredStuff "@@" 61 62" Define the default highlighting. 63" For version 5.7 and earlier: only when not done already 64" For version 5.8 and later: only when an item doesn't have highlighting yet 65if version >= 508 || !exists("did_cweb_syntax_inits") 66 if version < 508 67 let did_cweb_syntax_inits = 1 68 command -nargs=+ HiLink hi link <args> 69 else 70 command -nargs=+ HiLink hi def link <args> 71 endif 72 73 HiLink webRestrictedTeX String 74 75 delcommand HiLink 76endif 77 78let b:current_syntax = "cweb" 79 80" vim: ts=8 81