summaryrefslogtreecommitdiff
path: root/runtime/syntax/fish.vim
blob: 266878bbdc216f427b952c74afaa2b30882c1574 (plain)
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