zsh-syntax-highlighting/highlighters/main
Daniel Shahaf 5f80147c55 'main': Follow-up to last commit: Fix stdbuf options spec.
The effect of the bug was that «-:» was considered an option taking an argument
(see the parsing of the associative array in lines 692-693).

As to preventing recurrence, add a warning comment.  We _could_ change
the separator from colon to something else, but colon is idiomatic for
this use (see, e.g., passwd(5)), and the problem will be unlikely to
recur if and when we add a third field to the assoc's values.  (For
example, jexec(1), chroot(1), and even ssh(1) would benefit from a third
field saying how many positional arguments to skip before the positional
argument that's to be the command word — though in the last two cases,
specifying an "inner" command is optional.)
2019-03-27 11:45:17 +00:00
..
test-data main: in arguments starting with %?, ? is not a glob 2019-01-06 22:23:10 -06:00
main-highlighter.zsh 'main': Follow-up to last commit: Fix stdbuf options spec. 2019-03-27 11:45:17 +00:00
README.md docs: Fix broken symlinks 2015-11-24 00:40:09 -06:00

zsh-syntax-highlighting / highlighters / main

This is the main highlighter, that highlights:

  • Commands
  • Options
  • Arguments
  • Paths
  • Strings

This highlighter is active by default.

How to tweak it

This highlighter defines the following styles:

  • unknown-token - unknown tokens / errors
  • reserved-word - shell reserved words (if, for)
  • alias - aliases
  • suffix-alias - suffix aliases (requires zsh 5.1.1 or newer)
  • builtin - shell builtin commands (shift, pwd, zstyle)
  • function - function names
  • command - command names
  • precommand - precommand modifiers (e.g., noglob, builtin)
  • commandseparator - command separation tokens (;, &&)
  • hashed-command - hashed commands
  • path - existing filenames
  • path_pathseparator - path separators in filenames (/); if unset, path is used (default)
  • path_prefix - prefixes of existing filenames
  • path_prefix_pathseparator - path separators in prefixes of existing filenames (/); if unset, path_prefix is used (default)
  • globbing - globbing expressions (*.txt)
  • history-expansion - history expansion expressions (!foo and ^foo^bar)
  • command-substitution - command substitutions ($(echo foo))
  • command-substitution-unquoted - an unquoted command substitution ($(echo foo))
  • command-substitution-quoted - a quoted command substitution ("$(echo foo)")
  • command-substitution-delimiter - command substitution delimiters ($( and ))
  • command-substitution-delimiter-unquoted - an unquoted command substitution delimiters ($( and ))
  • command-substitution-delimiter-quoted - a quoted command substitution delimiters ("$( and )")
  • process-substitution - process substitutions (<(echo foo))
  • process-substitution-delimiter - process substitution delimiters (<( and ))
  • single-hyphen-option - single-hyphen options (-o)
  • double-hyphen-option - double-hyphen options (--option)
  • back-quoted-argument - backtick command substitution (`foo`)
  • back-quoted-argument-unclosed - unclosed backtick command substitution (`foo)
  • back-quoted-argument-delimiter - backtick command substitution delimiters (`)
  • single-quoted-argument - single-quoted arguments ('foo')
  • single-quoted-argument-unclosed - unclosed single-quoted arguments ('foo)
  • double-quoted-argument - double-quoted arguments ("foo")
  • double-quoted-argument-unclosed - unclosed double-quoted arguments ("foo)
  • dollar-quoted-argument - dollar-quoted arguments ($'foo')
  • dollar-quoted-argument-unclosed - unclosed dollar-quoted arguments ($'foo)
  • rc-quote - two single quotes inside single quotes when the RC_QUOTES option is set ('foo''bar')
  • dollar-double-quoted-argument - parameter expansion inside double quotes ($foo inside "")
  • back-double-quoted-argument - backslash escape sequences inside double-quoted arguments (\" in "foo\"bar")
  • back-dollar-quoted-argument - backslash escape sequences inside dollar-quoted arguments (\x in $'\x48')
  • assign - parameter assignments (x=foo and x=( ))
  • redirection - redirection operators (<, >, etc)
  • comment - comments, when setopt INTERACTIVE_COMMENTS is in effect (echo # foo)
  • named-fd - named file descriptor (echo foo {fd}>&2)
  • arg0 - a command word other than one of those enumerated above (other than a command, precommand, alias, function, or shell builtin command).
  • default - everything else

To override one of those styles, change its entry in ZSH_HIGHLIGHT_STYLES, for example in ~/.zshrc:

# Declare the variable
typeset -A ZSH_HIGHLIGHT_STYLES

# To differentiate aliases from other command types
ZSH_HIGHLIGHT_STYLES[alias]='fg=magenta,bold'

# To have paths colored instead of underlined
ZSH_HIGHLIGHT_STYLES[path]='fg=cyan'

# To disable highlighting of globbing expressions
ZSH_HIGHLIGHT_STYLES[globbing]='none'

The syntax for values is the same as the syntax of "types of highlighting" of the zsh builtin $zle_highlight array, which is documented in the zshzle(1) manual page.

Parameters

To avoid partial path lookups on a path, add the path to the X_ZSH_HIGHLIGHT_DIRS_BLACKLIST array. This interface is still experimental.

X_ZSH_HIGHLIGHT_DIRS_BLACKLIST+=(/mnt/slow_share)

Useless trivia

Forward compatibility.

zsh-syntax-highlighting attempts to be forward-compatible with zsh. Specifically, we attempt to facilitate highlighting command word types that had not yet been invented when this version of zsh-syntax-highlighting was released.

A command word is something like a function name, external command name, et cetera. (See Simple Commands & Pipelines in zshmisc(1) for a formal definition.)

If a new kind of command word is ever added to zsh — something conceptually different than "function" and "alias" and "external command" — then command words of that (new) kind will be highlighted by the style arg0_$kind, where $kind is the output of type -w on the new kind of command word. If that style is not defined, then the style arg0 will be used instead.