PR #776 fixed an issue with complex aliases and expansion. However, this change also introduced a problem with aliases which contain `]` (for example, commonly seen on macOS: `alias ]=open`), due to using an associative array `seen_alias`, indexed by the alias name. Due to `"$seen_alias[$arg]"`, it would fail when `$arg` is expanded to anything containing `]`'. Thus, typing `] /` would result in: ``` > ] / (anon):unset:3: seen_alias[]]: invalid parameter name ``` This change fixes the issue by ensuring we properly access keys in the associative array `seen_alias`. Older versions of zsh have issues with map keys having special characters, especially lacking ways to remove such keys. The issue is described in detail in https://unix.stackexchange.com/questions/626393/in-zsh-how-do-i-unset-an-arbitrary-associative-array-element. This fix uses proposal from [zsh-workers/43269](https://www.zsh.org/mla/workers/2018/msg01073.html), discovered by Stephane Chazelas, that boils down to avoid removing keys from the map, and reconstruct the map anew with some keys omitted. Co-authored-by: @phy1729 |
||
|---|---|---|
| .. | ||
| test-data | ||
| main-highlighter.zsh | ||
| README.md | ||
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 / errorsreserved-word- shell reserved words (if,for)alias- aliasessuffix-alias- suffix aliases (requires zsh 5.1.1 or newer)global-alias- global aliasesbuiltin- shell builtin commands (shift,pwd,zstyle)function- function namescommand- command namesprecommand- precommand modifiers (e.g.,noglob,builtin)commandseparator- command separation tokens (;,&&)hashed-command- hashed commandsautodirectory- a directory name in command position when theAUTO_CDoption is setpath- existing filenamespath_pathseparator- path separators in filenames (/); if unset,pathis used (default)path_prefix- prefixes of existing filenamespath_prefix_pathseparator- path separators in prefixes of existing filenames (/); if unset,path_prefixis used (default)globbing- globbing expressions (*.txt)history-expansion- history expansion expressions (!fooand^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))arithmetic-expansion- arithmetic expansion$(( 42 )))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 theRC_QUOTESoption is set ('foo''bar')dollar-double-quoted-argument- parameter expansion inside double quotes ($fooinside"")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 (\xin$'\x48')assign- parameter assignments (x=fooandx=( ))redirection- redirection operators (<,>, etc)comment- comments, whensetopt INTERACTIVE_COMMENTSis in effect (echo # foo)comment- elided parameters in command position ($x lswhen$xis unset or empty)named-fd- named file descriptor (thefdinecho foo {fd}>&2)numeric-fd- numeric file descriptor (the2inecho 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 ZSH_HIGHLIGHT_DIRS_BLACKLIST array.
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.