" 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 /\/ 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&]\?>&[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