1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: Haskell with literate comments, Bird style, 3*9faec4e3SBram Moolenaar" Markdown style, TeX style and plain text surrounding 4071d4279SBram Moolenaar" \begin{code} \end{code} blocks 5071d4279SBram Moolenaar" Maintainer: Haskell Cafe mailinglist <[email protected]> 6071d4279SBram Moolenaar" Original Author: Arthur van Leeuwen <[email protected]> 7*9faec4e3SBram Moolenaar" Last Change: 2020 Feb 25 8*9faec4e3SBram Moolenaar" Version: 1.05 9071d4279SBram Moolenaar" 10071d4279SBram Moolenaar" Thanks to Ian Lynagh for thoughtful comments on initial versions and 11071d4279SBram Moolenaar" for the inspiration for writing this in the first place. 12071d4279SBram Moolenaar" 13071d4279SBram Moolenaar" This style guesses as to the type of markup used in a literate haskell 14071d4279SBram Moolenaar" file and will highlight (La)TeX markup if it finds any 15071d4279SBram Moolenaar" This behaviour can be overridden, both glabally and locally using 16071d4279SBram Moolenaar" the lhs_markup variable or b:lhs_markup variable respectively. 17071d4279SBram Moolenaar" 18071d4279SBram Moolenaar" lhs_markup must be set to either tex or none to indicate that 19071d4279SBram Moolenaar" you always want (La)TeX highlighting or no highlighting 20071d4279SBram Moolenaar" must not be set to let the highlighting be guessed 21071d4279SBram Moolenaar" b:lhs_markup must be set to eiterh tex or none to indicate that 22071d4279SBram Moolenaar" you want (La)TeX highlighting or no highlighting for 23071d4279SBram Moolenaar" this particular buffer 24071d4279SBram Moolenaar" must not be set to let the highlighting be guessed 25071d4279SBram Moolenaar" 26071d4279SBram Moolenaar" 27071d4279SBram Moolenaar" 2004 February 18: New version, based on Ian Lynagh's TeX guessing 28071d4279SBram Moolenaar" lhaskell.vim, cweb.vim, tex.vim, sh.vim and fortran.vim 29071d4279SBram Moolenaar" 2004 February 20: Cleaned up the guessing and overriding a bit 30071d4279SBram Moolenaar" 2004 February 23: Cleaned up syntax highlighting for \begin{code} and 31071d4279SBram Moolenaar" \end{code}, added some clarification to the attributions 32c236c16dSBram Moolenaar" 2008 July 1: Removed % from guess list, as it totally breaks plain 33c236c16dSBram Moolenaar" text markup guessing 345c73622aSBram Moolenaar" 2009 April 29: Fixed highlighting breakage in TeX mode, 355c73622aSBram Moolenaar" thanks to Kalman Noel 36071d4279SBram Moolenaar" 37071d4279SBram Moolenaar 38071d4279SBram Moolenaar 3989bcfda6SBram Moolenaar" quit when a syntax file was already loaded 4089bcfda6SBram Moolenaarif exists("b:current_syntax") 41071d4279SBram Moolenaar finish 42071d4279SBram Moolenaarendif 43071d4279SBram Moolenaar 44071d4279SBram Moolenaar" First off, see if we can inherit a user preference for lhs_markup 45071d4279SBram Moolenaarif !exists("b:lhs_markup") 46071d4279SBram Moolenaar if exists("lhs_markup") 47*9faec4e3SBram Moolenaar if lhs_markup =~ '\<\%(tex\|md\|none\)\>' 48*9faec4e3SBram Moolenaar let b:lhs_markup = matchstr(lhs_markup,'\<\%(tex\|md\|none\)\>') 49071d4279SBram Moolenaar else 50071d4279SBram Moolenaar echohl WarningMsg | echo "Unknown value of lhs_markup" | echohl None 51071d4279SBram Moolenaar let b:lhs_markup = "unknown" 52071d4279SBram Moolenaar endif 53071d4279SBram Moolenaar else 54071d4279SBram Moolenaar let b:lhs_markup = "unknown" 55071d4279SBram Moolenaar endif 56071d4279SBram Moolenaarelse 57*9faec4e3SBram Moolenaar if b:lhs_markup !~ '\<\%(tex\|md\|none\)\>' 58071d4279SBram Moolenaar let b:lhs_markup = "unknown" 59071d4279SBram Moolenaar endif 60071d4279SBram Moolenaarendif 61071d4279SBram Moolenaar 62071d4279SBram Moolenaar" Remember where the cursor is, and go to upperleft 63071d4279SBram Moolenaarlet s:oldline=line(".") 64071d4279SBram Moolenaarlet s:oldcolumn=col(".") 65071d4279SBram Moolenaarcall cursor(1,1) 66071d4279SBram Moolenaar 67071d4279SBram Moolenaar" If no user preference, scan buffer for our guess of the markup to 68071d4279SBram Moolenaar" highlight. We only differentiate between TeX and plain markup, where 69071d4279SBram Moolenaar" plain is not highlighted. The heuristic for finding TeX markup is if 70071d4279SBram Moolenaar" one of the following occurs anywhere in the file: 71071d4279SBram Moolenaar" - \documentclass 72071d4279SBram Moolenaar" - \begin{env} (for env != code) 73071d4279SBram Moolenaar" - \part, \chapter, \section, \subsection, \subsubsection, etc 74071d4279SBram Moolenaarif b:lhs_markup == "unknown" 75c236c16dSBram Moolenaar if search('\\documentclass\|\\begin{\(code}\)\@!\|\\\(sub\)*section\|\\chapter|\\part','W') != 0 76071d4279SBram Moolenaar let b:lhs_markup = "tex" 77*9faec4e3SBram Moolenaar elseif search('```haskell','W') != 0 78*9faec4e3SBram Moolenaar let b:lhs_markup = "md" 79071d4279SBram Moolenaar else 80071d4279SBram Moolenaar let b:lhs_markup = "plain" 81071d4279SBram Moolenaar endif 82071d4279SBram Moolenaarendif 83071d4279SBram Moolenaar 84c236c16dSBram Moolenaar" If user wants us to highlight TeX syntax or guess thinks it's TeX, read it. 85071d4279SBram Moolenaarif b:lhs_markup == "tex" 86071d4279SBram Moolenaar runtime! syntax/tex.vim 87071d4279SBram Moolenaar unlet b:current_syntax 88d4755bb0SBram Moolenaar " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell. 89d4755bb0SBram Moolenaar setlocal isk+=_ 905c73622aSBram Moolenaar syntax cluster lhsTeXContainer contains=tex.*Zone,texAbstract 91*9faec4e3SBram Moolenaarelseif b:lhs_markup == "md" 92*9faec4e3SBram Moolenaar runtime! syntax/markdown.vim 93*9faec4e3SBram Moolenaar unlet b:current_syntax 94*9faec4e3SBram Moolenaar syntax cluster lhsTeXContainer contains=markdown.* 955c73622aSBram Moolenaarelse 965c73622aSBram Moolenaar syntax cluster lhsTeXContainer contains=.* 97071d4279SBram Moolenaarendif 98071d4279SBram Moolenaar 99071d4279SBram Moolenaar" Literate Haskell is Haskell in between text, so at least read Haskell 100071d4279SBram Moolenaar" highlighting 101071d4279SBram Moolenaarsyntax include @haskellTop syntax/haskell.vim 102071d4279SBram Moolenaar 1035c73622aSBram Moolenaarsyntax region lhsHaskellBirdTrack start="^>" end="\%(^[^>]\)\@=" contains=@haskellTop,lhsBirdTrack containedin=@lhsTeXContainer 10400a927d6SBram Moolenaarsyntax region lhsHaskellBeginEndBlock start="^\\begin{code}\s*$" matchgroup=NONE end="\%(^\\end{code}.*$\)\@=" contains=@haskellTop,beginCodeBegin containedin=@lhsTeXContainer 105*9faec4e3SBram Moolenaarsyntax region lhsHaskellMDBlock start="^```haskell$" matchgroup=NONE end="^```$" keepend contains=@haskellTop,lhsMarkdownCode containedin=@lhsTeXContainer 106071d4279SBram Moolenaar 107071d4279SBram Moolenaarsyntax match lhsBirdTrack "^>" contained 108071d4279SBram Moolenaar 109*9faec4e3SBram Moolenaarsyntax match lhsMarkdownCode "^\(```haskell\|^```\)$" contained 110*9faec4e3SBram Moolenaar 111071d4279SBram Moolenaarsyntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained 112071d4279SBram Moolenaarsyntax region beginCodeCode matchgroup=texDelimiter start="{" end="}" 113071d4279SBram Moolenaar 114071d4279SBram Moolenaar" Define the default highlighting. 11589bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet 116071d4279SBram Moolenaar 117f37506f6SBram Moolenaarhi def link lhsBirdTrack Comment 118071d4279SBram Moolenaar 119*9faec4e3SBram Moolenaarhi def link lhsMarkdownCode Comment 120*9faec4e3SBram Moolenaar 121f37506f6SBram Moolenaarhi def link beginCodeBegin texCmdName 122f37506f6SBram Moolenaarhi def link beginCodeCode texSection 123071d4279SBram Moolenaar 124071d4279SBram Moolenaar 125071d4279SBram Moolenaar" Restore cursor to original position, as it may have been disturbed 126071d4279SBram Moolenaar" by the searches in our guessing code 127071d4279SBram Moolenaarcall cursor (s:oldline, s:oldcolumn) 128071d4279SBram Moolenaar 129071d4279SBram Moolenaarunlet s:oldline 130071d4279SBram Moolenaarunlet s:oldcolumn 131071d4279SBram Moolenaar 132071d4279SBram Moolenaarlet b:current_syntax = "lhaskell" 133071d4279SBram Moolenaar 134071d4279SBram Moolenaar" vim: ts=8 135