4d8caeda |
1 | " Vim syntax file |
2 | " Language: Halibut |
3 | " Maintainer: Jacob Nevins <jacobn+vim@chiark.greenend.org.uk> |
4 | " URL: FIXME |
5 | " Filenames: *.but |
116b7f38 |
6 | " Version: $Id: halibut.vim,v 1.2 2004/04/01 01:12:21 jtn Exp $ |
4d8caeda |
7 | |
8 | " I'm not proud of this. Every time I tangle with vim's syntax highlighting |
9 | " I come away unsatisfied. Nevertheless, it seems to work. |
10 | " I have no idea if it's compatible with vim <6.1. |
11 | |
12 | " Based on docs in Halibut CVS 2004-03-31 |
13 | |
14 | " Rune from vim 6.1 help |
15 | " For version 5.x: Clear all syntax items |
16 | " For version 6.x: Quit when a syntax file was already loaded |
17 | if version < 600 |
18 | syn clear |
19 | elseif exists("b:current_syntax") |
20 | finish |
21 | endif |
22 | |
23 | " Halibut is case-sensitive. |
24 | syn case match |
25 | |
26 | " Fallbacks -- if these characters are seen in text and not caught by |
27 | " anything below, it's probably a syntax violation. |
28 | syn match butIllegalChar "{" |
29 | syn match butIllegalChar "}" |
30 | syn match butIllegalChar "\\" |
31 | |
32 | " Simple-minded fallback to highlight any command we don't recognise, |
33 | " and assume it has textual arguments. |
34 | " XXX highlights all of "\date)." |
35 | syn match butCmdGeneric "\\\(\S\&[^{}\\]\)\+" nextgroup=butTextArg |
36 | " was: [A-Za-z0-9#]\+ |
37 | |
38 | syn cluster butText contains=butLiteral,@butCmd,butTodo |
39 | |
40 | syn match butLiteral "\\[-{}_.\\]" |
41 | |
42 | " This isn't specific to Halibut, but is often useful. |
43 | syn keyword butTodo XXX FIXME TODO |
44 | |
45 | " Specific processing comes after the generic stuff above. |
46 | |
47 | " Paragraph level stuff. |
48 | |
49 | " Literals -- might need to come before \e{}, \c{} |
50 | syn region butQuoteLit matchgroup=butCmdSpecific start="\\c\_s\@=" matchgroup=NONE end="$" |
51 | syn region butQLEmph matchgroup=butCmdSpecific start="\\e\_s\@=" matchgroup=NONE end="$" contains=butQLEmphInv |
52 | " Highlight invalid characters in emphasis line, cos I'll never remember. |
53 | syn match butQLEmphInv "\S\@=[^bi]" contained |
54 | |
55 | " Paragraph level comment -- might need to come before inline comment. |
56 | syn region butCommentPara start="\\#\_s\@=" end="^\s*$" contains=butTodo |
57 | |
58 | " Inline comments -- nested braces are honoured. |
59 | syn region butComment matchgroup=Comment start="\\#{" end="}" contains=butCommentBrace,butTodo |
60 | syn region butCommentBrace start="{" end="}" contains=butCommentBrace,butTodo contained transparent |
61 | |
62 | " Section headings - a bit hairy. Order wrt rest of file is important. |
116b7f38 |
63 | syn match butCmdSpecific "\\\(S\d\|[CAHSU]\)" nextgroup=butIdentArgH |
4d8caeda |
64 | " butIdentArgH -> butTextArgH? -> this, which highlights the rest of the para: |
65 | syn region butTextHeading start="" end="^\s*$" contained contains=@butText |
66 | " ...and overall title |
67 | syn match butCmdSpecific "\\title" nextgroup=butTextHeading |
68 | |
69 | " Bulleted lists |
70 | syn match butCmdSpecific "\\\(b\|n\|dd\)" nextgroup=butIdentArg |
71 | |
72 | " Config |
73 | syn match butCmdSpecific "\\cfg{\@=" nextgroup=butCfgArg |
74 | |
75 | " Index/biblio stuff |
76 | syn match butCmdSpecific "\\IM{\@=" nextgroup=butIMArg |
77 | syn match butCmdSpecific "\\BR\={\@=" nextgroup=butIdentArg |
78 | syn match butCmdSpecific "\\nocite{\@=" nextgroup=butIdentArg |
79 | |
80 | " Macros |
81 | syn match butCmdSpecific "\\define{\@=" nextgroup=butIdentArg |
82 | |
83 | " Specific inline commands |
84 | " (Some of these are defined out of paranoia about clashes with code quotes.) |
85 | " Formatting. |
86 | syn match butCmdSpecific "\\e{\@=" nextgroup=butEmphArg |
87 | syn match butCmdSpecific "\\c{\@=" nextgroup=butTextArg |
88 | syn match butCmdSpecific "\\cw{\@=" nextgroup=butTextArg |
89 | syn match butCmdSpecific "\\W{\@=" nextgroup=butHyperArg |
90 | " Indexing -- invisible entries. |
91 | syn match butCmdSpecific "\\I{\@=" nextgroup=butIndexArg |
92 | " Xref commands |
93 | syn match butCmdSpecific "\\[kK]{\@=" nextgroup=butIdentArg |
94 | " Unicode literal -- a bit special. |
95 | syn match butLiteral "\\u\x*" nextgroup=butTextArg |
96 | |
97 | " Command cluster. |
98 | syn cluster butCmd contains=butCmdGeneric,butCmdSpecific,ButComment |
99 | |
100 | " Types of argument. XXX is this cluster still useful? |
101 | syn cluster butArgument contains=butTextArg,butIdentArg,butEmphArgmbutCfgArg,butIdentArgH,butTextArgH |
102 | " Generic identifier. |
103 | syn region butIdentArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=@butArgument contained contains=butLiteral |
104 | " Specific chain for headings (needs to come after other heading material) |
105 | syn region butTextArgH matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butTextHeading contained contains=@butText |
106 | syn region butIdentArgH matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butTextArgH,butTextHeading contained contains=butLiteral |
107 | " Specific hack for \cfg{} |
108 | syn region butCfgArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butCfgArg contained contains=butLiteral |
109 | " Generic argument to be emphasised |
110 | syn region butEmphArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained contains=@butText |
111 | " Specific hack for \W{}{} |
112 | syn region butHyperArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained nextgroup=butTextArg |
113 | " Specific hack for \I{} |
114 | syn region butIndexArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained contains=@butText |
115 | " Specific hack for \IM{}{}... |
116 | syn region butIMArg matchgroup=butDelimited start="{" skip="\\}" end="}" contained nextgroup=butIMArg contains=@butText |
117 | " Default argument (due to being last). |
118 | syn region butTextArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=@butArgument contained contains=@butText |
119 | |
120 | " Rune from vim 6.1 help |
121 | if version >= 508 || !exists("did_halibut_syn_inits") |
122 | if version < 508 |
123 | let did_halibut_syn_inits = 1 |
124 | command -nargs=+ HiLink hi link <args> |
125 | else |
126 | command -nargs=+ HiLink hi def link <args> |
127 | endif |
128 | |
129 | HiLink butCmdGeneric Statement |
130 | HiLink butCmdSpecific Statement |
131 | |
132 | HiLink butLiteral SpecialChar |
133 | |
134 | HiLink butQLEmphInv Error |
135 | HiLink butIllegalChar Error |
136 | |
137 | HiLink butComment Comment |
138 | HiLink butCommentPara Comment |
139 | |
140 | HiLink butDelimiter Delimiter |
141 | |
142 | HiLink butIdentArg Identifier |
143 | HiLink butIdentArgH Identifier |
144 | HiLink butCfgArg Identifier |
145 | HiLink butEmphArg Underlined |
146 | HiLink butHyperArg Underlined |
147 | HiLink butIndexArg Identifier |
148 | HiLink butIMArg Identifier |
149 | |
150 | HiLink butTextHeading Underlined |
151 | |
152 | HiLink butTodo Todo |
153 | |
154 | delcommand HiLink |
155 | endif |
156 | |
157 | " b: local to current buffer |
158 | let b:current_syntax = "halibut" |