1"---------------------------------------------------------------------------- 2" Description: Vim Ada syntax file 3" Language: Ada (2005) 4" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $ 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: krischik $ 11" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $ 12" Version: 4.6 13" $Revision: 887 $ 14" $HeadURL: https://gnuada.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 35let s:keepcpo= &cpo 36set cpo&vim 37 38let b:current_syntax = "ada" 39 40" Section: Ada is entirely case-insensitive. {{{1 41" 42syntax case ignore 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 call rainbow_parenthsis#LoadRound () 102 call rainbow_parenthsis#Activate () 103else 104 syntax match adaSpecial "[:;().,]" 105endif 106 107" Section: := {{{1 108" 109" 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. 112" 113syntax match adaAssignment ":=" 114 115" 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_]*\)\=" 119 120" 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 128 129" Section: Labels for the goto statement. {{{1 130" 131syntax region adaLabel start="<<" end=">>" 132 133" Section: Boolean Constants {{{1 134" Boolean Constants. 135syntax keyword adaBoolean true false 136 137" Section: Warn C/C++ {{{1 138" 139" Warn people who try to use C/C++ notation erroneously: 140" 141syntax match adaError "//" 142syntax match adaError "/\*" 143syntax match adaError "==" 144 145 146" 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 158endif 159 160" Section: end {{{1 161" Unless special ("end loop", "end if", etc.), "end" marks the end of a 162" begin, package, task etc. Assigning it to adaEnd. 163syntax match adaEnd /\<end\>/ 164 165syntax keyword adaPreproc pragma 166 167syntax keyword adaRepeat exit for loop reverse while 168syntax match adaRepeat "\<end\s\+loop\>" 169 170syntax keyword adaStatement accept delay goto raise requeue return 171syntax keyword adaStatement terminate 172syntax match adaStatement "\<abort\>" 173 174" Section: Handle Ada's record keywords. {{{1 175" 176" '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). 182" 183syntax match adaStructure "\<record\>" contains=adaRecord 184syntax match adaStructure "\<end\s\+record\>" contains=adaRecord 185syntax match adaKeyword "\<record;"me=e-1 186 187" 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 193 194" 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 206 207" 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 211 212" Section: begin keywords {{{1 213" 214" These keywords begin various constructs, and you _might_ want to 215" highlight them differently. 216" 217syntax keyword adaBegin begin body declare entry generic 218syntax keyword adaBegin protected renames task 219 220syntax match adaBegin "\<function\>" contains=adaFunction 221syntax match adaBegin "\<procedure\>" contains=adaProcedure 222syntax match adaBegin "\<package\>" contains=adaPackage 223 224if exists("ada_with_gnat_project_files") 225 syntax keyword adaBegin project 226endif 227 228" Section: with, use {{{1 229" 230if exists("ada_withuse_ordinary") 231 " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. 232 syntax keyword adaKeyword with use 233else 234 " 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\)\>" 250endif 251 252" Section: String and character constants. {{{1 253" 254syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+ 255syntax match adaCharacter "'.'" 256 257" Section: Todo (only highlighted in comments) {{{1 258" 259syntax keyword adaTodo contained TODO FIXME XXX NOTE 260 261" Section: Comments. {{{1 262" 263syntax region adaComment 264 \ oneline 265 \ contains=adaTodo,adaLineError,@Spell 266 \ start="--" 267 \ end="$" 268 269" 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 276 277" 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 306 307" 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 336 337" Subsection: Begin, End {{{2 338" 339if exists ("ada_begin_preproc") 340 " This is the old default display: 341 highlight def link adaBegin PreProc 342 highlight def link adaEnd PreProc 343else 344 " This is the new default display: 345 highlight def link adaBegin Keyword 346 highlight def link adaEnd Keyword 347endif 348 349 350 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 357let &cpo = s:keepcpo 358unlet s:keepcpo 359 360finish " 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 369