1" Vim syntax file 2" Language: Haskell with literate comments, Bird style, 3" 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: 2010 Apr 11 8" Version: 1.04 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\|none\)\>' 48 let b:lhs_markup = matchstr(lhs_markup,'\<\%(tex\|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\|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 else 78 let b:lhs_markup = "plain" 79 endif 80endif 81 82" If user wants us to highlight TeX syntax or guess thinks it's TeX, read it. 83if b:lhs_markup == "tex" 84 runtime! syntax/tex.vim 85 unlet b:current_syntax 86 " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell. 87 setlocal isk+=_ 88 syntax cluster lhsTeXContainer contains=tex.*Zone,texAbstract 89else 90 syntax cluster lhsTeXContainer contains=.* 91endif 92 93" Literate Haskell is Haskell in between text, so at least read Haskell 94" highlighting 95syntax include @haskellTop syntax/haskell.vim 96 97syntax region lhsHaskellBirdTrack start="^>" end="\%(^[^>]\)\@=" contains=@haskellTop,lhsBirdTrack containedin=@lhsTeXContainer 98syntax region lhsHaskellBeginEndBlock start="^\\begin{code}\s*$" matchgroup=NONE end="\%(^\\end{code}.*$\)\@=" contains=@haskellTop,beginCodeBegin containedin=@lhsTeXContainer 99 100syntax match lhsBirdTrack "^>" contained 101 102syntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained 103syntax region beginCodeCode matchgroup=texDelimiter start="{" end="}" 104 105" Define the default highlighting. 106" Only when an item doesn't have highlighting yet 107 108hi def link lhsBirdTrack Comment 109 110hi def link beginCodeBegin texCmdName 111hi def link beginCodeCode texSection 112 113 114" Restore cursor to original position, as it may have been disturbed 115" by the searches in our guessing code 116call cursor (s:oldline, s:oldcolumn) 117 118unlet s:oldline 119unlet s:oldcolumn 120 121let b:current_syntax = "lhaskell" 122 123" vim: ts=8 124