diff runtime/syntax/lpc.vim @ 0:76efa0be13f1

Initial revision
author atsuki
date Sat, 10 Nov 2007 15:07:22 +0900
parents
children 67300faee616
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/syntax/lpc.vim	Sat Nov 10 15:07:22 2007 +0900
@@ -0,0 +1,455 @@
+" Vim syntax file
+" Language:	LPC
+" Maintainer:	Shizhu Pan <poet@mudbuilder.net>
+" URL:		http://poet.tomud.com/pub/lpc.vim.bz2
+" Last Change:	2003 May 11
+" Comments:	If you are using Vim 6.2 or later, see :h lpc.vim for
+"		file type recognizing, if not, you had to use modeline.
+
+
+" Nodule: This is the start nodule. {{{1
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+  syntax clear
+elseif exists("b:current_syntax")
+  finish
+endif
+
+" Nodule: Keywords {{{1
+
+" LPC keywords
+" keywords should always be highlighted so "contained" is not used.
+syn cluster	lpcKeywdGrp	contains=lpcConditional,lpcLabel,lpcOperator,lpcRepeat,lpcStatement,lpcModifier,lpcReserved
+
+syn keyword	lpcConditional	if else switch
+syn keyword	lpcLabel	case default
+syn keyword	lpcOperator	catch efun in inherit
+syn keyword	lpcRepeat	do for foreach while
+syn keyword	lpcStatement	break continue return
+
+syn match	lpcEfunError	/efun[^:]/ display
+
+" Illegal to use keyword as function
+" It's not working, maybe in the next version.
+syn keyword	lpcKeywdError	contained if for foreach return switch while
+
+" These are keywords only because they take lvalue or type as parameter,
+" so these keywords should only be used as function but cannot be names of
+" user-defined functions.
+syn keyword	lpcKeywdFunc	new parse_command sscanf time_expression
+
+" Nodule: Type and modifiers {{{1
+
+" Type names list.
+
+" Special types
+syn keyword	lpcType		void mixed unknown
+" Scalar/Value types.
+syn keyword	lpcType		int float string
+" Pointer types.
+syn keyword	lpcType		array buffer class function mapping object
+" Other types.
+if exists("lpc_compat_32")
+    syn keyword     lpcType	    closure status funcall
+else
+    syn keyword     lpcError	    closure status
+    syn keyword     lpcType	    multiset
+endif
+
+" Type modifier.
+syn keyword	lpcModifier	nomask private public
+syn keyword	lpcModifier	varargs virtual
+
+" sensible modifiers
+if exists("lpc_pre_v22")
+    syn keyword	lpcReserved	nosave protected ref
+    syn keyword	lpcModifier	static
+else
+    syn keyword	lpcError	static
+    syn keyword	lpcModifier	nosave protected ref
+endif
+
+" Nodule: Applies {{{1
+
+" Match a function declaration or function pointer
+syn match	lpcApplyDecl	excludenl /->\h\w*(/me=e-1 contains=lpcApplies transparent display
+
+" We should note that in func_spec.c the efun definition syntax is so
+" complicated that I use such a long regular expression to describe.
+syn match	lpcLongDecl	excludenl /\(\s\|\*\)\h\+\s\h\+(/me=e-1 contains=@lpcEfunGroup,lpcType,@lpcKeywdGrp transparent display
+
+" this is form for all functions
+" ->foo() form had been excluded
+syn match	lpcFuncDecl	excludenl /\h\w*(/me=e-1 contains=lpcApplies,@lpcEfunGroup,lpcKeywdError transparent display
+
+" The (: :) parenthesis or $() forms a function pointer
+syn match	lpcFuncName	/(:\s*\h\+\s*:)/me=e-1 contains=lpcApplies,@lpcEfunGroup transparent display contained
+syn match	lpcFuncName	/(:\s*\h\+,/ contains=lpcApplies,@lpcEfunGroup transparent display contained
+syn match	lpcFuncName	/\$(\h\+)/ contains=lpcApplies,@lpcEfunGroup transparent display contained
+
+" Applies list.
+"       system applies
+syn keyword     lpcApplies      contained __INIT clean_up create destructor heart_beat id init move_or_destruct reset
+"       interactive
+syn keyword     lpcApplies      contained catch_tell logon net_dead process_input receive_message receive_snoop telnet_suboption terminal_type window_size write_prompt
+"       master applies
+syn keyword     lpcApplies      contained author_file compile_object connect crash creator_file domain_file epilog error_handler flag get_bb_uid get_root_uid get_save_file_name log_error make_path_absolute object_name preload privs_file retrieve_ed_setup save_ed_setup slow_shutdown
+syn keyword     lpcApplies      contained valid_asm valid_bind valid_compile_to_c valid_database valid_hide valid_link valid_object valid_override valid_read valid_save_binary valid_seteuid valid_shadow valid_socket valid_write
+"       parsing
+syn keyword     lpcApplies      contained inventory_accessible inventory_visible is_living parse_command_adjectiv_id_list parse_command_adjective_id_list parse_command_all_word parse_command_id_list parse_command_plural_id_list parse_command_prepos_list parse_command_users parse_get_environment parse_get_first_inventory parse_get_next_inventory parser_error_message
+
+
+" Nodule: Efuns {{{1
+
+syn cluster	lpcEfunGroup	contains=lpc_efuns,lpcOldEfuns,lpcNewEfuns,lpcKeywdFunc
+
+" Compat32 efuns
+if exists("lpc_compat_32")
+    syn keyword lpc_efuns	contained closurep heart_beat_info m_delete m_values m_indices query_once_interactive strstr
+else
+    syn match   lpcErrFunc	/#`\h\w*/
+    " Shell compatible first line comment.
+    syn region	lpcCommentFunc	start=/^#!/ end=/$/
+endif
+
+" pre-v22 efuns which are removed in newer versions.
+syn keyword     lpcOldEfuns     contained tail dump_socket_status
+
+" new efuns after v22 should be added here!
+syn keyword     lpcNewEfuns     contained socket_status
+
+" LPC efuns list.
+" DEBUG efuns Not included.
+" New efuns should NOT be added to this list, see v22 efuns above.
+" Efuns list {{{2
+syn keyword     lpc_efuns       contained acos add_action all_inventory all_previous_objects allocate allocate_buffer allocate_mapping apply arrayp asin atan author_stats
+syn keyword     lpc_efuns       contained bind break_string bufferp
+syn keyword     lpc_efuns       contained cache_stats call_other call_out call_out_info call_stack capitalize catch ceil check_memory children classp clear_bit clone_object clonep command commands copy cos cp crc32 crypt ctime
+syn keyword     lpc_efuns       contained db_close db_commit db_connect db_exec db_fetch db_rollback db_status debug_info debugmalloc debug_message deep_inherit_list deep_inventory destruct disable_commands disable_wizard domain_stats dumpallobj dump_file_descriptors dump_prog
+syn keyword     lpc_efuns       contained each ed ed_cmd ed_start enable_commands enable_wizard environment error errorp eval_cost evaluate exec exp explode export_uid external_start
+syn keyword     lpc_efuns       contained fetch_variable file_length file_name file_size filter filter_array filter_mapping find_call_out find_living find_object find_player first_inventory floatp floor flush_messages function_exists function_owner function_profile functionp functions
+syn keyword     lpc_efuns       contained generate_source get_char get_config get_dir geteuid getuid
+syn keyword     lpc_efuns       contained heart_beats
+syn keyword     lpc_efuns       contained id_matrix implode in_edit in_input inherit_list inherits input_to interactive intp
+syn keyword     lpc_efuns       contained keys
+syn keyword     lpc_efuns       contained link living livings load_object localtime log log10 lookat_rotate lower_case lpc_info
+syn keyword     lpc_efuns       contained malloc_check malloc_debug malloc_status map map_array map_delete map_mapping mapp master match_path max_eval_cost member_array memory_info memory_summary message mkdir moncontrol move_object mud_status
+syn keyword     lpc_efuns       contained named_livings network_stats next_bit next_inventory notify_fail nullp
+syn keyword     lpc_efuns       contained objectp objects oldcrypt opcprof origin
+syn keyword     lpc_efuns       contained parse_add_rule parse_add_synonym parse_command parse_dump parse_init parse_my_rules parse_refresh parse_remove parse_sentence pluralize pointerp pow present previous_object printf process_string process_value program_info
+syn keyword     lpc_efuns       contained query_ed_mode query_heart_beat query_host_name query_idle query_ip_name query_ip_number query_ip_port query_load_average query_notify_fail query_privs query_replaced_program query_shadowing query_snoop query_snooping query_verb
+syn keyword     lpc_efuns       contained random read_buffer read_bytes read_file receive reclaim_objects refs regexp reg_assoc reload_object remove_action remove_call_out remove_interactive remove_shadow rename repeat_string replace_program replace_string replaceable reset_eval_cost resolve restore_object restore_variable rm rmdir rotate_x rotate_y rotate_z rusage
+syn keyword     lpc_efuns       contained save_object save_variable say scale set_author set_bit set_eval_limit set_heart_beat set_hide set_light set_living_name set_malloc_mask set_privs set_reset set_this_player set_this_user seteuid shadow shallow_inherit_list shout shutdown sin sizeof snoop socket_accept socket_acquire socket_address socket_bind socket_close socket_connect socket_create socket_error socket_listen socket_release socket_write sort_array sprintf sqrt stat store_variable strcmp stringp strlen strsrch
+syn keyword     lpc_efuns       contained tan tell_object tell_room terminal_colour test_bit this_interactive this_object this_player this_user throw time to_float to_int trace traceprefix translate typeof
+syn keyword     lpc_efuns       contained undefinedp unique_array unique_mapping upper_case uptime userp users
+syn keyword     lpc_efuns       contained values variables virtualp
+syn keyword     lpc_efuns       contained wizardp write write_buffer write_bytes write_file
+
+" Nodule: Constants {{{1
+
+" LPC Constants.
+" like keywords, constants are always highlighted, be careful to choose only
+" the constants we used to add to this list.
+syn keyword     lpcConstant     __ARCH__ __COMPILER__ __DIR__ __FILE__ __OPTIMIZATION__ __PORT__ __VERSION__
+"       Defines in options.h are all predefined in LPC sources surrounding by
+"       two underscores. Do we need to include all of that?
+syn keyword     lpcConstant     __SAVE_EXTENSION__ __HEARTBEAT_INTERVAL__
+"       from the documentation we know that these constants remains only for
+"       backward compatibility and should not be used any more.
+syn keyword     lpcConstant     HAS_ED HAS_PRINTF HAS_RUSAGE HAS_DEBUG_LEVEL
+syn keyword     lpcConstant     MUD_NAME F__THIS_OBJECT
+
+" Nodule: Todo for this file.  {{{1
+
+" TODO : need to check for LPC4 syntax and other series of LPC besides
+" v22, b21 and l32, if you had a good idea, contact me at poet@mudbuilder.net
+" and I will be appreciated about that.
+
+" Notes about some FAQ:
+"
+" About variables : We adopts the same behavior for C because almost all the
+" LPC programmers are also C programmers, so we don't need separate settings
+" for C and LPC. That is the reason why I don't change variables like
+" "c_no_utf"s to "lpc_no_utf"s.
+"
+" Copy : Some of the following seems to be copied from c.vim but not quite
+" the same in details because the syntax for C and LPC is different.
+"
+" Color scheme : this syntax file had been thouroughly tested to work well
+" for all of the dark-backgrounded color schemes Vim has provided officially,
+" and it should be quite Ok for all of the bright-backgrounded color schemes,
+" of course it works best for the color scheme that I am using, download it
+" from http://poet.tomud.com/pub/ps_color.vim.bz2 if you want to try it.
+"
+
+" Nodule: String and Character {{{1
+
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match	lpcSpecial	display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+if !exists("c_no_utf")
+  syn match	lpcSpecial	display contained "\\\(u\x\{4}\|U\x\{8}\)"
+endif
+
+" LPC version of sprintf() format,
+syn match	lpcFormat	display "%\(\d\+\)\=[-+ |=#@:.]*\(\d\+\)\=\('\I\+'\|'\I*\\'\I*'\)\=[OsdicoxXf]" contained
+syn match	lpcFormat	display "%%" contained
+syn region	lpcString	start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=lpcSpecial,lpcFormat
+" lpcCppString: same as lpcString, but ends at end of line
+syn region	lpcCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=lpcSpecial,lpcFormat
+
+" LPC preprocessor for the text formatting short cuts
+" Thanks to Dr. Charles E. Campbell <cec@gryphon.gsfc.nasa.gov>
+"	he suggests the best way to do this.
+syn region	lpcTextString	start=/@\z(\h\w*\)$/ end=/^\z1/ contains=lpcSpecial
+syn region	lpcArrayString	start=/@@\z(\h\w*\)$/ end=/^\z1/ contains=lpcSpecial
+
+" Character
+syn match	lpcCharacter	"L\='[^\\]'"
+syn match	lpcCharacter	"L'[^']*'" contains=lpcSpecial
+syn match	lpcSpecialError	"L\='\\[^'\"?\\abefnrtv]'"
+syn match	lpcSpecialCharacter "L\='\\['\"?\\abefnrtv]'"
+syn match	lpcSpecialCharacter display "L\='\\\o\{1,3}'"
+syn match	lpcSpecialCharacter display "'\\x\x\{1,2}'"
+syn match	lpcSpecialCharacter display "L'\\x\x\+'"
+
+" Nodule: White space {{{1
+
+" when wanted, highlight trailing white space
+if exists("c_space_errors")
+  if !exists("c_no_trail_space_error")
+    syn match	lpcSpaceError	display excludenl "\s\+$"
+  endif
+  if !exists("c_no_tab_space_error")
+    syn match	lpcSpaceError	display " \+\t"me=e-1
+  endif
+endif
+
+" Nodule: Parenthesis and brackets {{{1
+
+" catch errors caused by wrong parenthesis and brackets
+syn cluster	lpcParenGroup	contains=lpcParenError,lpcIncluded,lpcSpecial,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcUserCont,lpcUserLabel,lpcBitField,lpcCommentSkip,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom
+syn region	lpcParen	transparent start='(' end=')' contains=ALLBUT,@lpcParenGroup,lpcCppParen,lpcErrInBracket,lpcCppBracket,lpcCppString,@lpcEfunGroup,lpcApplies,lpcKeywdError
+" lpcCppParen: same as lpcParen but ends at end-of-line; used in lpcDefine
+syn region	lpcCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@lpcParenGroup,lpcErrInBracket,lpcParen,lpcBracket,lpcString,@lpcEfunGroup,lpcApplies,lpcKeywdError
+syn match	lpcParenError	display ")"
+syn match	lpcParenError	display "\]"
+" for LPC:
+" Here we should consider the array ({ }) parenthesis and mapping ([ ])
+" parenthesis and multiset (< >) parenthesis.
+syn match	lpcErrInParen	display contained "[^^]{"ms=s+1
+syn match	lpcErrInParen	display contained "\(}\|\]\)[^)]"me=e-1
+syn region	lpcBracket	transparent start='\[' end=']' contains=ALLBUT,@lpcParenGroup,lpcErrInParen,lpcCppParen,lpcCppBracket,lpcCppString,@lpcEfunGroup,lpcApplies,lpcFuncName,lpcKeywdError
+" lpcCppBracket: same as lpcParen but ends at end-of-line; used in lpcDefine
+syn region	lpcCppBracket	transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@lpcParenGroup,lpcErrInParen,lpcParen,lpcBracket,lpcString,@lpcEfunGroup,lpcApplies,lpcFuncName,lpcKeywdError
+syn match	lpcErrInBracket	display contained "[);{}]"
+
+" Nodule: Numbers {{{1
+
+" integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match	lpcNumbers	display transparent "\<\d\|\.\d" contains=lpcNumber,lpcFloat,lpcOctalError,lpcOctal
+" Same, but without octal error (for comments)
+syn match	lpcNumbersCom	display contained transparent "\<\d\|\.\d" contains=lpcNumber,lpcFloat,lpcOctal
+syn match	lpcNumber	display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+" hex number
+syn match	lpcNumber	display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match	lpcOctal	display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=lpcOctalZero
+syn match	lpcOctalZero	display contained "\<0"
+syn match	lpcFloat	display contained "\d\+f"
+" floating point number, with dot, optional exponent
+syn match	lpcFloat	display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+" floating point number, starting with a dot, optional exponent
+syn match	lpcFloat	display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+" floating point number, without dot, with exponent
+syn match	lpcFloat	display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+" flag an octal number with wrong digits
+syn match	lpcOctalError	display contained "0\o*[89]\d*"
+syn case match
+
+" Nodule: Comment string {{{1
+
+" lpcCommentGroup allows adding matches for special things in comments
+syn keyword	lpcTodo		contained TODO FIXME XXX
+syn cluster	lpcCommentGroup	contains=lpcTodo
+
+if exists("c_comment_strings")
+  " A comment can contain lpcString, lpcCharacter and lpcNumber.
+  syntax match	lpcCommentSkip	contained "^\s*\*\($\|\s\+\)"
+  syntax region lpcCommentString	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=lpcSpecial,lpcCommentSkip
+  syntax region lpcComment2String	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=lpcSpecial
+  syntax region  lpcCommentL	start="//" skip="\\$" end="$" keepend contains=@lpcCommentGroup,lpcComment2String,lpcCharacter,lpcNumbersCom,lpcSpaceError
+  syntax region lpcComment	matchgroup=lpcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@lpcCommentGroup,lpcCommentStartError,lpcCommentString,lpcCharacter,lpcNumbersCom,lpcSpaceError
+else
+  syn region	lpcCommentL	start="//" skip="\\$" end="$" keepend contains=@lpcCommentGroup,lpcSpaceError
+  syn region	lpcComment	matchgroup=lpcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@lpcCommentGroup,lpcCommentStartError,lpcSpaceError
+endif
+" keep a // comment separately, it terminates a preproc. conditional
+syntax match	lpcCommentError	display "\*/"
+syntax match	lpcCommentStartError display "/\*"me=e-1 contained
+
+" Nodule: Pre-processor {{{1
+
+syn region	lpcPreCondit	start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=lpcComment,lpcCppString,lpcCharacter,lpcCppParen,lpcParenError,lpcNumbers,lpcCommentError,lpcSpaceError
+syn match	lpcPreCondit	display "^\s*#\s*\(else\|endif\)\>"
+if !exists("c_no_if0")
+  syn region	lpcCppOut		start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=lpcCppOut2
+  syn region	lpcCppOut2	contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=lpcSpaceError,lpcCppSkip
+  syn region	lpcCppSkip	contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=lpcSpaceError,lpcCppSkip
+endif
+syn region	lpcIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match	lpcIncluded	display contained "<[^>]*>"
+syn match	lpcInclude	display "^\s*#\s*include\>\s*["<]" contains=lpcIncluded
+syn match lpcLineSkip	"\\$"
+syn cluster	lpcPreProcGroup	contains=lpcPreCondit,lpcIncluded,lpcInclude,lpcDefine,lpcErrInParen,lpcErrInBracket,lpcUserLabel,lpcSpecial,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom,lpcString,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcParen,lpcBracket,lpcMulti,lpcKeywdError
+syn region	lpcDefine	start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@lpcPreProcGroup
+
+if exists("lpc_pre_v22")
+    syn region	lpcPreProc	start="^\s*#\s*\(pragma\>\|echo\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@lpcPreProcGroup
+else
+    syn region	lpcPreProc	start="^\s*#\s*\(pragma\>\|echo\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@lpcPreProcGroup
+endif
+
+" Nodule: User labels {{{1
+
+" Highlight Labels
+" User labels in LPC is not allowed, only "case x" and "default" is supported
+syn cluster	lpcMultiGroup	contains=lpcIncluded,lpcSpecial,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcUserCont,lpcUserLabel,lpcBitField,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom,lpcCppParen,lpcCppBracket,lpcCppString,lpcKeywdError
+syn region	lpcMulti		transparent start='\(case\|default\|public\|protected\|private\)' skip='::' end=':' contains=ALLBUT,@lpcMultiGroup
+
+syn cluster	lpcLabelGroup	contains=lpcUserLabel
+syn match	lpcUserCont	display "^\s*lpc:$" contains=@lpcLabelGroup
+
+" Don't want to match anything
+syn match	lpcUserLabel	display "lpc" contained
+
+" Nodule: Initializations {{{1
+
+if exists("c_minlines")
+  let b:c_minlines = c_minlines
+else
+  if !exists("c_no_if0")
+    let b:c_minlines = 50	" #if 0 constructs can be long
+  else
+    let b:c_minlines = 15	" mostly for () constructs
+  endif
+endif
+exec "syn sync ccomment lpcComment minlines=" . b:c_minlines
+
+" Make sure these options take place since we no longer depend on file type
+" plugin for C
+setlocal cindent
+setlocal fo-=t fo+=croql
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+set cpo-=C
+
+" Win32 can filter files in the browse dialog
+if has("gui_win32") && !exists("b:browsefilter")
+    let b:browsefilter = "LPC Source Files (*.c *.d *.h)\t*.c;*.d;*.h\n" .
+	\ "LPC Data Files (*.scr *.o *.dat)\t*.scr;*.o;*.dat\n" .
+	\ "Text Documentation (*.txt)\t*.txt\n" .
+	\ "All Files (*.*)\t*.*\n"
+endif
+
+" Nodule: Highlight links {{{1
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+if version >= 508 || !exists("did_lpc_syn_inits")
+  if version < 508
+    let did_lpc_syn_inits = 1
+    command -nargs=+ HiLink hi link <args>
+  else
+    command -nargs=+ HiLink hi def link <args>
+  endif
+
+  HiLink lpcModifier		lpcStorageClass
+
+  HiLink lpcQuotedFmt		lpcFormat
+  HiLink lpcFormat		lpcSpecial
+  HiLink lpcCppString		lpcString	" Cpp means
+						" C Pre-Processor
+  HiLink lpcCommentL		lpcComment
+  HiLink lpcCommentStart	lpcComment
+  HiLink lpcUserLabel		lpcLabel
+  HiLink lpcSpecialCharacter	lpcSpecial
+  HiLink lpcOctal		lpcPreProc
+  HiLink lpcOctalZero		lpcSpecial  " LPC will treat octal numbers
+					    " as decimals, programmers should
+					    " be aware of that.
+  HiLink lpcEfunError		lpcError
+  HiLink lpcKeywdError		lpcError
+  HiLink lpcOctalError		lpcError
+  HiLink lpcParenError		lpcError
+  HiLink lpcErrInParen		lpcError
+  HiLink lpcErrInBracket	lpcError
+  HiLink lpcCommentError	lpcError
+  HiLink lpcCommentStartError	lpcError
+  HiLink lpcSpaceError		lpcError
+  HiLink lpcSpecialError	lpcError
+  HiLink lpcErrFunc		lpcError
+
+  if exists("lpc_pre_v22")
+      HiLink lpcOldEfuns	lpc_efuns
+      HiLink lpcNewEfuns	lpcError
+  else
+      HiLink lpcOldEfuns	lpcReserved
+      HiLink lpcNewEfuns	lpc_efuns
+  endif
+  HiLink lpc_efuns		lpcFunction
+
+  HiLink lpcReserved		lpcPreProc
+  HiLink lpcTextString		lpcString   " This should be preprocessors, but
+  HiLink lpcArrayString		lpcPreProc  " let's make some difference
+					    " between text and array
+
+  HiLink lpcIncluded		lpcString
+  HiLink lpcCommentString	lpcString
+  HiLink lpcComment2String	lpcString
+  HiLink lpcCommentSkip		lpcComment
+  HiLink lpcCommentFunc		lpcComment
+
+  HiLink lpcCppSkip		lpcCppOut
+  HiLink lpcCppOut2		lpcCppOut
+  HiLink lpcCppOut		lpcComment
+
+  " Standard type below
+  HiLink lpcApplies		Special
+  HiLink lpcCharacter		Character
+  HiLink lpcComment		Comment
+  HiLink lpcConditional		Conditional
+  HiLink lpcConstant		Constant
+  HiLink lpcDefine		Macro
+  HiLink lpcError		Error
+  HiLink lpcFloat		Float
+  HiLink lpcFunction		Function
+  HiLink lpcIdentifier		Identifier
+  HiLink lpcInclude		Include
+  HiLink lpcLabel		Label
+  HiLink lpcNumber		Number
+  HiLink lpcOperator		Operator
+  HiLink lpcPreCondit		PreCondit
+  HiLink lpcPreProc		PreProc
+  HiLink lpcRepeat		Repeat
+  HiLink lpcStatement		Statement
+  HiLink lpcStorageClass	StorageClass
+  HiLink lpcString		String
+  HiLink lpcStructure		Structure
+  HiLink lpcSpecial		LineNr
+  HiLink lpcTodo		Todo
+  HiLink lpcType		Type
+
+  delcommand HiLink
+endif
+
+" Nodule: This is the end nodule. {{{1
+
+let b:current_syntax = "lpc"
+
+" vim:ts=8:nosta:sw=2:ai:si:
+" vim600:set fdm=marker: }}}1