1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 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
|