diff options
Diffstat (limited to 'runtime/syntax/fish.vim')
-rw-r--r-- | runtime/syntax/fish.vim | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/runtime/syntax/fish.vim b/runtime/syntax/fish.vim new file mode 100644 index 0000000..266878b --- /dev/null +++ b/runtime/syntax/fish.vim @@ -0,0 +1,225 @@ +" Vim syntax file +" Language: fish +" Maintainer: Nicholas Boyle (github.com/nickeb96) +" Repository: https://github.com/nickeb96/fish.vim +" Last Change: February 1, 2023 + +if exists("b:current_syntax") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + + +" Statements +syn cluster fishStatement contains=fishKeywordAndOr,fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand,fishVariable + +syn keyword fishKeywordAndOr and or nextgroup=fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand +hi def link fishKeywordAndOr fishOperator + +syn keyword fishNot not skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand +syn match fishNot /!/ skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand +hi def link fishNot fishOperator + +syn keyword fishSelectStatement command builtin skipwhite nextgroup=fishKeyword,fishKeywordIf,fishCommand,fishOption +hi def link fishSelectStatement fishKeyword + +syn keyword fishKeyword end skipwhite nextgroup=@fishTerminator + +syn keyword fishKeywordIf if skipwhite nextgroup=@fishStatement +syn keyword fishKeyword else skipwhite nextgroup=fishKeywordIf,fishSemicolon +hi def link fishKeywordIf fishKeyword + +syn keyword fishKeyword switch skipwhite nextgroup=@fishArgument +syn keyword fishKeyword case skipwhite nextgroup=@fishArgument + +syn keyword fishKeyword while skipwhite nextgroup=@fishStatement + +syn keyword fishKeyword for skipwhite nextgroup=fishForVariable +syn match fishForVariable /[[:alnum:]_]\+/ contained skipwhite nextgroup=fishKeywordIn +syn keyword fishKeywordIn in contained skipwhite nextgroup=@fishArgument +hi def link fishForVariable fishParameter +hi def link fishKeywordIn fishKeyword + +syn keyword fishKeyword _ abbr argparse begin bg bind block break breakpoint cd commandline + \ complete continue count disown echo emit eval exec exit false fg function functions + \ history jobs math printf pwd random read realpath return set set_color source status + \ string test time true type ulimit wait + \ skipwhite nextgroup=@fishNext +syn match fishKeyword /\<contains\>/ skipwhite nextgroup=@fishNext + +syn match fishCommand /[[:alnum:]_\/[][[:alnum:]+._-]*/ skipwhite nextgroup=@fishNext + + +" Internally Nested Arguments + +syn cluster fishSubscriptArgs contains=fishInnerVariable,fishIndexNum,fishIndexRange,fishInnerCommandSub + +syn match fishInnerVariable /\$\+[[:alnum:]_]\+/ contained +syn match fishInnerVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 contained nextgroup=fishInnerSubscript +hi def link fishInnerVariable fishVariable + +syn region fishInnerSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained + \ keepend contains=@fishSubscriptArgs +hi def link fishInnerSubscript fishSubscript + +syn match fishIndexNum /[+-]?[[:digit:]]\+/ contained +hi def link fishIndexNum fishParameter + +syn match fishIndexRange /\.\./ contained +hi def link fishIndexRange fishParameter + +syn region fishInnerCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained + \ contains=@fishStatement +hi def link fishInnerCommandSub fishCommandSub + +syn region fishQuotedCommandSub matchgroup=fishOperator start=/\$(/ end=/)/ contained + \ contains=@fishStatement +hi def link fishQuotedCommandSub fishCommandSub + +syn match fishBraceExpansionComma /,/ contained +hi def link fishBraceExpansionComma fishOperator + +syn match fishBracedParameter '[[:alnum:]\u5b\u5d@:=+.%/!_-]\+' contained contains=fishInnerPathGlob +hi def link fishBracedParameter fishParameter + +syn region fishBracedQuote start=/'/ skip=/\\'/ end=/'/ contained + \ contains=fishEscapedEscape,fishEscapedSQuote +syn region fishBracedQuote start=/"/ skip=/\\"/ end=/"/ contained + \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishInnerCommandSub +hi def link fishBracedQuote fishQuote + + +" Arguments + +syn cluster fishArgument contains=fishParameter,fishOption,fishVariable,fishPathGlob,fishBraceExpansion,fishQuote,fishCharacter,fishCommandSub,fishRedirection,fishSelfPid + +syn match fishParameter '[[:alnum:]\u5b\u5d@:=+.,%/!_-]\+' contained skipwhite nextgroup=@fishNext + +syn match fishOption /-[[:alnum:]=_-]*/ contained skipwhite nextgroup=@fishNext + +syn match fishPathGlob /\(\~\|*\|?\)/ contained skipwhite nextgroup=@fishNext + +syn region fishBraceExpansion matchgroup=fishOperator start=/{/ end=/}/ contained + \ contains=fishBraceExpansionComma,fishInnerVariable,fishInnerCommandSub,fishBracedParameter,fishBracedQuote + \ skipwhite nextgroup=@fishNext + +syn match fishVariable /\$\+[[:alnum:]_]\+/ skipwhite nextgroup=@fishNext +syn match fishVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 nextgroup=fishSubscript + +syn region fishSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained + \ keepend contains=@fishSubscriptArgs + \ skipwhite nextgroup=@fishNext + +syn region fishCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained + \ contains=@fishStatement + \ skipwhite nextgroup=@fishNext + +syn region fishQuote start=/'/ skip=/\\'/ end=/'/ contained + \ contains=fishEscapedEscape,fishEscapedSQuote + \ skipwhite nextgroup=@fishNext +syn region fishQuote start=/"/ skip=/\\"/ end=/"/ contained + \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishQuotedCommandSub + \ skipwhite nextgroup=@fishNext + +syn match fishEscapedEscape /\\\\/ contained +syn match fishEscapedSQuote /\\'/ contained +syn match fishEscapedDQuote /\\"/ contained +syn match fishEscapedDollar /\\\$/ contained +hi def link fishEscapedEscape fishCharacter +hi def link fishEscapedSQuote fishCharacter +hi def link fishEscapedDQuote fishCharacter +hi def link fishEscapedDollar fishCharacter + +syn match fishCharacter /\\[0-7]\{1,3}/ contained skipwhite nextgroup=@fishNext +syn match fishCharacter /\\u[0-9a-fA-F]\{4}/ contained skipwhite nextgroup=@fishNext +syn match fishCharacter /\\U[0-9a-fA-F]\{8}/ contained skipwhite nextgroup=@fishNext +syn match fishCharacter /\\x[0-7][0-9a-fA-F]\|\\x[0-9a-fA-F]/ contained skipwhite nextgroup=@fishNext +syn match fishCharacter /\\X[0-9a-fA-F]\{1,2}/ contained skipwhite nextgroup=@fishNext +syn match fishCharacter /\\[abcefnrtv[\](){}<>\\*?~%#$|&;'" ]/ contained skipwhite nextgroup=@fishNext + +syn match fishRedirection /</ contained skipwhite nextgroup=fishRedirectionTarget +syn match fishRedirection /[0-9&]\?>[>?]\?/ contained skipwhite nextgroup=fishRedirectionTarget +syn match fishRedirection /[0-9&]\?>&[0-9-]/ contained skipwhite nextgroup=@fishNext + +syn match fishRedirectionTarget /[[:alnum:]$~*?{,}"'\/._-]\+/ contained contains=fishInnerVariable skipwhite nextgroup=@fishNext +hi def link fishRedirectionTarget fishRedirection + +syn match fishSelfPid /%self\>/ contained nextgroup=@fishNext +hi def link fishSelfPid fishOperator + + +" Terminators + +syn cluster fishTerminator contains=fishPipe,fishBackgroundJob,fishSemicolon,fishSymbolicAndOr + +syn match fishPipe /\(1>\|2>\|&\)\?|/ contained skipwhite nextgroup=@fishStatement +hi def link fishPipe fishEnd + +syn match fishBackgroundJob /&$/ contained skipwhite nextgroup=@fishStatement +syn match fishBackgroundJob /&[^<>&|]/me=s+1,he=s+1 contained skipwhite nextgroup=@fishStatement +hi def link fishBackgroundJob fishEnd + +syn match fishSemicolon /;/ skipwhite nextgroup=@fishStatement +hi def link fishSemicolon fishEnd + +syn match fishSymbolicAndOr /\(&&\|||\)/ contained skipwhite skipempty nextgroup=@fishStatement +hi def link fishSymbolicAndOr fishOperator + + +" Other + +syn cluster fishNext contains=fishEscapedNl,@fishArgument,@fishTerminator + +syn match fishEscapedNl /\\$/ skipnl skipwhite contained nextgroup=@fishNext + +syn match fishComment /#.*/ contains=fishTodo,@Spell + +syn keyword fishTodo TODO contained + + + +syn sync minlines=200 +syn sync maxlines=300 + + +" Intermediate highlight groups matching $fish_color_* variables + +hi def link fishCommand fish_color_command +hi def link fishComment fish_color_comment +hi def link fishEnd fish_color_end +hi def link fishCharacter fish_color_escape +hi def link fishKeyword fish_color_keyword +hi def link fishEscapedNl fish_color_normal +hi def link fishOperator fish_color_operator +hi def link fishVariable fish_color_operator +hi def link fishInnerVariable fish_color_operator +hi def link fishPathGlob fish_color_operator +hi def link fishOption fish_color_option +hi def link fishParameter fish_color_param +hi def link fishQuote fish_color_quote +hi def link fishRedirection fish_color_redirection + + +" Default highlight groups + +hi def link fish_color_param Normal +hi def link fish_color_normal Normal +hi def link fish_color_option Normal +hi def link fish_color_command Function +hi def link fish_color_keyword Keyword +hi def link fish_color_end Delimiter +hi def link fish_color_operator Operator +hi def link fish_color_redirection Type +hi def link fish_color_quote String +hi def link fish_color_escape Character +hi def link fish_color_comment Comment + +hi def link fishTodo Todo + + +let b:current_syntax = 'fish' + +let &cpo = s:cpo_save +unlet s:cpo_save |