blob: 46257010d0557a18b155af410c27b41a86abc874 [file] [log] [blame]
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00001"------------------------------------------------------------------------------
2" Description: Perform Ada specific completion & tagging.
3" Language: Ada (2005)
4" $Id$
5" Maintainer: Martin Krischik
6" Neil Bird <neil@fnxweb.com>
7" $Author$
8" $Date$
9" Version: 4.2
10" $Revision$
11" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $
12" History: 24.05.2006 MK Unified Headers
13" 26.05.2006 MK ' should not be in iskeyword.
14" 16.07.2006 MK Ada-Mode as vim-ball
15" 02.10.2006 MK Better folding.
16" 15.10.2006 MK Bram's suggestion for runtime integration
17" 05.11.2006 MK Bram suggested not to use include protection for
18" autoload
19" 05.11.2006 MK Bram suggested to save on spaces
20" Help Page: ft-ada-functions
21"------------------------------------------------------------------------------
22
23if version < 700
24 finish
25endif
26
27" Section: Constants {{{1
28"
29let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*'
30let g:ada#WordRegex = '\a\w*'
31let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*"
32let g:ada#Keywords = []
33
34" Section: g:ada#Keywords {{{1
35"
36" Section: add Ada keywords {{{2
37"
38for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor']
39 let g:ada#Keywords += [{
40 \ 'word': Item,
41 \ 'menu': 'keyword',
42 \ 'info': 'Ada keyword.',
43 \ 'kind': 'k',
44 \ 'icase': 1}]
45endfor
46
47" Section: GNAT Project Files {{{3
48"
49if exists ('g:ada_with_gnat_project_files')
50 for Item in ['project']
51 let g:ada#Keywords += [{
52 \ 'word': Item,
53 \ 'menu': 'keyword',
54 \ 'info': 'GNAT projectfile keyword.',
55 \ 'kind': 'k',
56 \ 'icase': 1}]
57 endfor
58endif
59
60" Section: add standart exception {{{2
61"
62for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
63 let g:ada#Keywords += [{
64 \ 'word': Item,
65 \ 'menu': 'exception',
66 \ 'info': 'Ada standart exception.',
67 \ 'kind': 'x',
68 \ 'icase': 1}]
69endfor
70
71" Section: add GNAT exception {{{3
72"
73if exists ('g:ada_gnat_extensions')
74 for Item in ['Assert_Failure']
75 let g:ada#Keywords += [{
76 \ 'word': Item,
77 \ 'menu': 'exception',
78 \ 'info': 'GNAT exception.',
79 \ 'kind': 'x',
80 \ 'icase': 1}]
81 endfor
82endif
83
84" Section: add Ada buildin types {{{2
85"
86for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration']
87 let g:ada#Keywords += [{
88 \ 'word': Item,
89 \ 'menu': 'type',
90 \ 'info': 'Ada buildin type.',
91 \ 'kind': 't',
92 \ 'icase': 1}]
93endfor
94
95" Section: add GNAT buildin types {{{3
96"
97if exists ('g:ada_gnat_extensions')
98 for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float']
99 let g:ada#Keywords += [{
100 \ 'word': Item,
101 \ 'menu': 'type',
102 \ 'info': 'GNAT buildin type.',
103 \ 'kind': 't',
104 \ 'icase': 1}]
105 endfor
106endif
107
108" Section: add Ada Attributes {{{2
109"
110for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write']
111 let g:ada#Keywords += [{
112 \ 'word': Item,
113 \ 'menu': 'attribute',
114 \ 'info': 'Ada attribute.',
115 \ 'kind': 'a',
116 \ 'icase': 1}]
117endfor
118
119" Section: add GNAT Attributes {{{3
120"
121if exists ('g:ada_gnat_extensions')
122 for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size']
123 let g:ada#Keywords += [{
124 \ 'word': Item,
125 \ 'menu': 'attribute',
126 \ 'info': 'GNAT attribute.',
127 \ 'kind': 'a',
128 \ 'icase': 1}]
129 endfor
130endif
131
132" Section: add Ada Pragmas {{{2
133"
134for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components']
135 let g:ada#Keywords += [{
136 \ 'word': Item,
137 \ 'menu': 'pragma',
138 \ 'info': 'Ada pragma.',
139 \ 'kind': 'p',
140 \ 'icase': 1}]
141endfor
142
143" Section: add GNAT Pragmas {{{3
144"
145if exists ('g:ada_gnat_extensions')
146 for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External']
147 let g:ada#Keywords += [{
148 \ 'word': Item,
149 \ 'menu': 'pragma',
150 \ 'info': 'GNAT pragma.',
151 \ 'kind': 'p',
152 \ 'icase': 1}]
153 endfor
154endif
155" 1}}}
156
157" Section: g:ada#Ctags_Kinds {{{1
158"
159let g:ada#Ctags_Kinds = {
160 \ 'P': ["packspec", "package specifications"],
161 \ 'p': ["package", "packages"],
162 \ 'T': ["typespec", "type specifications"],
163 \ 't': ["type", "types"],
164 \ 'U': ["subspec", "subtype specifications"],
165 \ 'u': ["subtype", "subtypes"],
166 \ 'c': ["component", "record type components"],
167 \ 'l': ["literal", "enum type literals"],
168 \ 'V': ["varspec", "variable specifications"],
169 \ 'v': ["variable", "variables"],
170 \ 'f': ["formal", "generic formal parameters"],
171 \ 'n': ["constant", "constants"],
172 \ 'x': ["exception", "user defined exceptions"],
173 \ 'R': ["subprogspec", "subprogram specifications"],
174 \ 'r': ["subprogram", "subprograms"],
175 \ 'K': ["taskspec", "task specifications"],
176 \ 'k': ["task", "tasks"],
177 \ 'O': ["protectspec", "protected data specifications"],
178 \ 'o': ["protected", "protected data"],
179 \ 'E': ["entryspec", "task/protected data entry specifications"],
180 \ 'e': ["entry", "task/protected data entries"],
181 \ 'b': ["label", "labels"],
182 \ 'i': ["identifier", "loop/declare identifiers"],
183 \ 'a': ["autovar", "automatic variables"],
184 \ 'y': ["annon", "loops and blocks with no identifier"]}
185
186" Section: ada#Word (...) {{{1
187"
188" Extract current Ada word across multiple lines
189" AdaWord ([line, column])\
190"
191function ada#Word (...)
192 if a:0 > 1
193 let l:Line_Nr = a:1
194 let l:Column_Nr = a:2 - 1
195 else
196 let l:Line_Nr = line('.')
197 let l:Column_Nr = col('.') - 1
198 endif
199
200 let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
201
202 " Cope with tag searching for items in comments; if we are, don't loop
203 " backards looking for previous lines
204 if l:Column_Nr > strlen(l:Line)
205 " We were in a comment
206 let l:Line = getline(l:Line_Nr)
207 let l:Search_Prev_Lines = 0
208 else
209 let l:Search_Prev_Lines = 1
210 endif
211
212 " Go backwards until we find a match (Ada ID) that *doesn't* include our
213 " location - i.e., the previous ID. This is because the current 'correct'
214 " match will toggle matching/not matching as we traverse characters
215 " backwards. Thus, we have to find the previous unrelated match, exclude
216 " it, then use the next full match (ours).
217 " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)]
218 " ... but start, here, one after the required char.
219 let l:New_Column = l:Column_Nr + 1
220 while 1
221 let l:New_Column = l:New_Column - 1
222 if l:New_Column < 0
223 " Have to include previous l:Line from file
224 let l:Line_Nr = l:Line_Nr - 1
225 if l:Line_Nr < 1 || !l:Search_Prev_Lines
226 " Start of file or matching in a comment
227 let l:Line_Nr = 1
228 let l:New_Column = 0
229 let l:Our_Match = match (l:Line, g:ada#WordRegex )
230 break
231 endif
232 " Get previous l:Line, and prepend it to our search string
233 let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
234 let l:New_Column = strlen (l:New_Line) - 1
235 let l:Column_Nr = l:Column_Nr + l:New_Column
236 let l:Line = l:New_Line . l:Line
237 endif
238 " Check to see if this is a match excluding 'us'
239 let l:Match_End = l:New_Column +
240 \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1
241 if l:Match_End >= l:New_Column &&
242 \ l:Match_End < l:Column_Nr
243 " Yes
244 let l:Our_Match = l:Match_End+1 +
245 \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex )
246 break
247 endif
248 endwhile
249
250 " Got anything?
251 if l:Our_Match < 0
252 return ''
253 else
254 let l:Line = strpart (l:Line, l:Our_Match)
255 endif
256
257 " Now simply add further lines until the match gets no bigger
258 let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
259 let l:Last_Line = line ('$')
260 let l:Line_Nr = line ('.') + 1
261 while l:Line_Nr <= l:Last_Line
262 let l:Last_Match = l:Match_String
263 let l:Line = l:Line .
264 \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '')
265 let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
266 if l:Match_String == l:Last_Match
267 break
268 endif
269 endwhile
270
271 " Strip whitespace & return
272 return substitute (l:Match_String, '\s\+', '', 'g')
273endfunction ada#Word
274
275" Section: ada#List_Tag (...) {{{1
276"
277" List tags in quickfix window
278"
279function ada#List_Tag (...)
280 if a:0 > 1
281 let l:Tag_Word = ada#Word (a:1, a:2)
282 elseif a:0 > 0
283 let l:Tag_Word = a:1
284 else
285 let l:Tag_Word = ada#Word ()
286 endif
287
288 echo "Searching for" l:Tag_Word
289
290 let l:Pattern = '^' . l:Tag_Word . '$'
291 let l:Tag_List = taglist (l:Pattern)
292 let l:Error_List = []
293 "
294 " add symbols
295 "
296 for Tag_Item in l:Tag_List
297 if l:Tag_Item['kind'] == ''
298 let l:Tag_Item['kind'] = 's'
299 endif
300
301 let l:Error_List += [
302 \ l:Tag_Item['filename'] . '|' .
303 \ l:Tag_Item['cmd'] . '|' .
304 \ l:Tag_Item['kind'] . "\t" .
305 \ l:Tag_Item['name'] ]
306 endfor
307 set errorformat=%f\|%l\|%m
308 cexpr l:Error_List
309 cwindow
310endfunction ada#List_Tag
311
312" Section: ada#Jump_Tag (Word, Mode) {{{1
313"
314" Word tag - include '.' and if Ada make uppercase
315"
316function ada#Jump_Tag (Word, Mode)
317 if a:Word == ''
318 " Get current word
319 let l:Word = ada#Word()
320 if l:Word == ''
321 throw "NOT_FOUND: no identifier found."
322 endif
323 else
324 let l:Word = a:Word
325 endif
326
327 echo "Searching for " . l:Word
328
329 try
330 execute a:Mode l:Word
331 catch /.*:E426:.*/
332 let ignorecase = &ignorecase
333 set ignorecase
334 execute a:Mode l:Word
335 let &ignorecase = ignorecase
336 endtry
337
338 return
339endfunction ada#Jump_Tag
340
341" Section: ada#Insert_Backspace () {{{1
342"
343" Backspace at end of line after auto-inserted commentstring '-- ' wipes it
344"
345function ada#Insert_Backspace ()
346 let l:Line = getline ('.')
347 if col ('.') > strlen (l:Line) &&
348 \ match (l:Line, '-- $') != -1 &&
349 \ match (&comments,'--') != -1
350 return "\<bs>\<bs>\<bs>"
351 else
352 return "\<bs>"
353 endif
354
355 return
356endfunction ada#InsertBackspace
357
358" Section: Insert Completions {{{1
359"
360" Section: ada#User_Complete(findstart, base) {{{2
361"
362" This function is used for the 'complete' option.
363"
364function! ada#User_Complete(findstart, base)
365 if a:findstart == 1
366 "
367 " locate the start of the word
368 "
369 let line = getline ('.')
370 let start = col ('.') - 1
371 while start > 0 && line[start - 1] =~ '\i\|'''
372 let start -= 1
373 endwhile
374 return start
375 else
376 "
377 " look up matches
378 "
379 let l:Pattern = '^' . a:base . '.*$'
380 "
381 " add keywords
382 "
383 for Tag_Item in g:ada#Keywords
384 if l:Tag_Item['word'] =~? l:Pattern
385 if complete_add (l:Tag_Item) == 0
386 return []
387 endif
388 if complete_check ()
389 return []
390 endif
391 endif
392 endfor
393 return []
394 endif
395endfunction ada#User_Complete
396
397" Section: ada#Completion (cmd) {{{2
398"
399" Word completion (^N/^R/^X^]) - force '.' inclusion
400function ada#Completion (cmd)
401 set iskeyword+=46
402 return a:cmd . "\<C-R>=ada#Completion_End ()\<CR>"
403endfunction ada#Completion
404
405" Section: ada#Completion_End () {{{2
406"
407function ada#Completion_End ()
408 set iskeyword-=46
409 return ''
410endfunction ada#Completion_End
411
412" Section: ada#Create_Tags {{{1
413"
414function ada#Create_Tags (option)
415 if a:option == 'file'
416 let l:Filename = fnamemodify (bufname ('%'), ':p')
417 elseif a:option == 'dir'
418 let l:Filename =
419 \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " .
420 \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " .
421 \ fnamemodify (bufname ('%'), ':p:h') . "*.ads"
422 else
423 let l:Filename = a:option
424 endif
425 execute '!ctags --excmd=number ' . l:Filename
426endfunction ada#Create_Tags
427
428function ada#Switch_Session (New_Session) "{{{1
429 if a:New_Session != v:this_session
430 "
431 " We actualy got a new session - otherwise there
432 " is nothing to do.
433 "
434 if strlen (v:this_session) > 0
435 execute 'mksession! ' . v:this_session
436 endif
437
438 let v:this_session = a:New_Session
439
440 if filereadable (v:this_session)
441 execute 'source ' . v:this_session
442 endif
443
444 augroup ada_session
445 autocmd!
446 autocmd VimLeavePre * execute 'mksession! ' . v:this_session
447 augroup END
448 endif
449
450 return
451endfunction ada#Switch_Session "}}}1
452
453" Section: GNAT Pretty Printer folding {{{1
454"
455if exists('g:ada_folding') && g:ada_folding[0] == 'g'
456 "
457 " Lines consisting only of ')' ';' are due to a gnat pretty bug and
458 " have the same level as the line above (can't happen in the first
459 " line).
460 "
461 let s:Fold_Collate = '^\([;)]*$\|'
462
463 "
464 " some lone statements are folded with the line above
465 "
466 if stridx (g:ada_folding, 'i') >= 0
467 let s:Fold_Collate .= '\s\+\<is\>$\|'
468 endif
469 if stridx (g:ada_folding, 'b') >= 0
470 let s:Fold_Collate .= '\s\+\<begin\>$\|'
471 endif
472 if stridx (g:ada_folding, 'p') >= 0
473 let s:Fold_Collate .= '\s\+\<private\>$\|'
474 endif
475 if stridx (g:ada_folding, 'x') >= 0
476 let s:Fold_Collate .= '\s\+\<exception\>$\|'
477 endif
478
479 " We also handle empty lines and
480 " comments here.
481 let s:Fold_Collate .= '--\)'
482
483 function ada#Pretty_Print_Folding (Line) " {{{2
484 let l:Text = getline (a:Line)
485
486 if l:Text =~ s:Fold_Collate
487 "
488 " fold with line above
489 "
490 let l:Level = "="
491 elseif l:Text =~ '^\s\+('
492 "
493 " gnat outdents a line which stards with a ( by one characters so
494 " that parameters which follow are aligned.
495 "
496 let l:Level = (indent (a:Line) + 1) / &shiftwidth
497 else
498 let l:Level = indent (a:Line) / &shiftwidth
499 endif
500
501 return l:Level
502 endfunction ada#Pretty_Print_Folding " }}}2
503endif
504
505" Section: Options and Menus {{{1
506"
507" Section: ada#Switch_Syntax_Options {{{2
508"
509function ada#Switch_Syntax_Option (option)
510 syntax off
511 if exists ('g:ada_' . a:option)
512 unlet g:ada_{a:option}
513 echo a:option . 'now off'
514 else
515 let g:ada_{a:option}=1
516 echo a:option . 'now on'
517 endif
518 syntax on
519endfunction ada#Switch_Syntax_Option
520
521" Section: ada#Map_Menu {{{2
522"
523function ada#Map_Menu (Text, Keys, Command)
524 if a:Keys[0] == ':'
525 execute
526 \ "50amenu " .
527 \ "Ada." . escape(a:Text, ' ') .
528 \ "<Tab>" . a:Keys .
529 \ " :" . a:Command . "<CR>"
530 execute
531 \ "command -buffer " .
532 \ a:Keys[1:] .
533 \" :" . a:Command . "<CR>"
534 elseif a:Keys[0] == '<'
535 execute
536 \ "50amenu " .
537 \ "Ada." . escape(a:Text, ' ') .
538 \ "<Tab>" . a:Keys .
539 \ " :" . a:Command . "<CR>"
540 execute
541 \ "nnoremap <buffer> " .
542 \ a:Keys .
543 \" :" . a:Command . "<CR>"
544 execute
545 \ "inoremap <buffer> " .
546 \ a:Keys .
547 \" <C-O>:" . a:Command . "<CR>"
548 else
549 execute
550 \ "50amenu " .
551 \ "Ada." . escape(a:Text, ' ') .
552 \ "<Tab>" . escape(g:mapleader . "a" . a:Keys , '\') .
553 \ " :" . a:Command . "<CR>"
554 execute
555 \ "nnoremap <buffer>" .
556 \ escape(g:mapleader . "a" . a:Keys , '\') .
557 \" :" . a:Command
558 execute
559 \ "inoremap <buffer>" .
560 \ escape(g:mapleader . "a" . a:Keys , '\') .
561 \" <C-O>:" . a:Command
562 endif
563 return
564endfunction
565
566" Section: ada#Map_Popup {{{2
567"
568function ada#Map_Popup (Text, Keys, Command)
569 execute
570 \ "50amenu " .
571 \ "PopUp." . escape(a:Text, ' ') .
572 \ "<Tab>" . escape(g:mapleader . "a" . a:Keys , '\') .
573 \ " :" . a:Command . "<CR>"
574
575 call ada#Map_Menu (a:Text, a:Keys, a:Command)
576 return
577endfunction ada#Map_Popup
578
579" }}}1
580
581lockvar g:ada#WordRegex
582lockvar g:ada#DotWordRegex
583lockvar g:ada#Comment
584lockvar! g:ada#Keywords
585lockvar! g:ada#Ctags_Kinds
586
587finish " 1}}}
588
589"------------------------------------------------------------------------------
590" Copyright (C) 2006 Martin Krischik
591"
592" Vim is Charityware - see ":help license" or uganda.txt for licence details.
593"------------------------------------------------------------------------------
594" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
595" vim: foldmethod=marker