File: README.md
zsh-syntax-highlighting [![Build Status][build-status-image]][build-status]
Fish shell-like syntax highlighting for Zsh.
Requirements: zsh 4.3.11+.
This package provides syntax highlighting for the shell zsh. It enables
highlighting of commands whilst they are typed at a zsh prompt into an
interactive terminal. This helps in reviewing commands before running
them, particularly in catching syntax errors.
Some examples:
How to install
See INSTALL.md.
FAQ
Why must `zsh-syntax-highlighting.zsh` be sourced at the end of the `.zshrc` file?
zsh-syntax-highlighting works by hooking into the Zsh Line Editor (ZLE) and
computing syntax highlighting for the command-line buffer as it stands at the
time z-sy-h's hook is invoked.
In zsh 5.2 and older,zsh-syntax-highlighting.zsh hooks into ZLE by wrapping ZLE widgets. It must
be sourced after all custom widgets have been created (i.e., after all zle -N
calls and after running compinit) in order to be able to wrap all of them.
Widgets created after z-sy-h is sourced will work, but will not update the
syntax highlighting.
In zsh newer than 5.8 (not including 5.8 itself),
zsh-syntax-highlighting uses the add-zle-hook-widget facility to install
a zle-line-pre-redraw hook. Hooks are run in order of registration,
therefore, z-sy-h must be sourced (and register its hook) after anything else
that adds hooks that modify the command-line buffer.
Does syntax highlighting work during incremental history search?
Highlighting the command line during an incremental history search (by default bound to
to Ctrl+R in zsh's emacs keymap) requires zsh 5.4 or newer.
Under zsh versions older than 5.4, the zsh-default underlining
of the matched portion of the buffer remains available, but zsh-syntax-highlighting's
additional highlighting is unavailable. (Those versions of zsh do not provide
enough information to allow computing the highlighting correctly.)
See issues #288 and #415 for details.
How are new releases announced?
There is currently no "push" announcements channel. However, the following
alternatives exist:
- GitHub's RSS feed of releases: https://github.com/zsh-users/zsh-syntax-highlighting/releases.atom
- An anitya entry: https://release-monitoring.org/project/7552/
How to tweak
Syntax highlighting is done by pluggable highlighter scripts. See the
documentation on highlighters for details and
configuration settings.
File: docs/highlighters/brackets.md
zsh-syntax-highlighting / highlighters / brackets
This is the brackets highlighter, that highlights brackets and parentheses, and
matches them.
How to tweak it
This highlighter defines the following styles:
bracket-error- unmatched bracketsbracket-level-N- brackets with nest level Ncursor-matchingbracket- the matching bracket, if cursor is on a bracket
To override one of those styles, change its entry in ZSH_HIGHLIGHT_STYLES,
for example in ~/.zshrc:
# To define styles for nested brackets up to level 4
ZSH_HIGHLIGHT_STYLES[bracket-level-1]='fg=blue,bold'
ZSH_HIGHLIGHT_STYLES[bracket-level-2]='fg=red,bold'
ZSH_HIGHLIGHT_STYLES[bracket-level-3]='fg=yellow,bold'
ZSH_HIGHLIGHT_STYLES[bracket-level-4]='fg=magenta,bold'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.
File: docs/highlighters/cursor.md
zsh-syntax-highlighting / highlighters / cursor
This is the cursor highlighter, that highlights the cursor.
How to tweak it
This highlighter defines the following styles:
cursor- the style for the current cursor position
To override one of those styles, change its entry in ZSH_HIGHLIGHT_STYLES,
for example in ~/.zshrc:
ZSH_HIGHLIGHT_STYLES[cursor]='bg=blue'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.
File: docs/highlighters/line.md
zsh-syntax-highlighting / highlighters / line
This is the line highlighter, that highlights the whole line.
How to tweak it
This highlighter defines the following styles:
line- the style for the whole line
To override one of those styles, change its entry in ZSH_HIGHLIGHT_STYLES,
for example in ~/.zshrc:
ZSH_HIGHLIGHT_STYLES[line]='bold'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.
File: docs/highlighters/main.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.
File: docs/highlighters/pattern.md
zsh-syntax-highlighting / highlighters / pattern
This is the pattern highlighter, that highlights user-defined patterns.
How to tweak it
To use this highlighter, associate patterns with styles in theZSH_HIGHLIGHT_PATTERNS associative array, for example in ~/.zshrc:
# Declare the variable
typeset -A ZSH_HIGHLIGHT_PATTERNS
# To have commands starting with `rm -rf` in red:
ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')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.
File: docs/highlighters/regexp.md
zsh-syntax-highlighting / highlighters / regexp
This is the regexp highlighter, that highlights user-defined regular
expressions. It's similar to the pattern highlighter, but allows more complex
patterns.
How to tweak it
To use this highlighter, associate regular expressions with styles in theZSH_HIGHLIGHT_REGEXP associative array, for example in ~/.zshrc:
typeset -A ZSH_HIGHLIGHT_REGEXP
ZSH_HIGHLIGHT_REGEXP+=('^rm .*' fg=red,bold)This will highlight lines that start with a call to the rm command.
The regular expressions flavour used is PCRE when theRE_MATCH_PCRE option is set and POSIX Extended Regular Expressions (ERE),
as implemented by the platform's C library, otherwise. For details on the
latter, see the zsh/regex module's documentation and theregcomp(3) and re_format(7) manual pages on your system.
For instance, to highlight sudo only as a complete word, i.e., sudo cmd,
but not sudoedit, one might use:
When the
RE_MATCH_PCREis set:zshtypeset -A ZSH_HIGHLIGHT_REGEXP ZSH_HIGHLIGHT_REGEXP+=('\bsudo\b' fg=123,bold)When the
RE_MATCH_PCREis unset, on platforms with GNUlibc(e.g., many GNU/Linux distributions):zshtypeset -A ZSH_HIGHLIGHT_REGEXP ZSH_HIGHLIGHT_REGEXP+=('\<sudo\>' fg=123,bold)When the
RE_MATCH_PCREis unset, on BSD-based platforms (e.g., macOS):zshtypeset -A ZSH_HIGHLIGHT_REGEXP ZSH_HIGHLIGHT_REGEXP+=('[[:<:]]sudo[[:>:]]' fg=123,bold)
Note, however, that PCRE and POSIX ERE have a large common subset:
for instance, the regular expressions [abc], a*, and (a|b) have the same
meaning in both flavours.
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.
See also: regular expressions tutorial, zsh regexp operator =~
in the zshmisc(1) manual page
File: docs/highlighters/root.md
zsh-syntax-highlighting / highlighters / root
This is the root highlighter, that highlights the whole line if the current
user is root.
How to tweak it
This highlighter defines the following styles:
root- the style for the whole line if the current user is root.
To override one of those styles, change its entry in ZSH_HIGHLIGHT_STYLES,
for example in ~/.zshrc:
ZSH_HIGHLIGHT_STYLES[root]='bg=red'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.
File: docs/highlighters.md
zsh-syntax-highlighting / highlighters
Syntax highlighting is done by pluggable highlighters:
main- the base highlighter, and the only one active by default.brackets- matches brackets and parenthesis.pattern- matches user-defined patterns.regexp- matches user-defined regular expressions.cursor- matches the cursor position.root- highlights the whole command line if the current user is root.line- applied to the whole command line.
Highlighter-independent settings
By default, all command lines are highlighted. However, it is possible to
prevent command lines longer than a fixed number of characters from being
highlighted by setting the variable ${ZSH_HIGHLIGHT_MAXLENGTH} to the maximum
length (in characters) of command lines to be highlighter. This is useful when
editing very long command lines (for example, with the fned utility
function). Example:
ZSH_HIGHLIGHT_MAXLENGTH=512How to activate highlighters
To activate an highlighter, add it to the ZSH_HIGHLIGHT_HIGHLIGHTERS array.
By default ZSH_HIGHLIGHT_HIGHLIGHTERS is (main). For example to activatebrackets, pattern, and cursor highlighters, in ~/.zshrc do:
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(brackets pattern cursor)How to tweak highlighters
Highlighters look up styles from the ZSH_HIGHLIGHT_STYLES associative array.
Navigate into the individual highlighters' documentation to
see what styles (keys) each highlighter defines; 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.
Some highlighters support additional configuration parameters; see each
highlighter's documentation for details and examples.
How to implement a new highlighter
To create your own acme highlighter:
Create your script at
highlighters/acme/acme-highlighter.zsh.Implement the
_zsh_highlight_highlighter_acme_predicatefunction.
This function must return 0 when the highlighter needs to be called and
non-zero otherwise, for example:zsh_zsh_highlight_highlighter_acme_predicate() { # Call this highlighter in SVN working copies [[ -d .svn ]] }Implement the
_zsh_highlight_highlighter_acme_paintfunction.
This function does the actual syntax highlighting, by calling_zsh_highlight_add_highlightwith the start and end of the region to
be highlighted and theZSH_HIGHLIGHT_STYLESkey to use. Define the default
style for that key in the highlighter script outside of any function with: ${ZSH_HIGHLIGHT_STYLES[key]:=value}, being sure to prefix
the key with your highlighter name and a colon. For example:zsh: ${ZSH_HIGHLIGHT_STYLES[acme:aurora]:=fg=green} _zsh_highlight_highlighter_acme_paint() { # Colorize the whole buffer with the 'aurora' style _zsh_highlight_add_highlight 0 $#BUFFER acme:aurora }If you need to test which options the user has set, test
zsyh_user_options
with a sensible default if the option is not present in supported zsh
versions. For example:zsh[[ ${zsyh_user_options[ignoreclosebraces]:-off} == on ]]The option name must be all lowercase with no underscores and not an alias.
Name your own functions and global variables
_zsh_highlight_acme_*.In zsh-syntax-highlighting 0.4.0 and earlier, the entrypoints
_zsh_highlight_highlighter_acme_predicateand
_zsh_highlight_highlighter_acme_paint
were named
_zsh_highlight_acme_highlighter_predicateand
_zsh_highlight_highlighter_acme_paintrespectively.These names are still supported for backwards compatibility;
however, support for them will be removed in a future major or minor release (v0.x.0 or v1.0.0).
Activate your highlighter in
~/.zshrc:zshZSH_HIGHLIGHT_HIGHLIGHTERS+=(acme)
File: highlighters/README.md
zsh-syntax-highlighting / highlighters
Navigate into the individual highlighters' documentation to see
what styles ($ZSH_HIGHLIGHT_STYLES keys) each highlighter defines.
Refer to the documentation on highlighters for further
information.