| 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
 |