Fish shell like syntax highlighting for Zsh.
Go to file
Manish Tiwari 3d15f057c1 main: bypass the command-type cache when PATH_DIRS is removed for sudo
Per Copilot review on #987: _zsh_highlight_main__type's cache is keyed
on the command name alone, so classifying a name once under PATH_DIRS
(e.g. as a plain top-level command) would silently poison later
lookups of that same name after sudo -- and vice versa -- regardless
of the PATH_DIRS removal, since the cache lookup happens before
$options_to_set is even consulted.

Give _zsh_highlight_main__type an explicit no_cache parameter, and
add _zsh_highlight_main__type_maybe_no_pathdirs(), a small wrapper
that only shadows $options_to_set (and only bypasses the cache) when
PATH_DIRS was actually present to remove -- so a user without
PATH_DIRS set sees this codepath do nothing at all. Both call sites
in the main word-classification block now go through this wrapper
instead of duplicating the shadowing logic inline.

Strengthened sudo-path_dirs.zsh to classify the same name twice in
one buffer (plain, then sudo-prefixed) specifically to exercise this
cache interaction, not just the PATH_DIRS removal in isolation.

Verified via WSL zsh 5.9: make test passes (same 28 pre-existing
TODO failures, zero new), and the strengthened test fails as expected
(observes "command" instead of "unknown-token" on the sudo-prefixed
occurrence) when run against the pre-fix highlighter.
2026-08-25 09:57:05 +05:30
.github/workflows CI: Update action versions 2023-10-29 13:25:08 -05:00
docs *: Use https in URLs 2023-10-25 21:33:29 -05:00
highlighters main: bypass the command-type cache when PATH_DIRS is removed for sudo 2026-08-25 09:57:05 +05:30
images Highlight redirections by default, and add that to the examples in README. 2020-02-28 22:49:02 +00:00
tests tests: fix relative links in tests/README.md 2026-08-21 21:19:05 -05:00
.editorconfig editorconfig: Fix Makefile settings 2020-04-12 02:59:39 +00:00
.gitattributes versionstamp: Set up '.revision-hash' file. 2015-10-19 07:21:20 +00:00
.gitignore docs: Create all.md 2015-11-24 00:22:26 -06:00
.revision-hash versionstamp: Set up '.revision-hash' file. 2015-10-19 07:21:20 +00:00
.version Post-release version number bump. 2023-12-18 16:07:39 -06:00
COPYING.md Bump copyright years. 2020-01-16 17:19:25 +00:00
HACKING.md docs,CI: Switch to Libera.Chat 2021-05-20 20:10:34 -05:00
INSTALL.md docs: Replace zplug instructions with zinit 2023-10-25 22:36:04 -05:00
Makefile make test: Re-enable syntax highlighting of TAP output in interactive runs 2020-03-15 18:10:18 +00:00
README.md *: Update sourceforge links 2022-02-22 10:42:31 +00:00
changelog.md main: Refactor __is_redirection 2024-01-06 12:36:52 -06:00
release.md driver: Bump the in-development is-at-least checks so they return false on zsh 5.8.1, released yesterday. 2022-02-13 18:03:11 +00:00
zsh-syntax-highlighting.plugin.zsh driver: Stop requiring function_argzero. 2016-06-10 15:18:46 +00:00
zsh-syntax-highlighting.zsh driver: Use stable zsh release in is-at-least calls 2023-12-18 16:02:40 -06:00

README.md

zsh-syntax-highlighting 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:

Before: Screenshot #1.1
After:  Screenshot #1.2

Before: Screenshot #2.1
After:  Screenshot #2.2

Before: Screenshot #3.1
After:  Screenshot #3.2

Before: Screenshot #4.1
After:  Screenshot #4.2

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.

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:

How to tweak

Syntax highlighting is done by pluggable highlighter scripts. See the documentation on highlighters for details and configuration settings.