blob: 415c9522fb9f555c8e230b39ae49ce54b085a23f [file] [log] [blame]
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00001"----------------------------------------------------------------------------
2" Description: Vim Ada syntax file
3" Language: Ada (2005)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00005" 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.
Bram Moolenaar5c736222010-01-06 20:54:52 +010010" $Author: krischik $
11" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
Bram Moolenaarc236c162008-07-13 17:41:49 +000012" Version: 4.6
Bram Moolenaar5c736222010-01-06 20:54:52 +010013" $Revision: 887 $
Bram Moolenaarc236c162008-07-13 17:41:49 +000014" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000015" 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.
27"
28" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0
29" advanced features.
30"------------------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +000031
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000032if exists("b:current_syntax") || version < 700
33 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000034endif
Bram Moolenaar9a7224b2012-04-30 15:56:52 +020035let s:keepcpo= &cpo
36set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000037
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000038let b:current_syntax = "ada"
Bram Moolenaar071d4272004-06-13 20:20:40 +000039
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000040" Section: Ada is entirely case-insensitive. {{{1
41"
42syntax case ignore
Bram Moolenaar071d4272004-06-13 20:20:40 +000043
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000044" Section: Highlighting commands {{{1
45"
46" There are 72 reserved words in total in Ada2005. Some keywords are
47" used in more than one way. For example:
Bram Moolenaar071d4272004-06-13 20:20:40 +000048" 1. "end" is a general keyword, but "end if" ends a Conditional.
49" 2. "then" is a conditional, but "and then" is an operator.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000050"
51for 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']
58 endif
59 if b:Item['kind'] == "a"
60 execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"'
61 endif
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']
70 endif
71endfor
Bram Moolenaar071d4272004-06-13 20:20:40 +000072
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000073" Section: others {{{1
74"
75syntax keyword adaLabel others
Bram Moolenaar071d4272004-06-13 20:20:40 +000076
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000077" Section: Operatoren {{{1
78"
79syntax keyword adaOperator abs mod not rem xor
80syntax match adaOperator "\<and\>"
81syntax match adaOperator "\<and\s\+then\>"
82syntax match adaOperator "\<or\>"
83syntax match adaOperator "\<or\s\+else\>"
84syntax match adaOperator "[-+*/<>&]"
85syntax keyword adaOperator **
86syntax match adaOperator "[/<>]="
87syntax keyword adaOperator =>
88syntax match adaOperator "\.\."
89syntax match adaOperator "="
Bram Moolenaar071d4272004-06-13 20:20:40 +000090
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000091" Section: <> {{{1
92"
93" Handle the box, <>, specially:
94"
95syntax keyword adaSpecial <>
Bram Moolenaar071d4272004-06-13 20:20:40 +000096
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000097" Section: rainbow color {{{1
98"
99if exists("g:ada_rainbow_color")
100 syntax match adaSpecial "[:;.,]"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000101 call rainbow_parenthsis#LoadRound ()
102 call rainbow_parenthsis#Activate ()
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000103else
104 syntax match adaSpecial "[:;().,]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105endif
106
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000107" Section: := {{{1
108"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109" We won't map "adaAssignment" by default, but we need to map ":=" to
110" something or the "=" inside it will be mislabelled as an operator.
111" Note that in Ada, assignment (:=) is not considered an operator.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000112"
113syntax match adaAssignment ":="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000114
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000115" Section: Numbers, including floating point, exponents, and alternate bases. {{{1
116"
117syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>"
118syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000120" Section: Identify leading numeric signs {{{1
121"
122" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This
123" handles "A3+-5" (etc.) correctly. " This assumes that if you put a
124" don't put a space after +/- when it's used " as an operator, you won't
125" put a space before it either -- which is true " in code I've seen.
126"
127syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000129" Section: Labels for the goto statement. {{{1
130"
131syntax region adaLabel start="<<" end=">>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000133" Section: Boolean Constants {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134" Boolean Constants.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000135syntax keyword adaBoolean true false
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000137" Section: Warn C/C++ {{{1
138"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139" Warn people who try to use C/C++ notation erroneously:
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000140"
141syntax match adaError "//"
142syntax match adaError "/\*"
143syntax match adaError "=="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000144
145
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000146" Section: Space Errors {{{1
147"
148if exists("g:ada_space_errors")
149 if !exists("g:ada_no_trail_space_error")
150 syntax match adaSpaceError excludenl "\s\+$"
151 endif
152 if !exists("g:ada_no_tab_space_error")
153 syntax match adaSpaceError " \+\t"me=e-1
154 endif
155 if !exists("g:ada_all_tab_usage")
156 syntax match adaSpecial "\t"
157 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158endif
159
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000160" Section: end {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161" Unless special ("end loop", "end if", etc.), "end" marks the end of a
Bram Moolenaar6c391a72021-09-09 21:55:11 +0200162" begin, package, task etc. Assigning it to adaEnd.
Bram Moolenaarc236c162008-07-13 17:41:49 +0000163syntax match adaEnd /\<end\>/
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000165syntax keyword adaPreproc pragma
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000167syntax keyword adaRepeat exit for loop reverse while
168syntax match adaRepeat "\<end\s\+loop\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000170syntax keyword adaStatement accept delay goto raise requeue return
171syntax keyword adaStatement terminate
172syntax match adaStatement "\<abort\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000173
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000174" Section: Handle Ada's record keywords. {{{1
175"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000176" 'record' usually starts a structure, but "with null record;" does not,
177" and 'end record;' ends a structure. The ordering here is critical -
178" 'record;' matches a "with null record", so make it a keyword (this can
179" match when the 'with' or 'null' is on a previous line).
180" We see the "end" in "end record" before the word record, so we match that
181" pattern as adaStructure (and it won't match the "record;" pattern).
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000182"
183syntax match adaStructure "\<record\>" contains=adaRecord
184syntax match adaStructure "\<end\s\+record\>" contains=adaRecord
185syntax match adaKeyword "\<record;"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000186
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000187" Section: type classes {{{1
188"
189syntax keyword adaStorageClass abstract access aliased array at constant delta
190syntax keyword adaStorageClass digits limited of private range tagged
191syntax keyword adaStorageClass interface synchronized
192syntax keyword adaTypedef subtype type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000194" Section: Conditionals {{{1
195"
196" "abort" after "then" is a conditional of its own.
197"
198syntax match adaConditional "\<then\>"
199syntax match adaConditional "\<then\s\+abort\>"
200syntax match adaConditional "\<else\>"
201syntax match adaConditional "\<end\s\+if\>"
202syntax match adaConditional "\<end\s\+case\>"
203syntax match adaConditional "\<end\s\+select\>"
204syntax keyword adaConditional if case select
205syntax keyword adaConditional elsif when
Bram Moolenaar071d4272004-06-13 20:20:40 +0000206
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000207" Section: other keywords {{{1
208syntax match adaKeyword "\<is\>" contains=adaRecord
209syntax keyword adaKeyword all do exception in new null out
210syntax keyword adaKeyword separate until overriding
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000212" Section: begin keywords {{{1
213"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000214" These keywords begin various constructs, and you _might_ want to
215" highlight them differently.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000216"
217syntax keyword adaBegin begin body declare entry generic
218syntax keyword adaBegin protected renames task
Bram Moolenaar071d4272004-06-13 20:20:40 +0000219
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000220syntax match adaBegin "\<function\>" contains=adaFunction
221syntax match adaBegin "\<procedure\>" contains=adaProcedure
222syntax match adaBegin "\<package\>" contains=adaPackage
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000224if exists("ada_with_gnat_project_files")
225 syntax keyword adaBegin project
226endif
227
228" Section: with, use {{{1
229"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230if exists("ada_withuse_ordinary")
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000231 " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases.
232 syntax keyword adaKeyword with use
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233else
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000234 " Highlight "with" and "use" clauses like C's "#include" when they're used
235 " to reference other compilation units; otherwise they're ordinary keywords.
236 " If we have vim 6.0 or later, we'll use its advanced pattern-matching
237 " capabilities so that we won't match leading spaces.
238 syntax match adaKeyword "\<with\>"
239 syntax match adaKeyword "\<use\>"
240 syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
241 syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
242 syntax match adaInc "\<with\>" contained contains=NONE
243 syntax match adaInc "\<with\s\+type\>" contained contains=NONE
244 syntax match adaInc "\<use\>" contained contains=NONE
245 " Recognize "with null record" as a keyword (even the "record").
246 syntax match adaKeyword "\<with\s\+null\s\+record\>"
247 " Consider generic formal parameters of subprograms and packages as keywords.
248 syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>"
249 syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000250endif
251
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000252" Section: String and character constants. {{{1
253"
254syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+
255syntax match adaCharacter "'.'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000257" Section: Todo (only highlighted in comments) {{{1
258"
259syntax keyword adaTodo contained TODO FIXME XXX NOTE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000261" Section: Comments. {{{1
262"
263syntax region adaComment
264 \ oneline
265 \ contains=adaTodo,adaLineError,@Spell
266 \ start="--"
267 \ end="$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000269" Section: line errors {{{1
270"
271" Note: Line errors have become quite slow with Vim 7.0
272"
273if exists("g:ada_line_errors")
274 syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL
275endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000277" Section: syntax folding {{{1
278"
279" Syntax folding is very tricky - for now I still suggest to use
280" indent folding
281"
282if exists("g:ada_folding") && g:ada_folding[0] == 's'
283 if stridx (g:ada_folding, 'p') >= 0
284 syntax region adaPackage
285 \ start="\(\<package\s\+body\>\|\<package\>\)\s*\z(\k*\)"
286 \ end="end\s\+\z1\s*;"
287 \ keepend extend transparent fold contains=ALL
288 endif
289 if stridx (g:ada_folding, 'f') >= 0
290 syntax region adaProcedure
291 \ start="\<procedure\>\s*\z(\k*\)"
292 \ end="\<end\>\s\+\z1\s*;"
293 \ keepend extend transparent fold contains=ALL
294 syntax region adaFunction
295 \ start="\<procedure\>\s*\z(\k*\)"
296 \ end="end\s\+\z1\s*;"
297 \ keepend extend transparent fold contains=ALL
298 endif
299 if stridx (g:ada_folding, 'f') >= 0
300 syntax region adaRecord
301 \ start="\<is\s\+record\>"
302 \ end="\<end\s\+record\>"
303 \ keepend extend transparent fold contains=ALL
304 endif
305endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000307" Section: The default methods for highlighting. Can be overridden later. {{{1
308"
309highlight def link adaCharacter Character
310highlight def link adaComment Comment
311highlight def link adaConditional Conditional
312highlight def link adaKeyword Keyword
313highlight def link adaLabel Label
314highlight def link adaNumber Number
315highlight def link adaSign Number
316highlight def link adaOperator Operator
317highlight def link adaPreproc PreProc
318highlight def link adaRepeat Repeat
319highlight def link adaSpecial Special
320highlight def link adaStatement Statement
321highlight def link adaString String
322highlight def link adaStructure Structure
323highlight def link adaTodo Todo
324highlight def link adaType Type
325highlight def link adaTypedef Typedef
326highlight def link adaStorageClass StorageClass
327highlight def link adaBoolean Boolean
328highlight def link adaException Exception
329highlight def link adaAttribute Tag
330highlight def link adaInc Include
331highlight def link adaError Error
332highlight def link adaSpaceError Error
333highlight def link adaLineError Error
334highlight def link adaBuiltinType Type
335highlight def link adaAssignment Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000337" Subsection: Begin, End {{{2
338"
339if exists ("ada_begin_preproc")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000340 " This is the old default display:
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000341 highlight def link adaBegin PreProc
342 highlight def link adaEnd PreProc
343else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000344 " This is the new default display:
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000345 highlight def link adaBegin Keyword
346 highlight def link adaEnd Keyword
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347endif
348
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000350
351" Section: sync {{{1
352"
353" We don't need to look backwards to highlight correctly;
354" this speeds things up greatly.
355syntax sync minlines=1 maxlines=1
356
Bram Moolenaar9a7224b2012-04-30 15:56:52 +0200357let &cpo = s:keepcpo
358unlet s:keepcpo
359
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000360finish " 1}}}
361
362"------------------------------------------------------------------------------
363" Copyright (C) 2006 Martin Krischik
364"
365" Vim is Charityware - see ":help license" or uganda.txt for licence details.
366"------------------------------------------------------------------------------
367"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
368"vim: foldmethod=marker