blob: d6f21ae7cd25203f6b9feb7301cab489c6a9652f [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" 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 <haskell-cafe@haskell.org>
6" Original Author: Arthur van Leeuwen <arthurvl@cs.uu.nl>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00007" Last Change: 2004 Aug 31
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" Version: 1.01
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"
33
34
35" For version 5.x: Clear all syntax items
36" For version 6.x: Quit when a syntax file was already loaded
37if version < 600
38 syntax clear
39elseif exists("b:current_syntax")
40 finish
41endif
42
43" First off, see if we can inherit a user preference for lhs_markup
44if !exists("b:lhs_markup")
45 if exists("lhs_markup")
46 if lhs_markup =~ '\<\%(tex\|none\)\>'
47 let b:lhs_markup = matchstr(lhs_markup,'\<\%(tex\|none\)\>')
48 else
49 echohl WarningMsg | echo "Unknown value of lhs_markup" | echohl None
50 let b:lhs_markup = "unknown"
51 endif
52 else
53 let b:lhs_markup = "unknown"
54 endif
55else
56 if b:lhs_markup !~ '\<\%(tex\|none\)\>'
57 let b:lhs_markup = "unknown"
58 endif
59endif
60
61" Remember where the cursor is, and go to upperleft
62let s:oldline=line(".")
63let s:oldcolumn=col(".")
64call cursor(1,1)
65
66" If no user preference, scan buffer for our guess of the markup to
67" highlight. We only differentiate between TeX and plain markup, where
68" plain is not highlighted. The heuristic for finding TeX markup is if
69" one of the following occurs anywhere in the file:
70" - \documentclass
71" - \begin{env} (for env != code)
72" - \part, \chapter, \section, \subsection, \subsubsection, etc
73if b:lhs_markup == "unknown"
74 if search('%\|\\documentclass\|\\begin{\(code}\)\@!\|\\\(sub\)*section\|\\chapter|\\part','W') != 0
75 let b:lhs_markup = "tex"
76 else
77 let b:lhs_markup = "plain"
78 endif
79endif
80
81" If user wants us to highlight TeX syntax, read it.
82if b:lhs_markup == "tex"
83 if version < 600
84 source <sfile>:p:h/tex.vim
Bram Moolenaard4755bb2004-09-02 19:12:26 +000085 set isk+=_
Bram Moolenaar071d4272004-06-13 20:20:40 +000086 else
87 runtime! syntax/tex.vim
88 unlet b:current_syntax
Bram Moolenaard4755bb2004-09-02 19:12:26 +000089 " Tex.vim removes "_" from 'iskeyword', but we need it for Haskell.
90 setlocal isk+=_
Bram Moolenaar071d4272004-06-13 20:20:40 +000091 endif
92endif
93
94" Literate Haskell is Haskell in between text, so at least read Haskell
95" highlighting
96if version < 600
97 syntax include @haskellTop <sfile>:p:h/haskell.vim
98else
99 syntax include @haskellTop syntax/haskell.vim
100endif
101
102syntax region lhsHaskellBirdTrack start="^>" end="\%(^[^>]\)\@=" contains=@haskellTop,lhsBirdTrack
103syntax region lhsHaskellBeginEndBlock start="^\\begin{code}\s*$" matchgroup=NONE end="\%(^\\end{code}.*$\)\@=" contains=@haskellTop,@beginCode
104
105syntax match lhsBirdTrack "^>" contained
106
107syntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained
108syntax region beginCodeCode matchgroup=texDelimiter start="{" end="}"
109syntax cluster beginCode contains=beginCodeBegin,beginCodeCode
110
111" Define the default highlighting.
112" For version 5.7 and earlier: only when not done already
113" For version 5.8 and later: only when an item doesn't have highlighting yet
114if version >= 508 || !exists("did_tex_syntax_inits")
115 if version < 508
116 let did_tex_syntax_inits = 1
117 command -nargs=+ HiLink hi link <args>
118 else
119 command -nargs=+ HiLink hi def link <args>
120 endif
121
122 HiLink lhsBirdTrack Comment
123
124 HiLink beginCodeBegin texCmdName
125 HiLink beginCodeCode texSection
126
127 delcommand HiLink
128endif
129
130" Restore cursor to original position, as it may have been disturbed
131" by the searches in our guessing code
132call cursor (s:oldline, s:oldcolumn)
133
134unlet s:oldline
135unlet s:oldcolumn
136
137let b:current_syntax = "lhaskell"
138
139" vim: ts=8