" Vim syntax file " Language: Pike " Maintainer: Stephen R. van den Berg " Maintainer of previous implementation: Francesco Chemolli " Last Change: 2018 Jan 28 " Version: 2.9 " Remark: Derived from the C-syntax; fixed several bugs in the C-syntax " Remark: and extended it with the Pike syntax. " Remark: Includes a highlighter for all Pike types of parenthesis errors. " Remark: Includes a highlighter for SQL on multiline strings. " Remark: Includes a highlighter for any embedded Autodoc format. " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") finish endif let s:cpo_save = &cpo set cpo&vim " For multiline strings, try formatting them as SQL syn include @pikeSQL :p:h/sqloracle.vim unlet b:current_syntax " For embedded Autodoc documentation (WIP) syn include @pikeAutodoc :p:h/autodoc.vim unlet b:current_syntax syn case match " Supports array, multiset, mapping multi-character delimiter matching " Supports rotating amongst several same-level preprocessor conditionals packadd! matchit let b:match_words = "({:}\\@1<=),(\\[:]\\@1<=),(<:>\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>" " A bunch of useful Pike keywords syn keyword pikeDebug gauge backtrace describe_backtrace werror _Static_assert static_assert syn keyword pikeException error catch throw syn keyword pikeLabel case default break return continue syn keyword pikeConditional if else switch syn keyword pikeRepeat while for foreach do syn keyword pikePredef RegGetKeyNames RegGetValue RegGetValues syn keyword pikePredef __automap__ __empty_program syn keyword pikePredef __handle_sprintf_format __parse_pike_type _disable_threads syn keyword pikePredef _do_call_outs _exit _gdb_breakpoint syn keyword pikePredef abs access acos acosh add_constant alarm all_constants syn keyword pikePredef array_sscanf asin asinh atan atan2 atanh atexit syn keyword pikePredef basetype call_function call_out call_out_info cd ceil syn keyword pikePredef combine_path combine_path_nt syn keyword pikePredef combine_path_unix compile copy_value cos cosh cpp crypt syn keyword pikePredef ctime decode_value delay encode_value encode_value_canonic syn keyword pikePredef enumerate errno exece exit exp file_stat file_truncate syn keyword pikePredef filesystem_stat find_call_out floor fork function_name syn keyword pikePredef function_object function_program gc syn keyword pikePredef get_active_compilation_handler get_active_error_handler syn keyword pikePredef get_all_groups get_all_users get_dir get_groups_for_user syn keyword pikePredef get_iterator get_profiling_info get_weak_flag getcwd syn keyword pikePredef getgrgid getgrnam gethrdtime gethrtime gethrvtime getpid syn keyword pikePredef getpwnam getpwuid getxattr glob gmtime has_index has_prefix syn keyword pikePredef has_suffix has_value hash hash_7_0 hash_7_4 hash_8_0 syn keyword pikePredef hash_value kill limit listxattr load_module localtime syn keyword pikePredef log lower_case master max min mkdir mktime mv syn keyword pikePredef object_program pow query_num_arg random_seed syn keyword pikePredef remove_call_out removexattr replace_master rm round syn keyword pikePredef set_priority set_weak_flag setxattr sgn signal signame syn keyword pikePredef signum sin sinh sleep sort sprintf sqrt sscanf strerror syn keyword pikePredef string_filter_non_unicode string_to_unicode string_to_utf8 syn keyword pikePredef tan tanh time trace types ualarm unicode_to_string syn keyword pikePredef upper_case utf8_to_string version syn keyword pikePredef write lock try_lock syn keyword pikePredef MutexKey Timestamp Date Time TimeTZ Interval Inet Range syn keyword pikePredef Null null inf nan syn keyword pikeTodo contained TODO FIXME XXX " Match parengroups: allows for highlighting indices of mappings and " highlighting semicolons that are out of place due to a paren imbalance syn cluster pikePreShort contains=pikeDefine,pikePreProc,pikeCppOutWrapper,pikeCppInWrapper,pikePreCondit,pikePreConditMatch syn cluster pikeExprGroup contains=pikeMappIndex,@pikeStmt,pikeNest,@pikeBadGroup,pikeSoftCast syn match pikeWord transparent contained /[^()'"[\]{},;:]\+/ contains=ALLBUT,@pikePreProcGroup,@pikeExprGroup syn match pikeFirstWord transparent display contained /^\s*#[^()'"[\]{},;:]\+/ contains=@pikePreShort syn cluster pikeMappElm contains=pikeMappIndex,@pikeStmt syn cluster pikeStmt contains=pikeFirstWord,pikeCharacter,pikeString,pikeMlString,pikeWord,pikeNest syn cluster pikeBadGroup contains=pikeBadPClose,pikeBadAClose,pikeBadBClose,pikeBadSPClose,pikeBadSAClose,pikeBadSBClose,pikeBadSClose,pikeBadSPAClose,pikeBadSBAClose syn match pikeBadPClose display contained "[}\]]" syn match pikeBadAClose display contained "[)\]]" syn match pikeBadBClose display contained "[)}]" syn match pikeBadSPClose display contained "[;}\]]" syn match pikeBadSAClose display contained "[;)\]]" syn match pikeBadSPAClose display contained "[;\]]" syn match pikeBadSBAClose display contained "[;}]" syn match pikeBadSClose display contained "[;)}\]]" syn region pikeNest transparent start="(\@1)" contains=@pikeStmt,pikeBadSPClose keepend " It's easy to accidentally add a space after a backslash that was intended " for line continuation. Some compilers allow it, which makes it " unpredictable and should be avoided. syn match pikeBadContinuation contained "\\\s\+$" " pikeCommentGroup allows adding matches for special things in comments syn cluster pikeCommentGroup contains=pikeTodo,pikeBadContinuation " String and Character constants " Highlight special characters (those which have a backslash) differently syn match pikeSpecial display contained "\\\%(x\x*\|d\d*\|\o\+\|u\x\{4}\|U\x\{8}\|[abefnrtv]\|$\)" " ISO C11 or ISO C++ 11 if !exists("c_no_cformat") " Highlight % items in strings. syn match pikeFormat display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjzt]\|ll\|hh\)\=\%([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained syn match pikeFormat display "%%" contained syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,pikeFormat,@Spell keepend syn region pikeMlString start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeFormat,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend else syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,@Spell syn region pikeMlString transparent start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend endif " Use SQL-syntax highlighting in multiline string if it starts with " a standard SQL keyword syn case ignore " FIXME Use explicit newline match to cover up a bug in the regexp engine " If the kludge is not used, the match will only start unless at least a space " follows the initial doublequote on the first line (or the keyword is on " the first line). syn region pikeEmbeddedString contained start=+\%(#"\n\?\)\@2<=\_s*\%(SELECT\|INSERT\|UPDATE\|DELETE\|WITH\|CREATE\|DROP\|ALTER\)\>+ skip=+\\\\\|\\"+ end=+[\\#]\@1" "hex number syn match pikeNumber display contained "\<0x\x\+\%(u\=l\{0,2}\|ll\=u\)\>" " Flag the first zero of an octal number as something special syn match pikeOctal display contained "\<0\o\+\%(u\=l\{0,2}\|ll\=u\)\>" contains=pikeOctalZero syn match pikeOctalZero display contained "\<0" "floating point number, with dot, optional exponent syn match pikeFloat display contained "\<\d\+\%(f\|\.[0-9.]\@!\d*\%(e[-+]\=\d\+\)\=[fl]\=\)" "floating point number, starting with a dot, optional exponent syn match pikeFloat display contained "[0-9.]\@1" "floating point number, without dot, with exponent syn match pikeFloat display contained "\<\d\+e[-+]\=\d\+[fl]\=\>" "hexadecimal floating point number, two variants, with exponent syn match pikeFloat display contained "\<0x\%(\x\+\.\?\|\x*\.\x\+\)p[-+]\=\d\+[fl]\=\>" " flag an octal number with wrong digits syn match pikeOctalError display contained "\<0\o*[89]\d*" syn case match if exists("c_comment_strings") " A comment can contain pikeString, pikeCharacter and pikeNumber. " But a "*/" inside a pikeString in a pikeComment DOES end the comment! So we " need to use a special type of pikeString: pikeCommentString, which also ends on " "*/", and sees a "*" at the start of the line as comment again. " Unfortunately this doesn't very well work for // type of comments :-( syn match pikeCommentSkip contained "^\s*\*\%($\|\s\+\)" syn region pikeCommentString contained start=+\\\@" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix syn match pikePreConditMatch display "^\s*\zs#\s*\%(else\|endif\)\>" if !exists("c_no_if0") syn cluster pikeCppOutInGroup contains=pikeCppInIf,pikeCppInElse,pikeCppInElse2,pikeCppOutIf,pikeCppOutIf2,pikeCppOutElse,pikeCppInSkip,pikeCppOutSkip syn region pikeCppOutWrapper start="^\s*\zs#\s*if\s\+0\+\s*\%($\|//\|/\*\|&\)" end=".\@=\|$" contains=pikeCppOutIf,pikeCppOutElse,@NoSpell fold syn region pikeCppOutIf contained start="0\+" matchgroup=pikeCppOutWrapper end="^\s*#\s*endif\>" contains=pikeCppOutIf2,pikeCppOutElse if !exists("c_no_if0_fold") syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell fold else syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell endif syn region pikeCppOutElse contained matchgroup=pikeCppOutWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit syn region pikeCppInWrapper start="^\s*\zs#\s*if\s\+0*[1-9]\d*\s*\%($\|//\|/\*\||\)" end=".\@=\|$" contains=pikeCppInIf,pikeCppInElse fold syn region pikeCppInIf contained matchgroup=pikeCppInWrapper start="\d\+" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit if !exists("c_no_if0_fold") syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 fold else syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 endif syn region pikeCppInElse2 contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)\%([^/]\|/[^/*]\)*" end="^\ze\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip,@Spell syn region pikeCppOutSkip contained start="^\s*#\s*if\%(n\?def\)\?\>" skip="\\$" end="^\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip syn region pikeCppInSkip contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(if\s\+\%(\d\+\s*\%($\|//\|/\*\||\|&\)\)\@!\|ifn\?def\>\)" skip="\\$" end="^\s*#\s*endif\>" containedin=pikeCppOutElse,pikeCppInIf,pikeCppInSkip contains=TOP,pikePreProc endif syn region pikeIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeDelimiterDQ keepend syn match pikeIncluded display contained "<[^>]*>" syn match pikeInclude display "^\s*\zs#\s*include\>\s*["<]" contains=pikeIncluded syn cluster pikePreProcGroup contains=pikeIncluded,pikeInclude,pikeEmbeddedString,pikeCppOutWrapper,pikeCppInWrapper,@pikeCppOutInGroup,pikeFormat,pikeMlString,pikeCommentStartError,@pikeBadGroup,pikeWord syn region pikeDefine start="^\s*\zs#\s*\%(define\|undef\)\>" skip="\\$" end="$" keepend contains=@pikeStmt,@pikeBadGroup syn region pikePreProc start="^\s*\zs#\s*\%(pragma\|charset\|pike\|require\|string\|line\|warning\|error\)\>" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix,@Spell,pikeConstant syn match pikeAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@pikeAutodoc containedin=pikeComment,pikeCommentL syn cluster pikeCommentGroup add=pikeAutodocReal syn cluster pikePreProcGroup add=pikeAutodocReal " Highlight User Labels " Avoid matching foo::bar() in C++ by requiring that the next char is not ':' syn match pikeUserLabel display "\%(^\|[{};]\)\zs\I\i*\s*\ze:\%([^:]\|$\)" contained contains=NONE syn match pikeUserLabel display "\%(\<\%(break\|continue\)\_s\+\)\@10<=\I\i*" contained contains=NONE syn match pikeUserLabel display "\%(\