1"---------------------------------------------------------------------------- 2" Description: Vim Ada syntax file 3" Language: Ada (2005) 4" $Id$ 5" Copyright: Copyright (C) 2006 Martin Krischik 6" Maintainer: Martin Krischik 7" David A. Wheeler <[email protected]> 8" Simon Bradley <[email protected]> 9" Contributors: Preben Randhol. 10" $Author$ 11" $Date$ 12" Version: 4.2 13" $Revision$ 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. 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"------------------------------------------------------------------------------ 31 32if exists("b:current_syntax") || version < 700 33 finish 34endif 35 36let b:current_syntax = "ada" 37 38" Section: Ada is entirely case-insensitive. {{{1 39" 40syntax case ignore 41setlocal nosmartcase 42setlocal ignorecase 43 44" 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: 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. 50" 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 72 73" Section: others {{{1 74" 75syntax keyword adaLabel others 76 77" 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 "=" 90 91" Section: <> {{{1 92" 93" Handle the box, <>, specially: 94" 95syntax keyword adaSpecial <> 96 97" Section: rainbow color {{{1 98" 99if exists("g:ada_rainbow_color") 100 syntax match adaSpecial "[:;.,]" 101 runtime plugin/Rainbow_Parenthsis.vim 102else 103 syntax match adaSpecial "[:;().,]" 104endif 105 106" Section: := {{{1 107" 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. 111" 112syntax match adaAssignment ":=" 113 114" Section: Numbers, including floating point, exponents, and alternate bases. {{{1 115" 116syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" 117syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" 118 119" Section: Identify leading numeric signs {{{1 120" 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. 125" 126syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 127 128" Section: Labels for the goto statement. {{{1 129" 130syntax region adaLabel start="<<" end=">>" 131 132" Section: Boolean Constants {{{1 133" Boolean Constants. 134syntax keyword adaBoolean true false 135 136" Section: Warn C/C++ {{{1 137" 138" Warn people who try to use C/C++ notation erroneously: 139" 140syntax match adaError "//" 141syntax match adaError "/\*" 142syntax match adaError "==" 143 144 145" Section: Space Errors {{{1 146" 147if exists("g:ada_space_errors") 148 if !exists("g:ada_no_trail_space_error") 149 syntax match adaSpaceError excludenl "\s\+$" 150 endif 151 if !exists("g:ada_no_tab_space_error") 152 syntax match adaSpaceError " \+\t"me=e-1 153 endif 154 if !exists("g:ada_all_tab_usage") 155 syntax match adaSpecial "\t" 156 endif 157endif 158 159" Section: end {{{1 160" Unless special ("end loop", "end if", etc.), "end" marks the end of a 161" begin, package, task etc. Assiging it to adaEnd. 162syntax match adaEnd "\<end\>" 163 164syntax keyword adaPreproc pragma 165 166syntax keyword adaRepeat exit for loop reverse while 167syntax match adaRepeat "\<end\s\+loop\>" 168 169syntax keyword adaStatement accept delay goto raise requeue return 170syntax keyword adaStatement terminate 171syntax match adaStatement "\<abort\>" 172 173" Section: Handle Ada's record keywords. {{{1 174" 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). 181" 182syntax match adaStructure "\<record\>" contains=adaRecord 183syntax match adaStructure "\<end\s\+record\>" contains=adaRecord 184syntax match adaKeyword "\<record;"me=e-1 185 186" Section: type classes {{{1 187" 188syntax keyword adaStorageClass abstract access aliased array at constant delta 189syntax keyword adaStorageClass digits limited of private range tagged 190syntax keyword adaStorageClass interface synchronized 191syntax keyword adaTypedef subtype type 192 193" Section: Conditionals {{{1 194" 195" "abort" after "then" is a conditional of its own. 196" 197syntax match adaConditional "\<then\>" 198syntax match adaConditional "\<then\s\+abort\>" 199syntax match adaConditional "\<else\>" 200syntax match adaConditional "\<end\s\+if\>" 201syntax match adaConditional "\<end\s\+case\>" 202syntax match adaConditional "\<end\s\+select\>" 203syntax keyword adaConditional if case select 204syntax keyword adaConditional elsif when 205 206" Section: other keywords {{{1 207syntax match adaKeyword "\<is\>" contains=adaRecord 208syntax keyword adaKeyword all do exception in new null out 209syntax keyword adaKeyword separate until overriding 210 211" Section: begin keywords {{{1 212" 213" These keywords begin various constructs, and you _might_ want to 214" highlight them differently. 215" 216syntax keyword adaBegin begin body declare entry generic 217syntax keyword adaBegin protected renames task 218 219syntax match adaBegin "\<function\>" contains=adaFunction 220syntax match adaBegin "\<procedure\>" contains=adaProcedure 221syntax match adaBegin "\<package\>" contains=adaPackage 222 223if exists("ada_with_gnat_project_files") 224 syntax keyword adaBegin project 225endif 226 227" Section: with, use {{{1 228" 229if 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 232else 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\)\>" 249endif 250 251" Section: String and character constants. {{{1 252" 253syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ 254syntax match adaCharacter "'.'" 255 256" Section: Todo (only highlighted in comments) {{{1 257" 258syntax keyword adaTodo contained TODO FIXME XXX NOTE 259 260" Section: Comments. {{{1 261" 262syntax region adaComment 263 \ oneline 264 \ contains=adaTodo,adaLineError,@Spell 265 \ start="--" 266 \ end="$" 267 268" Section: line errors {{{1 269" 270" Note: Line errors have become quite slow with Vim 7.0 271" 272if exists("g:ada_line_errors") 273 syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL 274endif 275 276" Section: syntax folding {{{1 277" 278" Syntax folding is very tricky - for now I still suggest to use 279" indent folding 280" 281if 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 287 endif 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 297 endif 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 303 endif 304endif 305 306" Section: The default methods for highlighting. Can be overridden later. {{{1 307" 308highlight def link adaCharacter Character 309highlight def link adaComment Comment 310highlight def link adaConditional Conditional 311highlight def link adaKeyword Keyword 312highlight def link adaLabel Label 313highlight def link adaNumber Number 314highlight def link adaSign Number 315highlight def link adaOperator Operator 316highlight def link adaPreproc PreProc 317highlight def link adaRepeat Repeat 318highlight def link adaSpecial Special 319highlight def link adaStatement Statement 320highlight def link adaString String 321highlight def link adaStructure Structure 322highlight def link adaTodo Todo 323highlight def link adaType Type 324highlight def link adaTypedef Typedef 325highlight def link adaStorageClass StorageClass 326highlight def link adaBoolean Boolean 327highlight def link adaException Exception 328highlight def link adaAttribute Tag 329highlight def link adaInc Include 330highlight def link adaError Error 331highlight def link adaSpaceError Error 332highlight def link adaLineError Error 333highlight def link adaBuiltinType Type 334highlight def link adaAssignment Special 335 336" Subsection: Begin, End {{{2 337" 338if exists ("ada_begin_preproc") 339 " This is the old default display: 340 highlight def link adaBegin PreProc 341 highlight def link adaEnd PreProc 342else 343 " This is the new default display: 344 highlight def link adaBegin Keyword 345 highlight def link adaEnd Keyword 346endif 347 348 349" Section: formatoptions {{{1 350" 351setlocal formatoptions+=ron 352 353" Section: sync {{{1 354" 355" We don't need to look backwards to highlight correctly; 356" this speeds things up greatly. 357syntax sync minlines=1 maxlines=1 358 359finish " 1}}} 360 361"------------------------------------------------------------------------------ 362" Copyright (C) 2006 Martin Krischik 363" 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 368