1 "----------------------------------------------------------------------------
2 " Description: Vim Ada syntax file
4 " $Id: ada.vim,v 1.5 2007/05/12 15:28:06 vimboss Exp $
5 " Copyright: Copyright (C) 2006 Martin Krischik
6 " Maintainer: Martin Krischik
7 " David A. Wheeler <dwheeler@dwheeler.com>
8 " Simon Bradley <simon.bradley@pitechnology.com>
9 " Contributors: Preben Randhol.
11 " $Date: 2007/05/12 15:28:06 $
14 " $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $
15 " http://www.dwheeler.com/vim
16 " History: 24.05.2006 MK Unified Headers
17 " 26.05.2006 MK ' should not be in iskeyword.
18 " 16.07.2006 MK Ada-Mode as vim-ball
19 " 02.10.2006 MK Better folding.
20 " 15.10.2006 MK Bram's suggestion for runtime integration
21 " 05.11.2006 MK Spell check for comments and strings only
22 " 05.11.2006 MK Bram suggested to save on spaces
23 " Help Page: help ft-ada-syntax
24 "------------------------------------------------------------------------------
25 " The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual".
26 " For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com.
28 " This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0
30 "------------------------------------------------------------------------------
32 if exists("b:current_syntax") || version < 700
36 let b:current_syntax = "ada"
38 " Section: Ada is entirely case-insensitive. {{{1
44 " Section: Highlighting commands {{{1
46 " There are 72 reserved words in total in Ada2005. Some keywords are
47 " used in more than one way. For example:
48 " 1. "end" is a general keyword, but "end if" ends a Conditional.
49 " 2. "then" is a conditional, but "and then" is an operator.
51 for b:Item in g:ada#Keywords
52 " Standard Exceptions (including I/O).
53 " We'll highlight the standard exceptions, similar to vim's Python mode.
54 " It's possible to redefine the standard exceptions as something else,
55 " but doing so is very bad practice, so simply highlighting them makes sense.
56 if b:Item['kind'] == "x"
57 execute "syntax keyword adaException " . b:Item['word']
59 if b:Item['kind'] == "a"
60 execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"'
62 " We don't normally highlight types in package Standard
63 " (Integer, Character, Float, etc.). I don't think it looks good
64 " with the other type keywords, and many Ada programs define
65 " so many of their own types that it looks inconsistent.
66 " However, if you want this highlighting, turn on "ada_standard_types".
67 " For package Standard's definition, see ARM section A.1.
68 if b:Item['kind'] == "t" && exists ("g:ada_standard_types")
69 execute "syntax keyword adaBuiltinType " . b:Item['word']
73 " Section: others {{{1
75 syntax keyword adaLabel others
77 " Section: Operatoren {{{1
79 syntax keyword adaOperator abs mod not rem xor
80 syntax match adaOperator "\<and\>"
81 syntax match adaOperator "\<and\s\+then\>"
82 syntax match adaOperator "\<or\>"
83 syntax match adaOperator "\<or\s\+else\>"
84 syntax match adaOperator "[-+*/<>&]"
85 syntax keyword adaOperator **
86 syntax match adaOperator "[/<>]="
87 syntax keyword adaOperator =>
88 syntax match adaOperator "\.\."
89 syntax match adaOperator "="
93 " Handle the box, <>, specially:
95 syntax keyword adaSpecial <>
97 " Section: rainbow color {{{1
99 if exists("g:ada_rainbow_color")
100 syntax match adaSpecial "[:;.,]"
101 runtime plugin/Rainbow_Parenthsis.vim
103 syntax match adaSpecial "[:;().,]"
108 " We won't map "adaAssignment" by default, but we need to map ":=" to
109 " something or the "=" inside it will be mislabelled as an operator.
110 " Note that in Ada, assignment (:=) is not considered an operator.
112 syntax match adaAssignment ":="
114 " Section: Numbers, including floating point, exponents, and alternate bases. {{{1
116 syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>"
117 syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\="
119 " Section: Identify leading numeric signs {{{1
121 " In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This
122 " handles "A3+-5" (etc.) correctly. " This assumes that if you put a
123 " don't put a space after +/- when it's used " as an operator, you won't
124 " put a space before it either -- which is true " in code I've seen.
126 syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1
128 " Section: Labels for the goto statement. {{{1
130 syntax region adaLabel start="<<" end=">>"
132 " Section: Boolean Constants {{{1
134 syntax keyword adaBoolean true false
136 " Section: Warn C/C++ {{{1
138 " Warn people who try to use C/C++ notation erroneously:
140 syntax match adaError "//"
141 syntax match adaError "/\*"
142 syntax match adaError "=="
145 " Section: Space Errors {{{1
147 if exists("g:ada_space_errors")
148 if !exists("g:ada_no_trail_space_error")
149 syntax match adaSpaceError excludenl "\s\+$"
151 if !exists("g:ada_no_tab_space_error")
152 syntax match adaSpaceError " \+\t"me=e-1
154 if !exists("g:ada_all_tab_usage")
155 syntax match adaSpecial "\t"
160 " Unless special ("end loop", "end if", etc.), "end" marks the end of a
161 " begin, package, task etc. Assiging it to adaEnd.
162 syntax match adaEnd "\<end\>"
164 syntax keyword adaPreproc pragma
166 syntax keyword adaRepeat exit for loop reverse while
167 syntax match adaRepeat "\<end\s\+loop\>"
169 syntax keyword adaStatement accept delay goto raise requeue return
170 syntax keyword adaStatement terminate
171 syntax match adaStatement "\<abort\>"
173 " Section: Handle Ada's record keywords. {{{1
175 " 'record' usually starts a structure, but "with null record;" does not,
176 " and 'end record;' ends a structure. The ordering here is critical -
177 " 'record;' matches a "with null record", so make it a keyword (this can
178 " match when the 'with' or 'null' is on a previous line).
179 " We see the "end" in "end record" before the word record, so we match that
180 " pattern as adaStructure (and it won't match the "record;" pattern).
182 syntax match adaStructure "\<record\>" contains=adaRecord
183 syntax match adaStructure "\<end\s\+record\>" contains=adaRecord
184 syntax match adaKeyword "\<record;"me=e-1
186 " Section: type classes {{{1
188 syntax keyword adaStorageClass abstract access aliased array at constant delta
189 syntax keyword adaStorageClass digits limited of private range tagged
190 syntax keyword adaStorageClass interface synchronized
191 syntax keyword adaTypedef subtype type
193 " Section: Conditionals {{{1
195 " "abort" after "then" is a conditional of its own.
197 syntax match adaConditional "\<then\>"
198 syntax match adaConditional "\<then\s\+abort\>"
199 syntax match adaConditional "\<else\>"
200 syntax match adaConditional "\<end\s\+if\>"
201 syntax match adaConditional "\<end\s\+case\>"
202 syntax match adaConditional "\<end\s\+select\>"
203 syntax keyword adaConditional if case select
204 syntax keyword adaConditional elsif when
206 " Section: other keywords {{{1
207 syntax match adaKeyword "\<is\>" contains=adaRecord
208 syntax keyword adaKeyword all do exception in new null out
209 syntax keyword adaKeyword separate until overriding
211 " Section: begin keywords {{{1
213 " These keywords begin various constructs, and you _might_ want to
214 " highlight them differently.
216 syntax keyword adaBegin begin body declare entry generic
217 syntax keyword adaBegin protected renames task
219 syntax match adaBegin "\<function\>" contains=adaFunction
220 syntax match adaBegin "\<procedure\>" contains=adaProcedure
221 syntax match adaBegin "\<package\>" contains=adaPackage
223 if exists("ada_with_gnat_project_files")
224 syntax keyword adaBegin project
227 " Section: with, use {{{1
229 if exists("ada_withuse_ordinary")
230 " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases.
231 syntax keyword adaKeyword with use
233 " Highlight "with" and "use" clauses like C's "#include" when they're used
234 " to reference other compilation units; otherwise they're ordinary keywords.
235 " If we have vim 6.0 or later, we'll use its advanced pattern-matching
236 " capabilities so that we won't match leading spaces.
237 syntax match adaKeyword "\<with\>"
238 syntax match adaKeyword "\<use\>"
239 syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
240 syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
241 syntax match adaInc "\<with\>" contained contains=NONE
242 syntax match adaInc "\<with\s\+type\>" contained contains=NONE
243 syntax match adaInc "\<use\>" contained contains=NONE
244 " Recognize "with null record" as a keyword (even the "record").
245 syntax match adaKeyword "\<with\s\+null\s\+record\>"
246 " Consider generic formal parameters of subprograms and packages as keywords.
247 syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>"
248 syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>"
251 " Section: String and character constants. {{{1
253 syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+
254 syntax match adaCharacter "'.'"
256 " Section: Todo (only highlighted in comments) {{{1
258 syntax keyword adaTodo contained TODO FIXME XXX NOTE
260 " Section: Comments. {{{1
262 syntax region adaComment
264 \ contains=adaTodo,adaLineError,@Spell
268 " Section: line errors {{{1
270 " Note: Line errors have become quite slow with Vim 7.0
272 if exists("g:ada_line_errors")
273 syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL
276 " Section: syntax folding {{{1
278 " Syntax folding is very tricky - for now I still suggest to use
281 if exists("g:ada_folding") && g:ada_folding[0] == 's'
282 if stridx (g:ada_folding, 'p') >= 0
283 syntax region adaPackage
284 \ start="\(\<package\s\+body\>\|\<package\>\)\s*\z(\k*\)"
285 \ end="end\s\+\z1\s*;"
286 \ keepend extend transparent fold contains=ALL
288 if stridx (g:ada_folding, 'f') >= 0
289 syntax region adaProcedure
290 \ start="\<procedure\>\s*\z(\k*\)"
291 \ end="\<end\>\s\+\z1\s*;"
292 \ keepend extend transparent fold contains=ALL
293 syntax region adaFunction
294 \ start="\<procedure\>\s*\z(\k*\)"
295 \ end="end\s\+\z1\s*;"
296 \ keepend extend transparent fold contains=ALL
298 if stridx (g:ada_folding, 'f') >= 0
299 syntax region adaRecord
300 \ start="\<is\s\+record\>"
301 \ end="\<end\s\+record\>"
302 \ keepend extend transparent fold contains=ALL
306 " Section: The default methods for highlighting. Can be overridden later. {{{1
308 highlight def link adaCharacter Character
309 highlight def link adaComment Comment
310 highlight def link adaConditional Conditional
311 highlight def link adaKeyword Keyword
312 highlight def link adaLabel Label
313 highlight def link adaNumber Number
314 highlight def link adaSign Number
315 highlight def link adaOperator Operator
316 highlight def link adaPreproc PreProc
317 highlight def link adaRepeat Repeat
318 highlight def link adaSpecial Special
319 highlight def link adaStatement Statement
320 highlight def link adaString String
321 highlight def link adaStructure Structure
322 highlight def link adaTodo Todo
323 highlight def link adaType Type
324 highlight def link adaTypedef Typedef
325 highlight def link adaStorageClass StorageClass
326 highlight def link adaBoolean Boolean
327 highlight def link adaException Exception
328 highlight def link adaAttribute Tag
329 highlight def link adaInc Include
330 highlight def link adaError Error
331 highlight def link adaSpaceError Error
332 highlight def link adaLineError Error
333 highlight def link adaBuiltinType Type
334 highlight def link adaAssignment Special
336 " Subsection: Begin, End {{{2
338 if exists ("ada_begin_preproc")
339 " This is the old default display:
340 highlight def link adaBegin PreProc
341 highlight def link adaEnd PreProc
343 " This is the new default display:
344 highlight def link adaBegin Keyword
345 highlight def link adaEnd Keyword
349 " Section: formatoptions {{{1
351 setlocal formatoptions+=ron
355 " We don't need to look backwards to highlight correctly;
356 " this speeds things up greatly.
357 syntax sync minlines=1 maxlines=1
361 "------------------------------------------------------------------------------
362 " Copyright (C) 2006 Martin Krischik
364 " Vim is Charityware - see ":help license" or uganda.txt for licence details.
365 "------------------------------------------------------------------------------
366 "vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
367 "vim: foldmethod=marker