1" tcsh.vim: Vim syntax file for tcsh scripts
2" Maintainer:	Gautam Iyer <gi1242@gmail.com>
3" Modified:	Thu 17 Dec 2009 06:05:07 PM EST
4"
5" Description: We break up each statement into a "command" and an "end" part.
6" All groups are either a "command" or part of the "end" of a statement (ie
7" everything after the "command"). This is because blindly highlighting tcsh
8" statements as keywords caused way too many false positives. Eg:
9"
10" 	set history=200
11"
12" causes history to come up as a keyword, which we want to avoid.
13
14" Quit when a syntax file was already loaded
15if exists('b:current_syntax')
16  finish
17endif
18
19let s:oldcpo = &cpo
20set cpo&vim " Line continuation is used
21
22setlocal iskeyword+=-
23
24syn case match
25
26" ----- Clusters -----
27syn cluster tcshModifiers	contains=tcshModifier,tcshModifierError
28syn cluster tcshQuoteList	contains=tcshDQuote,tcshSQuote,tcshBQuote
29syn cluster tcshStatementEnds	contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshRedir,tcshMeta,tcshHereDoc,tcshSpecial,tcshArguement
30syn cluster tcshStatements	contains=tcshBuiltin,tcshCommands,tcshIf,tcshWhile
31syn cluster tcshVarList		contains=tcshUsrVar,tcshArgv,tcshSubst
32syn cluster tcshConditions	contains=tcshCmdSubst,tcshParenExpr,tcshOperator,tcshNumber,@tcshVarList
33
34" ----- Errors -----
35" Define first, so can be easily overridden.
36syn match tcshError contained '\v\S.+'
37
38" ----- Statements -----
39" Tcsh commands: Any filename / modifiable variable (must be first!)
40syn match tcshCommands	'\v[a-zA-Z0-9\\./_$:-]+' contains=tcshSpecial,tcshUsrVar,tcshArgv,tcshVarError nextgroup=tcshStatementEnd
41
42" Builtin commands except those treated specially. Currently (un)set(env),
43" (un)alias, if, while, else, bindkey
44syn keyword tcshBuiltin nextgroup=tcshStatementEnd alloc bg break breaksw builtins bye case cd chdir complete continue default dirs echo echotc end endif endsw eval exec exit fg filetest foreach getspath getxvers glob goto hashstat history hup inlib jobs kill limit log login logout ls ls-F migrate newgrp nice nohup notify onintr popd printenv pushd rehash repeat rootnode sched setpath setspath settc setty setxvers shift source stop suspend switch telltc time umask uncomplete unhash universe unlimit ver wait warp watchlog where which
45
46" StatementEnd is anything after a built-in / command till the lexical end of a
47" statement (;, |, ||, |&, && or end of line)
48syn region tcshStatementEnd	transparent contained matchgroup=tcshBuiltin start='' end='\v\\@<!(;|\|[|&]?|\&\&|$)' contains=@tcshStatementEnds
49
50" set expressions (Contains shell variables)
51syn keyword tcshShellVar contained afsuser ampm argv autocorrect autoexpand autolist autologout backslash_quote catalog cdpath color colorcat command complete continue continue_args correct cwd dextract dirsfile dirstack dspmbyte dunique echo echo_style edit ellipsis fignore filec gid group histchars histdup histfile histlit history home ignoreeof implicitcd inputmode killdup killring listflags listjobs listlinks listmax listmaxrows loginsh logout mail matchbeep nobeep noclobber noding noglob nokanji nonomatch nostat notify oid owd path printexitvalue prompt prompt2 prompt3 promptchars pushdtohome pushdsilent recexact recognize_only_executables rmstar rprompt savedirs savehist sched shell shlvl status symlinks tcsh term time tperiod tty uid user verbose version visiblebell watch who wordchars
52syn keyword tcshBuiltin	nextgroup=tcshSetEnd set unset
53syn region  tcshSetEnd	contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshShellVar,@tcshStatementEnds
54
55" setenv expressions (Contains environment variables)
56syn keyword tcshEnvVar contained AFSUSER COLUMNS DISPLAY EDITOR GROUP HOME HOST HOSTTYPE HPATH LANG LC_CTYPE LINES LS_COLORS MACHTYPE NOREBIND OSTYPE PATH PWD REMOTEHOST SHLVL SYSTYPE TERM TERMCAP USER VENDOR VISUAL
57syn keyword tcshBuiltin	nextgroup=tcshEnvEnd setenv unsetenv
58syn region  tcshEnvEnd	contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshEnvVar,@tcshStatementEnds
59
60" alias and unalias (contains special aliases)
61syn keyword tcshAliases contained beepcmd cwdcmd jobcmd helpcommand periodic precmd postcmd shell
62syn keyword tcshBuiltin	nextgroup=tcshAliCmd skipwhite alias unalias
63syn match   tcshAliCmd	contained nextgroup=tcshAliEnd skipwhite '\v(\w|-)+' contains=tcshAliases
64syn region  tcshAliEnd	contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=@tcshStatementEnds
65
66" if statements
67syn keyword tcshIf	nextgroup=tcshIfEnd skipwhite if
68syn region  tcshIfEnd	contained start='\S' skip='\\$' matchgroup=tcshBuiltin end='\v<then>|$' contains=@tcshConditions,tcshSpecial,@tcshStatementEnds
69syn region  tcshIfEnd	contained matchgroup=tcshBuiltin contains=@tcshConditions,tcshSpecial start='(' end='\v\)%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds 
70syn region  tcshIfEnd	contained matchgroup=tcshBuiltin contains=tcshCommands,tcshSpecial start='\v\{\s+' end='\v\s+\}%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds keepend
71
72" else statements
73syn keyword tcshBuiltin	nextgroup=tcshIf skipwhite else
74
75" while statements (contains expressions / operators)
76syn keyword tcshBuiltin	nextgroup=@tcshConditions,tcshSpecial skipwhite while
77
78" Conditions (for if and while)
79syn region tcshParenExpr contained contains=@tcshConditions,tcshSpecial matchgroup=tcshBuiltin start='(' end=')'
80syn region tcshCmdSubst  contained contains=tcshCommands matchgroup=tcshBuiltin start='\v\{\s+' end='\v\s+\}' keepend
81
82" Bindkey. Internal editor functions
83syn keyword tcshBindkeyFuncs contained backward-char backward-delete-char
84	    \ backward-delete-word backward-kill-line backward-word
85	    \ beginning-of-line capitalize-word change-case
86	    \ change-till-end-of-line clear-screen complete-word
87	    \ complete-word-fwd complete-word-back complete-word-raw
88	    \ copy-prev-word copy-region-as-kill dabbrev-expand delete-char
89	    \ delete-char-or-eof delete-char-or-list
90	    \ delete-char-or-list-or-eof delete-word digit digit-argument
91	    \ down-history downcase-word end-of-file end-of-line
92	    \ exchange-point-and-mark expand-glob expand-history expand-line
93	    \ expand-variables forward-char forward-word
94	    \ gosmacs-transpose-chars history-search-backward
95	    \ history-search-forward insert-last-word i-search-fwd
96	    \ i-search-back keyboard-quit kill-line kill-region
97	    \ kill-whole-line list-choices list-choices-raw list-glob
98	    \ list-or-eof load-average magic-space newline normalize-path
99	    \ normalize-command overwrite-mode prefix-meta quoted-insert
100	    \ redisplay run-fg-editor run-help self-insert-command
101	    \ sequence-lead-in set-mark-command spell-word spell-line
102	    \ stuff-char toggle-literal-history transpose-chars
103	    \ transpose-gosling tty-dsusp tty-flush-output tty-sigintr
104	    \ tty-sigquit tty-sigtsusp tty-start-output tty-stop-output
105	    \ undefined-key universal-argument up-history upcase-word
106	    \ vi-beginning-of-next-word vi-add vi-add-at-eol vi-chg-case
107	    \ vi-chg-meta vi-chg-to-eol vi-cmd-mode vi-cmd-mode-complete
108	    \ vi-delprev vi-delmeta vi-endword vi-eword vi-char-back
109	    \ vi-char-fwd vi-charto-back vi-charto-fwd vi-insert
110	    \ vi-insert-at-bol vi-repeat-char-fwd vi-repeat-char-back
111	    \ vi-repeat-search-fwd vi-repeat-search-back vi-replace-char
112	    \ vi-replace-mode vi-search-back vi-search-fwd vi-substitute-char
113	    \ vi-substitute-line vi-word-back vi-word-fwd vi-undo vi-zero
114	    \ which-command yank yank-pop e_copy_to_clipboard
115	    \ e_paste_from_clipboard e_dosify_next e_dosify_prev e_page_up
116	    \ e_page_down
117syn keyword tcshBuiltin nextgroup=tcshBindkeyEnd bindkey
118syn region tcshBindkeyEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$' contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshMeta,tcshSpecial,tcshArguement,tcshBindkeyFuncs
119
120" Expressions start with @.
121syn match tcshExprStart '\v\@\s+' nextgroup=tcshExprVar
122syn match tcshExprVar	contained '\v\h\w*%(\[\d+\])?' contains=tcshShellVar,tcshEnvVar nextgroup=tcshExprOp
123syn match tcshExprOp	contained '++\|--'
124syn match tcshExprOp	contained '\v\s*\=' nextgroup=tcshExprEnd
125syn match tcshExprEnd	contained '\v.*$'hs=e+1 contains=@tcshConditions
126syn match tcshExprEnd	contained '\v.{-};'hs=e	contains=@tcshConditions
127
128" ----- Comments: -----
129syn match tcshComment	'#\s.*' contains=tcshTodo,tcshCommentTi,@Spell
130syn match tcshComment	'\v#($|\S.*)' contains=tcshTodo,tcshCommentTi
131syn match tcshSharpBang '^#! .*$'
132syn match tcshCommentTi contained '\v#\s*\u\w*(\s+\u\w*)*:'hs=s+1 contains=tcshTodo
133syn match tcshTodo	contained '\v\c<todo>'
134
135" ----- Strings -----
136" Tcsh does not allow \" in strings unless the "backslash_quote" shell
137" variable is set. Set the vim variable "tcsh_backslash_quote" to 0 if you
138" want VIM to assume that no backslash quote constructs exist.
139
140" Backquotes are treated as commands, and are not contained in anything
141if(exists('tcsh_backslash_quote') && tcsh_backslash_quote == 0)
142    syn region tcshSQuote	keepend contained start="\v\\@<!'" end="'"
143    syn region tcshDQuote	keepend contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell
144    syn region tcshBQuote	keepend start='\v\\@<!`' end='`' contains=@tcshStatements
145else
146    syn region tcshSQuote	contained start="\v\\@<!'" skip="\v\\\\|\\'" end="'"
147    syn region tcshDQuote	contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell
148    syn region tcshBQuote	keepend matchgroup=tcshBQuoteGrp start='\v\\@<!`' skip='\v\\\\|\\`' end='`' contains=@tcshStatements
149endif
150
151" ----- Variables -----
152" Variable Errors. Must come first! \$ constructs will be flagged by
153" tcshSpecial, so we don't consider them here.
154syn match tcshVarError	'\v\$\S*'	contained
155
156" Modifiable Variables without {}.
157syn match tcshUsrVar contained '\v\$\h\w*%(\[\d+%(-\d+)?\])?' nextgroup=@tcshModifiers contains=tcshShellVar,tcshEnvVar
158syn match tcshArgv   contained '\v\$%(\d+|\*)' nextgroup=@tcshModifiers
159
160" Modifiable Variables with {}.
161syn match tcshUsrVar contained '\v\$\{\h\w*%(\[\d+%(-\d+)?\])?%(:\S*)?\}' contains=@tcshModifiers,tcshShellVar,tcshEnvVar
162syn match tcshArgv   contained '\v\$\{%(\d+|\*)%(:\S*)?\}' contains=@tcshModifiers
163
164" Un-modifiable Substitutions. Order is important here.
165syn match tcshSubst contained	'\v\$[?#$!_<]' nextgroup=tcshModifierError
166syn match tcshSubst contained	'\v\$[%#?]%(\h\w*|\d+)' nextgroup=tcshModifierError contains=tcshShellVar,tcshEnvVar
167syn match tcshSubst contained	'\v\$\{[%#?]%(\h\w*|\d+)%(:\S*)?\}' contains=tcshModifierError contains=tcshShellVar,tcshEnvVar
168
169" Variable Name Expansion Modifiers (order important)
170syn match tcshModifierError	contained '\v:\S*'
171syn match tcshModifier		contained '\v:[ag]?[htreuls&qx]' nextgroup=@tcshModifiers
172
173" ----- Operators / Specials -----
174" Standard redirects (except <<) [<, >, >>, >>&, >>!, >>&!]
175syn match tcshRedir contained	'\v\<|\>\>?\&?!?'
176
177" Meta-chars
178syn match tcshMeta  contained	'\v[]{}*?[]'
179
180" Here documents (<<)
181syn region tcshHereDoc contained matchgroup=tcshShellVar start='\v\<\<\s*\z(\h\w*)' end='^\z1$' contains=@tcshVarList,tcshSpecial
182syn region tcshHereDoc contained matchgroup=tcshShellVar start="\v\<\<\s*'\z(\h\w*)'" start='\v\<\<\s*"\z(\h\w*)"$' start='\v\<\<\s*\\\z(\h\w*)$' end='^\z1$'
183
184" Operators
185syn match tcshOperator	contained '&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|%\|&\|+\|-\|/\|<\|>\||'
186"syn match tcshOperator	contained '[(){}]'
187
188" Numbers
189syn match tcshNumber	contained '\v<-?\d+>'
190
191" Arguments
192syn match tcshArguement	contained '\v\s@<=-(\w|-)*'
193
194" Special characters. \xxx, or backslashed characters.
195"syn match tcshSpecial	contained '\v\\@<!\\(\d{3}|.)'
196syn match tcshSpecial	contained '\v\\%([0-7]{3}|.)'
197
198" ----- Synchronising -----
199if exists('tcsh_minlines')
200    if tcsh_minlines == 'fromstart'
201	syn sync fromstart
202    else
203	exec 'syn sync minlines=' . tcsh_minlines
204    endif
205else
206    syn sync minlines=100	" Some completions can be quite long
207endif
208
209" Define highlighting of syntax groups
210hi def link tcshError		Error
211hi def link tcshBuiltin		Statement
212hi def link tcshShellVar	Preproc
213hi def link tcshEnvVar		tcshShellVar
214hi def link tcshAliases		tcshShellVar
215hi def link tcshAliCmd		Identifier
216hi def link tcshCommands	Identifier
217hi def link tcshIf		tcshBuiltin
218hi def link tcshWhile		tcshBuiltin
219hi def link tcshBindkeyFuncs	Function
220hi def link tcshExprStart	tcshBuiltin
221hi def link tcshExprVar		tcshUsrVar
222hi def link tcshExprOp		tcshOperator
223hi def link tcshExprEnd		tcshOperator
224hi def link tcshComment		Comment
225hi def link tcshCommentTi	Preproc
226hi def link tcshSharpBang	tcshCommentTi
227hi def link tcshTodo		Todo
228hi def link tcshSQuote		Constant
229hi def link tcshDQuote		tcshSQuote
230hi def link tcshBQuoteGrp	Include
231hi def link tcshVarError	Error
232hi def link tcshUsrVar		Type
233hi def link tcshArgv		tcshUsrVar
234hi def link tcshSubst		tcshUsrVar
235hi def link tcshModifier	tcshArguement
236hi def link tcshModifierError	tcshVarError
237hi def link tcshMeta		tcshSubst
238hi def link tcshRedir		tcshOperator
239hi def link tcshHereDoc		tcshSQuote
240hi def link tcshOperator	Operator
241hi def link tcshNumber		Number
242hi def link tcshArguement	Special
243hi def link tcshSpecial		SpecialChar
244
245let &cpo = s:oldcpo
246unlet s:oldcpo
247
248let b:current_syntax = 'tcsh'
249