tcsh.vim (13581B)
1 " Vim syntax file 2 " Language: tcsh scripts 3 " Maintainer: Doug Kearns <dougkearns@gmail.com> 4 " Previous Maintainer: Gautam Iyer <gi1242+vim@NoSpam.com> where NoSpam=gmail (Original Author) 5 " Last Change: 2026 Jan 16 6 7 " Description: We break up each statement into a "command" and an "end" part. 8 " All groups are either a "command" or part of the "end" of a statement (ie 9 " everything after the "command"). This is because blindly highlighting tcsh 10 " statements as keywords caused way too many false positives. Eg: 11 " 12 " set history=200 13 " 14 " causes history to come up as a keyword, which we want to avoid. 15 16 " Quit when a syntax file was already loaded 17 if exists('b:current_syntax') 18 finish 19 endif 20 21 let s:oldcpo = &cpo 22 set cpo&vim " Line continuation is used 23 24 syn iskeyword @,48-57,_,192-255,- 25 26 syn case match 27 28 " ----- Clusters ----- {{{1 29 syn cluster tcshModifiers contains=tcshModifier,tcshModifierError 30 syn cluster tcshQuoteList contains=tcshDQuote,tcshSQuote,tcshBQuote 31 syn cluster tcshStatementEnds contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshRedir,tcshMeta,tcshHereDoc,tcshSpecial,tcshArgument 32 syn cluster tcshStatements contains=tcshBuiltin,tcshCommands,tcshIf,tcshWhile 33 syn cluster tcshVarList contains=tcshUsrVar,tcshArgv,tcshSubst 34 syn cluster tcshConditions contains=tcshCmdSubst,tcshParenExpr,tcshOperator,tcshNumber,@tcshVarList 35 36 " ----- Errors ----- {{{1 37 " Define first, so can be easily overridden. 38 syn match tcshError contained '\v\S.+' 39 40 " ----- Statements ----- {{{1 41 " Tcsh commands: Any filename / modifiable variable (must be first!) 42 syn match tcshCommands '\v[a-zA-Z0-9\\./_$:-]+' contains=tcshSpecial,tcshUsrVar,tcshArgv,tcshVarError nextgroup=tcshStatementEnd 43 44 " Builtin commands except those treated specially. Currently (un)set(env), 45 " (un)alias, if, while, else, bindkey 46 syn 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 termname time umask uncomplete unhash universe unlimit ver wait warp watchlog where which 47 48 " StatementEnd is anything after a built-in / command till the lexical end of a 49 " statement (;, |, ||, |&, && or end of line) 50 syn region tcshStatementEnd transparent contained matchgroup=tcshBuiltin start='' end='\v\\@<!(;|\|[|&]?|\&\&|$)' contains=@tcshStatementEnds 51 52 " set expressions (Contains shell variables) 53 syn keyword tcshShellVar contained addsuffix afsuser ampm anyerror argv autocorrect autoexpand autolist autologout autorehash backslash_quote catalog cdpath cdtohome color colorcat command compat_expr complete continue continue_args correct csubstnonl cwd dextract dirsfile dirstack dspmbyte dunique echo echo_style edit editors ellipsis euid euser fignore filec gid globdot globstar group highlight 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 padhour parseoctal 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 vimode visiblebell watch who wordchars 54 syn keyword tcshBuiltin nextgroup=tcshSetEnd set unset 55 syn region tcshSetEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshShellVar,@tcshStatementEnds 56 57 " setenv expressions (Contains environment variables) 58 syn 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 59 syn keyword tcshBuiltin nextgroup=tcshEnvEnd setenv unsetenv 60 syn region tcshEnvEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshEnvVar,@tcshStatementEnds 61 62 " alias and unalias (contains special aliases) 63 syn keyword tcshAliases contained beepcmd cwdcmd jobcmd helpcommand periodic precmd postcmd shell 64 syn keyword tcshBuiltin nextgroup=tcshAliCmd skipwhite alias unalias 65 syn match tcshAliCmd contained nextgroup=tcshAliEnd skipwhite '\v(\w|-)+' contains=tcshAliases 66 syn region tcshAliEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=@tcshStatementEnds 67 68 " if statements 69 syn keyword tcshIf nextgroup=tcshIfEnd skipwhite if 70 syn region tcshIfEnd contained start='\S' skip='\\$' matchgroup=tcshBuiltin end='\v<then>|$' contains=@tcshConditions,tcshSpecial,@tcshStatementEnds 71 syn region tcshIfEnd contained matchgroup=tcshBuiltin contains=@tcshConditions,tcshSpecial start='(' end='\v\)%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds 72 syn region tcshIfEnd contained matchgroup=tcshBuiltin contains=tcshCommands,tcshSpecial start='\v\{\s+' end='\v\s+\}%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds keepend 73 74 " else statements 75 syn keyword tcshBuiltin nextgroup=tcshIf skipwhite else 76 77 " while statements (contains expressions / operators) 78 syn keyword tcshBuiltin nextgroup=@tcshConditions,tcshSpecial skipwhite while 79 80 " Conditions (for if and while) 81 syn region tcshParenExpr contained contains=@tcshConditions,tcshSpecial matchgroup=tcshBuiltin start='(' end=')' 82 syn region tcshCmdSubst contained contains=tcshCommands matchgroup=tcshBuiltin start='\v\{\s+' end='\v\s+\}' keepend 83 84 " Bindkey. Internal editor functions 85 syn keyword tcshBindkeyFuncs contained backward-char backward-delete-char 86 \ backward-delete-word backward-kill-line backward-word 87 \ beginning-of-line capitalize-word change-case 88 \ change-till-end-of-line clear-screen complete-word 89 \ complete-word-fwd complete-word-back complete-word-raw 90 \ copy-prev-word copy-region-as-kill dabbrev-expand delete-char 91 \ delete-char-or-eof delete-char-or-list 92 \ delete-char-or-list-or-eof delete-word digit digit-argument 93 \ down-history downcase-word end-of-file end-of-line 94 \ exchange-point-and-mark expand-glob expand-history expand-line 95 \ expand-variables forward-char forward-word 96 \ gosmacs-transpose-chars history-search-backward 97 \ history-search-forward insert-last-word i-search-fwd 98 \ i-search-back keyboard-quit kill-line kill-region 99 \ kill-whole-line list-choices list-choices-raw list-glob 100 \ list-or-eof load-average magic-space newline newline-and-hold 101 \ newline-and-down-history normalize-path normalize-command 102 \ overwrite-mode prefix-meta quoted-insert redisplay 103 \ run-fg-editor run-help self-insert-command sequence-lead-in 104 \ set-mark-command spell-word spell-line stuff-char 105 \ toggle-literal-history transpose-chars transpose-gosling 106 \ tty-dsusp tty-flush-output tty-sigintr tty-sigquit tty-sigtsusp 107 \ tty-start-output tty-stop-output undefined-key 108 \ universal-argument up-history upcase-word 109 \ vi-beginning-of-next-word vi-add vi-add-at-eol vi-chg-case 110 \ vi-chg-meta vi-chg-to-eol vi-cmd-mode vi-cmd-mode-complete 111 \ vi-delprev vi-delmeta vi-endword vi-eword vi-char-back 112 \ vi-char-fwd vi-charto-back vi-charto-fwd vi-insert 113 \ vi-insert-at-bol vi-repeat-char-fwd vi-repeat-char-back 114 \ vi-repeat-search-fwd vi-repeat-search-back vi-replace-char 115 \ vi-replace-mode vi-search-back vi-search-fwd vi-substitute-char 116 \ vi-substitute-line vi-word-back vi-word-fwd vi-undo vi-zero 117 \ which-command yank yank-pop e_copy_to_clipboard 118 \ e_paste_from_clipboard e_dosify_next e_dosify_prev e_page_up 119 \ e_page_down 120 syn keyword tcshBuiltin nextgroup=tcshBindkeyEnd bindkey 121 syn region tcshBindkeyEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$' contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshMeta,tcshSpecial,tcshArgument,tcshBindkeyFuncs 122 123 " Expressions start with @. 124 syn match tcshExprStart '\v\@\s+' nextgroup=tcshExprVar 125 syn match tcshExprVar contained '\v\h\w*%(\[\d+\])?' contains=tcshShellVar,tcshEnvVar nextgroup=tcshExprOp 126 syn match tcshExprOp contained '++\|--' 127 syn match tcshExprOp contained '\v\s*\=' nextgroup=tcshExprEnd 128 syn match tcshExprEnd contained '\v.*$'hs=e+1 contains=@tcshConditions 129 syn match tcshExprEnd contained '\v.{-};'hs=e contains=@tcshConditions 130 131 " ----- Comments: ----- {{{1 132 syn match tcshSharpBang '\%^#!.*$' 133 syn match tcshComment '#.*' contains=tcshTodo,@Spell 134 syn match tcshTodo contained '\v%(^\s*#\s*)@<=\c<%(TODO|FIXME|XXX)>' 135 136 " TODO: leading whitespace match is needed to prevent keyword matching 137 syn match tcshLabel '^\s*\w\+:\ze\s*$' 138 139 " ----- Strings ----- {{{1 140 " Tcsh does not allow \" in strings unless the "backslash_quote" shell 141 " variable is set. Set the vim variable "tcsh_backslash_quote" to 0 if you 142 " want VIM to assume that no backslash quote constructs exist. 143 144 " Backquotes are treated as commands, and are not contained in anything 145 if get(g:, 'tcsh_backslash_quote', 1) 146 syn region tcshSQuote contained start="'" skip="\v\\\\|\\'" end="'" 147 syn region tcshDQuote contained start='"' end='"' contains=@tcshVarList,tcshSpecial,@Spell 148 syn region tcshBQuote keepend matchgroup=tcshBQuoteGrp start='`' skip='\v\\\\|\\`' end='`' contains=@tcshStatements 149 else 150 syn region tcshSQuote keepend contained start="'" end="'" 151 syn region tcshDQuote keepend contained start='"' end='"' contains=@tcshVarList,tcshSpecial,@Spell 152 syn region tcshBQuote keepend start='`' end='`' contains=@tcshStatements 153 endif 154 155 " ----- Variables ----- {{{1 156 " Variable Errors. Must come first! \$ constructs will be flagged by 157 " tcshSpecial, so we don't consider them here. 158 syn match tcshVarError '\v\$\S*' contained 159 160 " Modifiable Variables without {}. 161 syn match tcshUsrVar contained '\v\$\h\w*%(\[\d+%(-\d+)?\])?' nextgroup=@tcshModifiers contains=tcshShellVar,tcshEnvVar 162 syn match tcshArgv contained '\v\$%(\d+|\*)' nextgroup=@tcshModifiers 163 164 " Modifiable Variables with {}. 165 syn match tcshUsrVar contained '\v\$\{\h\w*%(\[\d+%(-\d+)?\])?%(:\S*)?\}' contains=@tcshModifiers,tcshShellVar,tcshEnvVar 166 syn match tcshArgv contained '\v\$\{%(\d+|\*)%(:\S*)?\}' contains=@tcshModifiers 167 168 " Un-modifiable Substitutions. Order is important here. 169 syn match tcshSubst contained '\v\$[?#$!_<]' nextgroup=tcshModifierError 170 syn match tcshSubst contained '\v\$[%#?]%(\h\w*|\d+)' nextgroup=tcshModifierError contains=tcshShellVar,tcshEnvVar 171 syn match tcshSubst contained '\v\$\{[%#?]%(\h\w*|\d+)%(:\S*)?\}' contains=tcshModifierError contains=tcshShellVar,tcshEnvVar 172 173 " Variable Name Expansion Modifiers (order important) 174 syn match tcshModifierError contained '\v:\S*' 175 syn match tcshModifier contained '\v:[ag]?[htreuls&qx]' nextgroup=@tcshModifiers 176 177 " ----- Operators / Specials ----- {{{1 178 " Standard redirects (except <<) [<, >, >>, >>&, >>!, >>&!] 179 syn match tcshRedir contained '\v\<|\>\>?\&?!?' 180 181 " Meta-chars 182 syn match tcshMeta contained '\v[]{}*?[]' 183 184 " Here documents (<<) 185 syn region tcshHereDoc contained matchgroup=tcshShellVar start='\v\<\<\s*\z(\h\w*)' end='^\z1$' contains=@tcshVarList,tcshSpecial fold 186 syn 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$' fold 187 188 " Operators 189 syn match tcshOperator contained '&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|%\|&\|+\|-\|/\|<\|>\||' 190 "syn match tcshOperator contained '[(){}]' 191 192 " Numbers 193 syn match tcshNumber contained '\v<-?\d+>' 194 195 " Arguments 196 syn match tcshArgument contained '\v\s@<=-(\w|-)*' 197 198 " Special characters. \xxx, or backslashed characters. 199 "syn match tcshSpecial contained '\v\\@<!\\(\d{3}|.)' 200 syn match tcshSpecial contained '\v\\%([0-7]{3}|.)' 201 202 " ----- Synchronising ----- {{{1 203 if exists('tcsh_minlines') 204 if tcsh_minlines == 'fromstart' 205 syn sync fromstart 206 else 207 exec 'syn sync minlines=' . tcsh_minlines 208 endif 209 else 210 syn sync minlines=100 " Some completions can be quite long 211 endif 212 213 " ----- Highlighting ----- {{{1 214 " Define highlighting of syntax groups 215 hi def link tcshError Error 216 hi def link tcshBuiltin Statement 217 hi def link tcshShellVar Preproc 218 hi def link tcshEnvVar tcshShellVar 219 hi def link tcshAliases tcshShellVar 220 hi def link tcshAliCmd Identifier 221 hi def link tcshCommands Identifier 222 hi def link tcshIf tcshBuiltin 223 hi def link tcshWhile tcshBuiltin 224 hi def link tcshBindkeyFuncs Function 225 hi def link tcshExprStart tcshBuiltin 226 hi def link tcshExprVar tcshUsrVar 227 hi def link tcshExprOp tcshOperator 228 hi def link tcshExprEnd tcshOperator 229 hi def link tcshComment Comment 230 hi def link tcshSharpBang PreProc 231 hi def link tcshTodo Todo 232 hi def link tcshSQuote String 233 hi def link tcshDQuote tcshSQuote 234 hi def link tcshBQuoteGrp Include 235 hi def link tcshVarError Error 236 hi def link tcshUsrVar Type 237 hi def link tcshArgv tcshUsrVar 238 hi def link tcshSubst tcshUsrVar 239 hi def link tcshModifier tcshArgument 240 hi def link tcshModifierError tcshVarError 241 hi def link tcshMeta tcshSubst 242 hi def link tcshRedir tcshOperator 243 hi def link tcshHereDoc tcshSQuote 244 hi def link tcshOperator Operator 245 hi def link tcshNumber Number 246 hi def link tcshArgument Special 247 hi def link tcshSpecial SpecialChar 248 hi def link tcshLabel Label 249 " }}} 250 251 let &cpo = s:oldcpo 252 unlet s:oldcpo 253 254 let b:current_syntax = 'tcsh' 255 256 " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: