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