1" Vim syntax file 2" Language: Haskell with literate comments, Bird style, 3" Markdown style, TeX style and plain text surrounding 4" \begin{code} \end{code} blocks 5" Maintainer: Haskell Cafe mailinglist <[email protected]> 6" Original Author: Arthur van Leeuwen <[email protected]> 7" Last Change: 2020 Feb 25 8" Version: 1.05 9" 10" Thanks to Ian Lynagh for thoughtful comments on initial versions and 11" for the inspiration for writing this in the first place. 12" 13" This style guesses as to the type of markup used in a literate haskell 14" file and will highlight (La)TeX markup if it finds any 15" This behaviour can be overridden, both glabally and locally using 16" the lhs_markup variable or b:lhs_markup variable respectively. 17" 18" lhs_markup must be set to either tex or none to indicate that 19" you always want (La)TeX highlighting or no highlighting 20" must not be set to let the highlighting be guessed 21" b:lhs_markup must be set to eiterh tex or none to indicate that 22" you want (La)TeX highlighting or no highlighting for 23" this particular buffer 24" must not be set to let the highlighting be guessed 25" 26" 27" 2004 February 18: New version, based on Ian Lynagh's TeX guessing 28" lhaskell.vim, cweb.vim, tex.vim, sh.vim and fortran.vim 29" 2004 February 20: Cleaned up the guessing and overriding a bit 30" 2004 February 23: Cleaned up syntax highlighting for \begin{code} and 31" \end{code}, added some clarification to the attributions 32" 2008 July 1: Removed % from guess list, as it totally breaks plain 33" text markup guessing 34" 2009 April 29: Fixed highlighting breakage in TeX mode, 35" thanks to Kalman Noel 36" 37 38 39" quit when a syntax file was already loaded 40if exists("b:current_syntax") 41 finish 42endif 43 44" First off, see if we can inherit a user preference for lhs_markup 45if !exists("b:lhs_markup") 46 if exists("lhs_markup") 47 if lhs_markup =~ '\<\%(tex\|md\|none\)\>' 48 let b:lhs_markup = matchstr(lhs_markup,'\<\%(tex\|md\|none\)\>') 49 else 50 echohl WarningMsg | echo "Unknown value of lhs_markup" | echohl None 51 let b:lhs_markup = "unknown" 52 endif 53 else 54 let b:lhs_markup = "unknown" 55 endif 56else 57 if b:lhs_markup !~ '\<\%(tex\|md\|none\)\>' 58 let b:lhs_markup = "unknown" 59 endif 60endif 61 62" Remember where the cursor is, and go to upperleft 63let s:oldline=line(".") 64let s:oldcolumn=col(".") 65call cursor(1,1) 66 67" If no user preference, scan buffer for our guess of the markup to 68" highlight. We only differentiate between TeX and plain markup, where 69" plain is not highlighted. The heuristic for finding TeX markup is if 70" one of the following occurs anywhere in the file: 71" - \documentclass 72" - \begin{env} (for env != code) 73" - \part, \chapter, \section, \subsection, \subsubsection, etc 74if b:lhs_markup == "unknown" 75 if search('\\documentclass\|\\begin{\(code}\)\@!\|\\\(sub\)*section\|\\chapter|\\part','W') != 0 76 let b:lhs_markup = "tex" 77 elseif search('```haskell','W') != 0 78 let b:lhs_markup = "md" 79 else 80 let b:lhs_markup = "plain" 81 endif 82endif 83 84" If user wants us to highlight TeX syntax or guess thinks it's TeX, read it. 85if b:lhs_markup == "tex" 86 runtime! syntax/tex.vim 87 unlet b:current_syntax 88 " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell. 89 setlocal isk+=_ 90 syntax cluster lhsTeXContainer contains=tex.*Zone,texAbstract 91elseif b:lhs_markup == "md" 92 runtime! syntax/markdown.vim 93 unlet b:current_syntax 94 syntax cluster lhsTeXContainer contains=markdown.* 95else 96 syntax cluster lhsTeXContainer contains=.* 97endif 98 99" Literate Haskell is Haskell in between text, so at least read Haskell 100" highlighting 101syntax include @haskellTop syntax/haskell.vim 102 103syntax region lhsHaskellBirdTrack start="^>" end="\%(^[^>]\)\@=" contains=@haskellTop,lhsBirdTrack containedin=@lhsTeXContainer 104syntax region lhsHaskellBeginEndBlock start="^\\begin{code}\s*$" matchgroup=NONE end="\%(^\\end{code}.*$\)\@=" contains=@haskellTop,beginCodeBegin containedin=@lhsTeXContainer 105syntax region lhsHaskellMDBlock start="^```haskell$" matchgroup=NONE end="^```$" keepend contains=@haskellTop,lhsMarkdownCode containedin=@lhsTeXContainer 106 107syntax match lhsBirdTrack "^>" contained 108 109syntax match lhsMarkdownCode "^\(```haskell\|^```\)$" contained 110 111syntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained 112syntax region beginCodeCode matchgroup=texDelimiter start="{" end="}" 113 114" Define the default highlighting. 115" Only when an item doesn't have highlighting yet 116 117hi def link lhsBirdTrack Comment 118 119hi def link lhsMarkdownCode Comment 120 121hi def link beginCodeBegin texCmdName 122hi def link beginCodeCode texSection 123 124 125" Restore cursor to original position, as it may have been disturbed 126" by the searches in our guessing code 127call cursor (s:oldline, s:oldcolumn) 128 129unlet s:oldline 130unlet s:oldcolumn 131 132let b:current_syntax = "lhaskell" 133 134" vim: ts=8 135