Merge branch 'vim-with-runtime' into feat/quickfix-title
[vim_extended.git] / runtime / syntax / zsh.vim
blob79fd017ee88dfcc46546771b0c86dca5cd508b95
1 " Vim syntax file
2 " Language:         Zsh shell script
3 " Maintainer:       Nikolai Weibull <now@bitwi.se>
4 " Latest Revision:  2010-01-23
6 if exists("b:current_syntax")
7   finish
8 endif
10 let s:cpo_save = &cpo
11 set cpo&vim
13 setlocal iskeyword+=-
15 syn keyword zshTodo             contained TODO FIXME XXX NOTE
17 syn region  zshComment          oneline start='\%(^\|\s\)#' end='$'
18                                 \ contains=zshTodo,@Spell
20 syn match   zshPreProc          '^\%1l#\%(!\|compdef\|autoload\).*$'
22 syn match   zshQuoted           '\\.'
23 syn region  zshString           matchgroup=zshStringDelimiter start=+"+ end=+"+
24                                 \ contains=zshQuoted,@zshDerefs,@zshSubst
25 syn region  zshString           matchgroup=zshStringDelimiter start=+'+ end=+'+
26 " XXX: This should probably be more precise, but Zsh seems a bit confused about it itself
27 syn region  zshPOSIXString      matchgroup=zshStringDelimiter start=+\$'+
28                                 \ end=+'+ contains=zshQuoted
29 syn match   zshJobSpec          '%\(\d\+\|?\=\w\+\|[%+-]\)'
31 syn keyword zshPrecommand       noglob nocorrect exec command builtin - time
33 syn keyword zshDelimiter        do done
35 syn keyword zshConditional      if then elif else fi case in esac select
37 syn keyword zshRepeat           while until repeat
39 syn keyword zshRepeat           for foreach nextgroup=zshVariable skipwhite
41 syn keyword zshException        always
43 syn keyword zshKeyword          function nextgroup=zshKSHFunction skipwhite
45 syn match   zshKSHFunction      contained '\k\+'
46 syn match   zshFunction         '^\s*\k\+\ze\s*()'
48 syn match   zshOperator         '||\|&&\|;\|&!\='
50 syn match   zshRedir            '\d\=\(<\|<>\|<<<\|<&\s*[0-9p-]\=\)'
51 syn match   zshRedir            '\d\=\(>\|>>\|>&\s*[0-9p-]\=\|&>\|>>&\|&>>\)[|!]\='
52 syn match   zshRedir            '|&\='
54 syn region  zshHereDoc          matchgroup=zshRedir
55                                 \ start='<\@<!<<\s*\z([^<]\S*\)'
56                                 \ end='^\z1\>'
57                                 \ contains=@zshSubst
58 syn region  zshHereDoc          matchgroup=zshRedir
59                                 \ start='<\@<!<<\s*\\\z(\S\+\)'
60                                 \ end='^\z1\>'
61                                 \ contains=@zshSubst
62 syn region  zshHereDoc          matchgroup=zshRedir
63                                 \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
64                                 \ end='^\s*\z1\>'
65                                 \ contains=@zshSubst
66 syn region  zshHereDoc          matchgroup=zshRedir
67                                 \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+ 
68                                 \ end='^\z1\>'
69 syn region  zshHereDoc          matchgroup=zshRedir
70                                 \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
71                                 \ end='^\s*\z1\>'
73 syn match   zshVariable         '\<\h\w*' contained
75 syn match   zshVariableDef      '\<\h\w*\ze+\=='
76 " XXX: how safe is this?
77 syn region  zshVariableDef      oneline
78                                 \ start='\$\@<!\<\h\w*\[' end='\]\ze+\=='
79                                 \ contains=@zshSubst
81 syn cluster zshDerefs           contains=zshShortDeref,zshLongDeref,zshDeref
83 if !exists("g:zsh_syntax_variables")
84   let s:zsh_syntax_variables = 'all'
85 else
86   let s:zsh_syntax_variables = g:zsh_syntax_variables
87 endif
89 if s:zsh_syntax_variables =~ 'short\|all'
90   syn match zshShortDeref       '\$[!#$*@?_-]\w\@!'
91   syn match zshShortDeref       '\$[=^~]*[#+]*\d\+\>'
92 endif
94 if s:zsh_syntax_variables =~ 'long\|all'
95   syn match zshLongDeref        '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
96   syn match zshLongDeref        '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
97   syn match zshLongDeref        '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
98 endif
100 if s:zsh_syntax_variables =~ 'all'
101   syn match zshDeref            '\$[=^~]*[#+]*\h\w*\>'
102 else
103   syn match zshDeref            transparent contains=NONE '\$[=^~]*[#+]*\h\w*\>'
104 endif
106 syn match   zshCommands         '\%(^\|\s\)[.:]\ze\s'
107 syn keyword zshCommands         alias autoload bg bindkey break bye cap cd
108                                 \ chdir clone comparguments compcall compctl
109                                 \ compdescribe compfiles compgroups compquote
110                                 \ comptags comptry compvalues continue dirs
111                                 \ disable disown echo echotc echoti emulate
112                                 \ enable eval exec exit export false fc fg
113                                 \ functions getcap getln getopts hash history
114                                 \ jobs kill let limit log logout popd print
115                                 \ printf pushd pushln pwd r read readonly
116                                 \ rehash return sched set setcap setopt shift
117                                 \ source stat suspend test times trap true
118                                 \ ttyctl type ulimit umask unalias unfunction
119                                 \ unhash unlimit unset unsetopt vared wait
120                                 \ whence where which zcompile zformat zftp zle
121                                 \ zmodload zparseopts zprof zpty zregexparse
122                                 \ zsocket zstyle ztcp
124 syn keyword zshTypes            float integer local typeset declare
126 " XXX: this may be too much
127 " syn match   zshSwitches         '\s\zs--\=[a-zA-Z0-9-]\+'
129 syn match   zshNumber           '[+-]\=\<\d\+\>'
130 syn match   zshNumber           '[+-]\=\<0x\x\+\>'
131 syn match   zshNumber           '[+-]\=\<0\o\+\>'
132 syn match   zshNumber           '[+-]\=\d\+#[-+]\=\w\+\>'
133 syn match   zshNumber           '[+-]\=\d\+\.\d\+\>'
135 " TODO: $[...] is the same as $((...)), so add that as well.
136 syn cluster zshSubst            contains=zshSubst,zshOldSubst,zshMathSubst
137 syn region  zshSubst            matchgroup=zshSubstDelim transparent
138                                 \ start='\$(' skip='\\)' end=')' contains=TOP
139 syn region  zshParentheses      transparent start='(' skip='\\)' end=')'
140 syn region  zshMathSubst        matchgroup=zshSubstDelim transparent
141                                 \ start='\$((' skip='\\)'
142                                 \ matchgroup=zshSubstDelim end='))'
143                                 \ contains=zshParentheses,@zshSubst,zshNumber,
144                                 \ @zshDerefs,zshString
145 syn region  zshBrackets         contained transparent start='{' skip='\\}'
146                                 \ end='}'
147 syn region  zshSubst            matchgroup=zshSubstDelim start='\${' skip='\\}'
148                                 \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString
149 syn region  zshOldSubst         matchgroup=zshSubstDelim start=+`+ skip=+\\`+
150                                 \ end=+`+ contains=TOP,zshOldSubst
152 syn sync    minlines=50
153 syn sync    match zshHereDocSync    grouphere   NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
154 syn sync    match zshHereDocEndSync groupthere  NONE '^\s*EO\a\+\>'
156 hi def link zshTodo             Todo
157 hi def link zshComment          Comment
158 hi def link zshPreProc          PreProc
159 hi def link zshQuoted           SpecialChar
160 hi def link zshString           String
161 hi def link zshStringDelimiter  zshString
162 hi def link zshPOSIXString      zshString
163 hi def link zshJobSpec          Special
164 hi def link zshPrecommand       Special
165 hi def link zshDelimiter        Keyword
166 hi def link zshConditional      Conditional
167 hi def link zshException        Exception
168 hi def link zshRepeat           Repeat
169 hi def link zshKeyword          Keyword
170 hi def link zshFunction         None
171 hi def link zshKSHFunction      zshFunction
172 hi def link zshHereDoc          String
173 if 0
174   hi def link zshOperator         Operator
175 else
176   hi def link zshOperator         None
177 endif
178 if 1
179   hi def link zshRedir            Operator
180 else
181   hi def link zshRedir            None
182 endif
183 hi def link zshVariable         None
184 hi def link zshVariableDef      zshVariable
185 hi def link zshDereferencing    PreProc
186 if s:zsh_syntax_variables =~ 'short\|all'
187   hi def link zshShortDeref     zshDereferencing
188 else
189   hi def link zshShortDeref     None
190 endif
191 if s:zsh_syntax_variables =~ 'long\|all'
192   hi def link zshLongDeref      zshDereferencing
193 else
194   hi def link zshLongDeref      None
195 endif
196 if s:zsh_syntax_variables =~ 'all'
197   hi def link zshDeref          zshDereferencing
198 else
199   hi def link zshDeref          None
200 endif
201 hi def link zshCommands         Keyword
202 hi def link zshTypes            Type
203 hi def link zshSwitches         Special
204 hi def link zshNumber           Number
205 hi def link zshSubst            PreProc
206 hi def link zshMathSubst        zshSubst
207 hi def link zshOldSubst         zshSubst
208 hi def link zshSubstDelim       zshSubst
210 let b:current_syntax = "zsh"
212 let &cpo = s:cpo_save
213 unlet s:cpo_save