xref: /vim-8.2.3635/runtime/syntax/lhaskell.vim (revision 9faec4e3)
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