Showing preview only (917K chars total). Download the full file or copy to clipboard to get everything.
Repository: zsh-users/zsh-syntax-highlighting
Branch: master
Commit: 1d85c692615a
Files: 326
Total size: 834.2 KB
Directory structure:
gitextract_ggwn6lie/
├── .editorconfig
├── .gitattributes
├── .github/
│ └── workflows/
│ └── test.yml
├── .gitignore
├── .revision-hash
├── .version
├── COPYING.md
├── HACKING.md
├── INSTALL.md
├── Makefile
├── README.md
├── changelog.md
├── docs/
│ ├── highlighters/
│ │ ├── brackets.md
│ │ ├── cursor.md
│ │ ├── line.md
│ │ ├── main.md
│ │ ├── pattern.md
│ │ ├── regexp.md
│ │ └── root.md
│ └── highlighters.md
├── highlighters/
│ ├── README.md
│ ├── brackets/
│ │ ├── brackets-highlighter.zsh
│ │ └── test-data/
│ │ ├── cursor-matchingbracket-line-finish.zsh
│ │ ├── cursor-matchingbracket.zsh
│ │ ├── empty-styles.zsh
│ │ ├── loop-styles.zsh
│ │ ├── mismatch-patentheses.zsh
│ │ ├── near-quotes.zsh
│ │ ├── nested-parentheses.zsh
│ │ ├── only-error.zsh
│ │ ├── quoted-patentheses.zsh
│ │ ├── simple-parentheses.zsh
│ │ ├── unclosed-patentheses.zsh
│ │ └── unclosed-patentheses2.zsh
│ ├── cursor/
│ │ └── cursor-highlighter.zsh
│ ├── line/
│ │ └── line-highlighter.zsh
│ ├── main/
│ │ ├── main-highlighter.zsh
│ │ └── test-data/
│ │ ├── abspath-in-command-position1.zsh
│ │ ├── abspath-in-command-position1b.zsh
│ │ ├── abspath-in-command-position2.zsh
│ │ ├── abspath-in-command-position3.zsh
│ │ ├── abspath-in-command-position3b.zsh
│ │ ├── abspath-in-command-position4.zsh
│ │ ├── abspath-in-command-position5.zsh
│ │ ├── alias-assignment1.zsh
│ │ ├── alias-basic.zsh
│ │ ├── alias-brackets.zsh
│ │ ├── alias-command-substitution.zsh
│ │ ├── alias-comment1.zsh
│ │ ├── alias-comment2.zsh
│ │ ├── alias-complex.zsh
│ │ ├── alias-empty.zsh
│ │ ├── alias-eponymous1.zsh
│ │ ├── alias-eponymous2.zsh
│ │ ├── alias-in-cmdsubst.zsh
│ │ ├── alias-loop.zsh
│ │ ├── alias-loop2.zsh
│ │ ├── alias-nested-precommand.zsh
│ │ ├── alias-nested.zsh
│ │ ├── alias-parameter.zsh
│ │ ├── alias-precommand-option-argument1.zsh
│ │ ├── alias-precommand-option-argument2.zsh
│ │ ├── alias-precommand-option-argument3.zsh
│ │ ├── alias-precommand-option-argument4.zsh
│ │ ├── alias-quoted.zsh
│ │ ├── alias-redirect.zsh
│ │ ├── alias-reuse1.zsh
│ │ ├── alias-reuse2.zsh
│ │ ├── alias-reuse3.zsh
│ │ ├── alias-reuse4.zsh
│ │ ├── alias-reuse5.zsh
│ │ ├── alias-self.zsh
│ │ ├── alias-self2.zsh
│ │ ├── alias-to-dir.zsh
│ │ ├── alias-to-dir1b.zsh
│ │ ├── alias-unknown-token1.zsh
│ │ ├── alias-unknown-token2.zsh
│ │ ├── alias.zsh
│ │ ├── always1.zsh
│ │ ├── always2.zsh
│ │ ├── always3.zsh
│ │ ├── anonymous-function.zsh
│ │ ├── arg0-colon.zsh
│ │ ├── arith-cmdsubst-mess.zsh
│ │ ├── arith1.zsh
│ │ ├── arith2.zsh
│ │ ├── arithmetic-command-substitution.zsh
│ │ ├── arithmetic-doubled-parens.zsh
│ │ ├── arithmetic-empty.zsh
│ │ ├── arithmetic-evaluation.zsh
│ │ ├── arithmetic-hist-expn.zsh
│ │ ├── arithmetic-invalid-chars.zsh
│ │ ├── arithmetic-multiplication.zsh
│ │ ├── arithmetic-nested.zsh
│ │ ├── arithmetic-quoted.zsh
│ │ ├── arithmetic-unclosed.zsh
│ │ ├── arithmetic-unfinished.zsh
│ │ ├── array-cmdsep1.zsh
│ │ ├── array-cmdsep2.zsh
│ │ ├── array-cmdsep3.zsh
│ │ ├── assign-append.zsh
│ │ ├── assign-argv.zsh
│ │ ├── assign-array.zsh
│ │ ├── assign-array2.zsh
│ │ ├── assign-array3.zsh
│ │ ├── assign-invalid-command.zsh
│ │ ├── assign-not-array.zsh
│ │ ├── assign-not-array2.zsh
│ │ ├── assign-quoted-cmdsubst.zsh
│ │ ├── assign-semicolon.zsh
│ │ ├── assign-subshell.zsh
│ │ ├── assign-value-quote1.zsh
│ │ ├── assign-value-quote2.zsh
│ │ ├── assign.zsh
│ │ ├── assignment-before-resword1.zsh
│ │ ├── assignment-before-resword2.zsh
│ │ ├── assignment-before-resword3.zsh
│ │ ├── assignment-before-resword4.zsh
│ │ ├── assignment-before-resword5.zsh
│ │ ├── assignment-quoted.zsh
│ │ ├── back-quoted-argument.zsh
│ │ ├── back-quoted-open.zsh
│ │ ├── backslash-continuation.zsh
│ │ ├── backslash-continuation2.zsh
│ │ ├── backslash-space.zsh
│ │ ├── backslash.zsh
│ │ ├── bang-assign-array.zsh
│ │ ├── bang-assign-scalar.zsh
│ │ ├── bang-pipeline.zsh
│ │ ├── block-assignment-no-command.zsh
│ │ ├── braces1.zsh
│ │ ├── braces2.zsh
│ │ ├── brackets-matching1.zsh
│ │ ├── brackets-matching2.zsh
│ │ ├── brackets-mismatch1.zsh
│ │ ├── brackets-mismatch10-if-negative.zsh
│ │ ├── brackets-mismatch2.zsh
│ │ ├── brackets-mismatch3.zsh
│ │ ├── brackets-mismatch4.zsh
│ │ ├── brackets-mismatch5.zsh
│ │ ├── brackets-mismatch6.zsh
│ │ ├── brackets-mismatch7.zsh
│ │ ├── brackets-mismatch8-if-positive.zsh
│ │ ├── brackets-mismatch8.zsh
│ │ ├── brackets-mismatch9-if-positive.zsh
│ │ ├── brackets-premature-termination.zsh
│ │ ├── cdpath-abspath.zsh
│ │ ├── cmdpos-elision-partial.zsh
│ │ ├── command-substitution-adjacent.zsh
│ │ ├── command-substitution-in-assignment.zsh
│ │ ├── command-substitution-unclosed.zsh
│ │ ├── commandseparator.zsh
│ │ ├── comment-followed.zsh
│ │ ├── comment-leading.zsh
│ │ ├── comment-off.zsh
│ │ ├── comments.zsh
│ │ ├── commmand-parameter.zsh
│ │ ├── control-flow.zsh
│ │ ├── control-flow2.zsh
│ │ ├── control-flow3.zsh
│ │ ├── cthulhu.zsh
│ │ ├── dinbrack1.zsh
│ │ ├── dirs_blacklist.zsh
│ │ ├── dollar-dollar.zsh
│ │ ├── dollar-noise.zsh
│ │ ├── dollar-paren.zsh
│ │ ├── dollar-quoted.zsh
│ │ ├── dollar-quoted2.zsh
│ │ ├── dollar-quoted3.zsh
│ │ ├── double-hyphen-option.zsh
│ │ ├── double-quoted.zsh
│ │ ├── double-quoted2.zsh
│ │ ├── double-quoted3.zsh
│ │ ├── double-quoted4.zsh
│ │ ├── empty-command-newline.zsh
│ │ ├── empty-command.zsh
│ │ ├── empty-command2.zsh
│ │ ├── empty-line.zsh
│ │ ├── equals1.zsh
│ │ ├── equals2.zsh
│ │ ├── equals3.zsh
│ │ ├── equals4.zsh
│ │ ├── escaped-single-quote.zsh
│ │ ├── exec-redirection1.zsh
│ │ ├── fd-target-not-filename.zsh
│ │ ├── function-altsyntax.zsh
│ │ ├── function-named1.zsh
│ │ ├── function-named2.zsh
│ │ ├── function.zsh
│ │ ├── glob.zsh
│ │ ├── global-alias1.zsh
│ │ ├── globs-with-quoting.zsh
│ │ ├── hashed-command.zsh
│ │ ├── history-double-quoted-escaped.zsh
│ │ ├── history-double-quoted-followed.zsh
│ │ ├── history-double-quoted-no.zsh
│ │ ├── history-double-quoted-unescaped.zsh
│ │ ├── history-double-quoted-yes.zsh
│ │ ├── history-expansion.zsh
│ │ ├── history-expansion2.zsh
│ │ ├── inheritance.zsh
│ │ ├── jobsubst-isnt-glob.zsh
│ │ ├── jobsubst-isnt-glob2.zsh
│ │ ├── loop-newline.zsh
│ │ ├── meta-no-eval1.zsh
│ │ ├── meta-no-eval2.zsh
│ │ ├── multiline-array-assignment1.zsh
│ │ ├── multiline-string.zsh
│ │ ├── multiline-string2.zsh
│ │ ├── multios-negates-globbing.zsh
│ │ ├── multios-negates-globbing2.zsh
│ │ ├── multiple-quotes.zsh
│ │ ├── multiple-redirections.zsh
│ │ ├── noglob-alias.zsh
│ │ ├── noglob-always.zsh
│ │ ├── noglob1.zsh
│ │ ├── noglob2.zsh
│ │ ├── noglob3.zsh
│ │ ├── noglob4.zsh
│ │ ├── null-exec.zsh
│ │ ├── null-exec2-printenv.zsh
│ │ ├── number_range-glob.zsh
│ │ ├── off-by-one.zsh
│ │ ├── opt-shwordsplit1.zsh
│ │ ├── optimized-cmdsubst-input.zsh
│ │ ├── option-dollar-quote-isnt-filename.zsh
│ │ ├── option-path_dirs.zsh
│ │ ├── option-with-quotes.zsh
│ │ ├── order-path-after-dollar.zsh
│ │ ├── order-path-before-globbing.zsh
│ │ ├── param-positional-in-array-append.zsh
│ │ ├── param-precommand-option-argument1.zsh
│ │ ├── param-precommand-option-argument3.zsh
│ │ ├── parameter-elision-command-word.zsh
│ │ ├── parameter-expansion-shwordsplit.zsh
│ │ ├── parameter-expansion-untokenized1.zsh
│ │ ├── parameter-expansion-untokenized2.zsh
│ │ ├── parameter-star.zsh
│ │ ├── parameter-to-global-alias.zsh
│ │ ├── parameter-value-contains-command-position1.zsh
│ │ ├── parameter-value-contains-command-position2.zsh
│ │ ├── pasted-quotes.zsh
│ │ ├── path-broken-symlink.zsh
│ │ ├── path-dollared-word.zsh
│ │ ├── path-dollared-word2.zsh
│ │ ├── path-dollared-word3.zsh
│ │ ├── path-dollared-word3b.zsh
│ │ ├── path-dollared-word4.zsh
│ │ ├── path-mixed-quoting.zsh
│ │ ├── path-separators.zsh
│ │ ├── path-separators2.zsh
│ │ ├── path-space.zsh
│ │ ├── path-tilde-home.zsh
│ │ ├── path-tilde-home2.zsh
│ │ ├── path-tilde-home3.zsh
│ │ ├── path-tilde-named.zsh
│ │ ├── path.zsh
│ │ ├── path_prefix.zsh
│ │ ├── path_prefix2.zsh
│ │ ├── path_prefix3.zsh
│ │ ├── plain-file-in-command-position.zsh
│ │ ├── precommand-killing1.zsh
│ │ ├── precommand-killing2.zsh
│ │ ├── precommand-then-assignment.zsh
│ │ ├── precommand-type1.zsh
│ │ ├── precommand-type2.zsh
│ │ ├── precommand-type3.zsh
│ │ ├── precommand-uninstalled.zsh
│ │ ├── precommand-unknown-option.zsh
│ │ ├── precommand.zsh
│ │ ├── precommand2.zsh
│ │ ├── precommand3.zsh
│ │ ├── precommand4.zsh
│ │ ├── prefix-redirection.zsh
│ │ ├── process-substitution-after-redirection.zsh
│ │ ├── process-substitution-redirection-isnt-globbing.zsh
│ │ ├── process-substitution.zsh
│ │ ├── process-substitution2.zsh
│ │ ├── quoted-command-substitution-empty.zsh
│ │ ├── quoted-redirection-in-command-word.zsh
│ │ ├── rc-quotes.zsh
│ │ ├── redirection-all.zsh
│ │ ├── redirection-comment.zsh
│ │ ├── redirection-from-param.zsh
│ │ ├── redirection-in-cmdsubst.zsh
│ │ ├── redirection-inhibits-elision.zsh
│ │ ├── redirection-is-not-option.zsh
│ │ ├── redirection-special-cases.zsh
│ │ ├── redirection.zsh
│ │ ├── redirection2.zsh
│ │ ├── redirection3.zsh
│ │ ├── reserved-word.zsh
│ │ ├── simple-command.zsh
│ │ ├── simple-redirection.zsh
│ │ ├── subshell.zsh
│ │ ├── sudo-command.zsh
│ │ ├── sudo-comment.zsh
│ │ ├── sudo-longopt.zsh
│ │ ├── sudo-redirection.zsh
│ │ ├── sudo-redirection2.zsh
│ │ ├── sudo-redirection3.zsh
│ │ ├── tilde-command-word.zsh
│ │ ├── time-and-nocorrect1.zsh
│ │ ├── time-and-nocorrect2.zsh
│ │ ├── unbackslash.zsh
│ │ ├── unknown-command.zsh
│ │ ├── vanilla-newline.zsh
│ │ └── vi-linewise-mode.zsh
│ ├── pattern/
│ │ ├── pattern-highlighter.zsh
│ │ └── test-data/
│ │ └── rm-rf.zsh
│ ├── regexp/
│ │ ├── regexp-highlighter.zsh
│ │ └── test-data/
│ │ ├── complex.zsh
│ │ ├── subexpression.zsh
│ │ └── word-boundary.zsh
│ └── root/
│ └── root-highlighter.zsh
├── release.md
├── tests/
│ ├── README.md
│ ├── edit-failed-tests
│ ├── generate.zsh
│ ├── tap-colorizer.zsh
│ ├── tap-filter
│ ├── test-highlighting.zsh
│ ├── test-perfs.zsh
│ └── test-zprof.zsh
├── zsh-syntax-highlighting.plugin.zsh
└── zsh-syntax-highlighting.zsh
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# Top-most editorconfig file
root = true
[*]
end_of_line = lf
tab_width = 2
indent_size = 2
indent_style = space
[Makefile]
tab_width = 8
indent_size = 8
indent_style = tab
================================================
FILE: .gitattributes
================================================
.revision-hash export-subst
================================================
FILE: .github/workflows/test.yml
================================================
---
name: Tests
on:
push:
paths-ignore:
- '**.md'
- '**.png'
pull_request:
paths-ignore:
- '**.md'
- '**.png'
schedule:
- cron: '29 7 * * 1'
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version:
- master
- 5.9
- 5.8.1
- 5.8
- 5.7.1
- 5.7
- 5.6.2
- 5.6.1
- 5.6
- 5.5.1
- 5.5
- 5.4.2
- 5.4.1
- 5.4
- 5.3.1
- 5.3
- 5.2
- 5.1.1
- 5.1
- 5.0.8
- 5.0.7
- 5.0.6
- 5.0.5
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.3.17
- 4.3.16
- 4.3.15
- 4.3.14
- 4.3.13
- 4.3.12
- 4.3.11
container:
image: ghcr.io/zsh-users/zsh:${{ matrix.version }}
steps:
- uses: actions/checkout@v4
- run: install_packages bsdmainutils make procps
- run: make test
notify:
runs-on: ubuntu-latest
needs: test
if: failure() && (github.repository_owner == 'zsh-users')
steps:
-
name: Notify IRC
uses: Gottox/irc-message-action@v2
with:
channel: '#zsh-syntax-highlighting'
nickname: zsyh-gh-bot
message: '${{ github.ref }} failed tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
================================================
FILE: .gitignore
================================================
*.zwc*
.pc/
docs/all.md
================================================
FILE: .revision-hash
================================================
$Format:%H$
================================================
FILE: .version
================================================
0.8.1-dev
================================================
FILE: COPYING.md
================================================
Copyright (c) 2010-2020 zsh-syntax-highlighting contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions
and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of
conditions and the following disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
may be used to endorse or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: HACKING.md
================================================
Hacking on zsh-syntax-highlighting itself
=========================================
This document includes information for people working on z-sy-h itself: on the
core driver (`zsh-syntax-highlighting.zsh`), on the highlighters in the
distribution, and on the test suite. It does not target third-party
highlighter authors (although they may find it an interesting read).
The `main` highlighter
----------------------
The following function `pz` is useful when working on the `main` highlighting:
```zsh
pq() {
(( $#argv )) || return 0
print -r -l -- ${(qqqq)argv}
}
pz() {
local arg
for arg; do
pq ${(z)arg}
done
}
```
It prints, for each argument, its token breakdown, similar to how the main
loop of the `main` highlighter sees it.
Testing the `brackets` highlighter
----------------------------------
Since the test harness empties `ZSH_HIGHLIGHT_STYLES` and the `brackets`
highlighter interrogates `ZSH_HIGHLIGHT_STYLES` to determine how to highlight,
tests must set the `bracket-level-#` keys themselves. For example:
```zsh
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
BUFFER='echo ({x})'
expected_region_highlight=(
"6 6 bracket-level-1" # (
"7 7 bracket-level-2" # {
"9 9 bracket-level-2" # }
"10 10 bracket-level-1" # )
)
```
Testing the `pattern` and `regexp` highlighters
-----------------------------------------------
Because the `pattern` and `regexp` highlighters modifies `region_highlight`
directly instead of using `_zsh_highlight_add_highlight`, the test harness
cannot get the `ZSH_HIGHLIGHT_STYLES` keys. Therefore, when writing tests, use
the style itself as third word (cf. the
[documentation for `expected_region_highlight`](docs/highlighters.md)). For example:
```zsh
ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')
BUFFER='rm -rf /'
expected_region_highlight=(
"1 8 fg=white,bold,bg=red" # rm -rf /
)
```
Memos and commas
----------------
We append to `region_highlight` as follows:
```zsh
region_highlight+=("$start $end $spec, memo=zsh-syntax-highlighting")
```
That comma is required to cause zsh 5.8 and older to ignore the memo without
ignoring the `$spec`. It's a hack, but given that no further 5.8.x patch
releases are planned, it's been deemed acceptable. See issue #418 and the
cross-referenced issues.
Miscellany
----------
If you work on the driver (`zsh-syntax-highlighting.zsh`), you may find the following zstyle useful:
```zsh
zstyle ':completion:*:*:*:*:globbed-files' ignored-patterns {'*/',}zsh-syntax-highlighting.plugin.zsh
```
IRC channel
-----------
We're on #zsh-syntax-highlighting on Libera.Chat.
================================================
FILE: INSTALL.md
================================================
How to install
--------------
### Using packages
First, install the package:
* Arch Linux: [community/zsh-syntax-highlighting][arch-package] / [AUR/zsh-syntax-highlighting-git][AUR-package]
* Debian: `zsh-syntax-highlighting` package [in `stretch`][debian-package] (or in [OBS repository][obs-repository])
* Fedora: [zsh-syntax-highlighting package][fedora-package-alt] in Fedora 24+ (or in [OBS repository][obs-repository])
* FreeBSD: `pkg install zsh-syntax-highlighting` (port name: [`shells/zsh-syntax-highlighting`][freebsd-port])
* Gentoo: [app-shells/zsh-syntax-highlighting][gentoo-repository]
* Mac OS X / Homebrew: `brew install zsh-syntax-highlighting` ([formula][brew-package])
* NetBSD: `pkg_add zsh-syntax-highlighting` (port name: [`shells/zsh-syntax-highlighting`][netbsd-port])
* OpenBSD: `pkg_add zsh-syntax-highlighting` (port name: [`shells/zsh-syntax-highlighting`][openbsd-port])
* openSUSE / SLE: `zsh-syntax-highlighting` package in [OBS repository][obs-repository]
* RHEL / CentOS / Scientific Linux: `zsh-syntax-highlighting` package in [OBS repository][obs-repository]
* Ubuntu: `zsh-syntax-highlighting` package [in Xenial][ubuntu-package] (or in [OBS repository][obs-repository])
* Void Linux: `zsh-syntax-highlighting package` [in XBPS][void-package]
[arch-package]: https://www.archlinux.org/packages/zsh-syntax-highlighting
[AUR-package]: https://aur.archlinux.org/packages/zsh-syntax-highlighting-git
[brew-package]: https://github.com/Homebrew/homebrew-core/blob/master/Formula/z/zsh-syntax-highlighting.rb
[debian-package]: https://packages.debian.org/zsh-syntax-highlighting
[fedora-package]: https://apps.fedoraproject.org/packages/zsh-syntax-highlighting
[fedora-package-alt]: https://bodhi.fedoraproject.org/updates/?packages=zsh-syntax-highlighting
[freebsd-port]: https://www.freshports.org/textproc/zsh-syntax-highlighting/
[gentoo-repository]: https://packages.gentoo.org/packages/app-shells/zsh-syntax-highlighting
[netbsd-port]: http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/shells/zsh-syntax-highlighting/
[obs-repository]: https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-syntax-highlighting&package=zsh-syntax-highlighting
[openbsd-port]: https://cvsweb.openbsd.org/ports/shells/zsh-syntax-highlighting/
[ubuntu-package]: https://launchpad.net/ubuntu/+source/zsh-syntax-highlighting
[void-package]: https://github.com/void-linux/void-packages/tree/master/srcpkgs/zsh-syntax-highlighting
See also [repology's cross-distro index](https://repology.org/metapackage/zsh-syntax-highlighting/versions)
Second, enable zsh-syntax-highlighting by sourcing the script. Running this command on the terminal will add the source line to the end of your .zshrc:
* On most Linux distributions (except perhaps NixOS):
```zsh
echo "source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc
```
* NetBSD and OpenBSD:
```zsh
echo "source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc
```
* Mac OS X / Homebrew:
```zsh
echo "source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc
```
Then restart zsh (such as by opening a new instance of your terminal emulator).
Alternatively, add the `source` command manually **at the end** of your `.zshrc`:
* On most Linux distributions (except perhaps NixOS):
`source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh`
* NetBSD and OpenBSD:
`source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh`
Then restart zsh.
### In your ~/.zshrc
Simply clone this repository and source the script:
```zsh
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
echo "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc
```
Then, enable syntax highlighting in the current interactive shell:
```zsh
source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```
If `git` is not installed, download and extract a snapshot of the latest
development tree from:
```
https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz
```
Note the `source` command must be **at the end** of `~/.zshrc`.
### With a plugin manager
Note that `zsh-syntax-highlighting` must be the last plugin sourced.
The zsh-syntax-highlighting authors recommend manual installation over the use
of a framework or plugin manager.
This list is incomplete as there are too many
[frameworks / plugin managers][framework-list] to list them all here.
[framework-list]: https://github.com/unixorn/awesome-zsh-plugins#frameworks
#### [Antigen](https://github.com/zsh-users/antigen)
Add `antigen bundle zsh-users/zsh-syntax-highlighting` as the last bundle in
your `.zshrc`.
#### [Fig](https://fig.io)
Click the `Install Plugin` button on the [Fig plugin page][fig-plugin].
[fig-plugin]: https://fig.io/plugins/other/zsh-syntax-highlighting
#### [Oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
1. Clone this repository in oh-my-zsh's plugins directory:
```zsh
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```
2. Activate the plugin in `~/.zshrc`:
```zsh
plugins=( [plugins...] zsh-syntax-highlighting)
```
3. Restart zsh (such as by opening a new instance of your terminal emulator).
#### [Prezto](https://github.com/sorin-ionescu/prezto)
Zsh-syntax-highlighting is included with Prezto. See the
[Prezto documentation][prezto-docs] to enable and configure highlighters.
[prezto-docs]: https://github.com/sorin-ionescu/prezto/tree/master/modules/syntax-highlighting
#### [zgen](https://github.com/tarjoilija/zgen)
Add `zgen load zsh-users/zsh-syntax-highlighting` to the end of your `.zshrc`.
#### [zinit](https://github.com/zdharma-continuum/zinit)
Add `zinit light zsh-users/zsh-syntax-highlighting` to the end of your
`.zshrc`.
#### [zplug](https://github.com/zplug/zplug)
Add `zplug "zsh-users/zsh-syntax-highlighting", defer:2` to your `.zshrc`.
### System-wide installation
Any of the above methods is suitable for a single-user installation,
which requires no special privileges. If, however, you desire to install
zsh-syntax-highlighting system-wide, you may do so by running
```zsh
make install
```
and directing your users to add
```zsh
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```
to their `.zshrc`s.
================================================
FILE: Makefile
================================================
NAME=zsh-syntax-highlighting
INSTALL?=install -c
PREFIX?=/usr/local
SHARE_DIR?=$(DESTDIR)$(PREFIX)/share/$(NAME)
DOC_DIR?=$(DESTDIR)$(PREFIX)/share/doc/$(NAME)
ZSH?=zsh # zsh binary to run tests with
all:
cd docs && \
cp highlighters.md all.md && \
printf '\n\nIndividual highlighters documentation\n=====================================' >> all.md && \
for doc in highlighters/*.md; do printf '\n\n'; cat "$$doc"; done >> all.md
install: all
$(INSTALL) -d $(SHARE_DIR)
$(INSTALL) -d $(DOC_DIR)
cp .version zsh-syntax-highlighting.zsh $(SHARE_DIR)
cp COPYING.md README.md changelog.md $(DOC_DIR)
sed -e '1s/ .*//' -e '/^\[build-status-[a-z]*\]: /d' < README.md > $(DOC_DIR)/README.md
if [ x"true" = x"`git rev-parse --is-inside-work-tree 2>/dev/null`" ]; then \
git rev-parse HEAD; \
else \
cat .revision-hash; \
fi > $(SHARE_DIR)/.revision-hash
:
# The [ -e ] check below is to because sh evaluates this with (the moral
# equivalent of) NONOMATCH in effect, and highlighters/*.zsh has no matches.
for dirname in highlighters highlighters/*/ ; do \
$(INSTALL) -d $(SHARE_DIR)/"$$dirname"; \
for fname in "$$dirname"/*.zsh ; do [ -e "$$fname" ] && cp "$$fname" $(SHARE_DIR)"/$$dirname"; done; \
done
cp -R docs/* $(DOC_DIR)
clean:
rm -f docs/all.md
test:
@$(ZSH) -fc 'echo ZSH_PATCHLEVEL=$$ZSH_PATCHLEVEL'
@result=0; \
for test in highlighters/*; do \
if [ -d $$test/test-data ]; then \
echo "Running test $${test##*/}"; \
env -i QUIET=$$QUIET $${TERM:+"TERM=$$TERM"} $(ZSH) -f tests/test-highlighting.zsh "$${test##*/}"; \
: $$(( result |= $$? )); \
fi \
done; \
exit $$result
quiet-test:
$(MAKE) test QUIET=y
perf:
@result=0; \
for test in highlighters/*; do \
if [ -d $$test/test-data ]; then \
echo "Running test $${test##*/}"; \
$(ZSH) -f tests/test-perfs.zsh "$${test##*/}"; \
: $$(( result |= $$? )); \
fi \
done; \
exit $$result
.PHONY: all install clean test perf
================================================
FILE: README.md
================================================
zsh-syntax-highlighting [![Build Status][build-status-image]][build-status]
=======================
**[Fish shell][fish]-like syntax highlighting for [Zsh][zsh].**
*Requirements: zsh 4.3.11+.*
[fish]: https://fishshell.com/
[zsh]: https://www.zsh.org/
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: [](images/before1.png)
<br/>
After: [](images/after1.png)
Before: [](images/before2.png)
<br/>
After: [](images/after2.png)
Before: [](images/before3.png)
<br/>
After: [](images/after3.png)
Before: [](images/before4-smaller.png)
<br/>
After: [](images/after4-smaller.png)
How to install
--------------
See [INSTALL.md](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 <kbd>Ctrl+R</kbd> in zsh's emacs keymap) requires zsh 5.4 or newer.
Under zsh versions older than 5.4, the zsh-default [underlining][zshzle-Character-Highlighting]
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][i288] and [#415][i415] for details.
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
[i288]: https://github.com/zsh-users/zsh-syntax-highlighting/pull/288
[i415]: https://github.com/zsh-users/zsh-syntax-highlighting/pull/415
### 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](docs/highlighters.md) for details and
configuration settings.
[build-status]: https://github.com/zsh-users/zsh-syntax-highlighting/actions
[build-status-image]: https://github.com/zsh-users/zsh-syntax-highlighting/workflows/Tests/badge.svg
================================================
FILE: changelog.md
================================================
# Changes in HEAD
- Highlight `&>` `>&|` `>&!` `&>|` and `&>!` as redirection.
[#942]
# Changes in 0.8.0
This is a stable bugfix and feature release. Major new features and changes include:
## Changes fixed as part of the switch to zle-line-pre-redraw
The changes in this section were fixed by switching to a `zle-line-pre-redraw`-based
implementation.
Note: The new implementation will only be used on future zsh releases,
numbered 5.8.1.1 and newer, due to interoperability issues with other plugins
(issues #418 and #579). The underlying zsh feature has been available since
zsh 5.3.
Whilst under development, the new implementation was known as the
"feature/redrawhook" topic branch.
- Fixed: Highlighting not triggered after popping a buffer from the buffer stack
(using the `push-line` widget, default binding: `M-q`)
[#40]
- Fixed: Invoking completion when there were no matches removed highlighting
[#90, #470]
- Fixed: Two successive deletes followed by a yank only yanked the latest
delete, rather than both of them
[#150, #151, #160; cf. #183]
- Presumed fixed: Completing `$(xsel)` results in an error message from `xsel`,
with pre-2017 versions of `xsel`. (For 2017 vintage and newer, see the issue
for details.)
[#154]
- Fixed: When the standard `bracketed-paste-magic` widget is in use, pastes were slow
[#295]
- Fixed: No way to prevent a widget from being wrapped
[#324]
- Fixed: No highlighting while cycling menu completion
[#375]
- Fixed: Does not coexist with the `IGNORE_EOF` option
[#377]
- Fixed: The `undefined-key` widget was wrapped
[#421]
- Fixed: Does not coexist with the standard `surround` family of widgets
[#520]
- Fixed: First completed filename doesn't get `path` highlighting
[#632]
## Other changes
- Add issue #712 to the previous release's changelog (hereinafter).
- Fix highlighting when using an alias twice inside another alias
[#769, #775]
- Remove lint warning for `env` followed by a pipe
[#797]
- Recognize `proxychains` as a precommand
[#814, #914]
- Honor shwordsplit when expanding parameters
[#687, #818]
- Skip highlighting when keys are still pending in more cases
[#835]
- Recognize `grc` as a precommand
- Recognize `torsocks` and `torift` as precommands
[#898]
- Recognize `cpulimit` as a precommand
[#897]
- Recognize `ktrace` as a precommand
# Changes in 0.8.0-alpha1-pre-redrawhook
## Notice about an improbable-but-not-impossible forward incompatibility
Everyone can probably skip this section.
The `master` branch of zsh-syntax-highlighting uses a zsh feature that has not
yet appeared in a zsh release: the `memo=` feature, added to zsh in commit
zsh-5.8-172-gdd6e702ee (after zsh 5.8, before zsh 5.9). In the unlikely event
that this zsh feature should change in an incompatible way before the next
stable zsh release, set `zsh_highlight__memo_feature=0` in your .zshrc files to
disable use of the new feature.
z-sy-h dogfoods the new, unreleased zsh feature because that feature was
added to zsh at z-sy-h's initiative. The new feature is used in the fix
to issue #418.
## Incompatible changes:
- An unsuccessful completion (a <kbd>⮀ Tab</kbd> press that doesn't change the
command line) no longer causes highlighting to be lost. Visual feedback can
alternatively be achieved by setting the `format` zstyle under the `warnings`
tag, for example,
zstyle ':completion:*:warnings' format '%F{red}No matches%f'
Refer to the [description of the `format` style in `zshcompsys(1)`]
[zshcompsys-Standard-Styles-format].
(#90, part of #245 (feature/redrawhook))
[zshcompsys-Standard-Styles]: https://zsh.sourceforge.io/Doc/Release/Completion-System.html#Standard-Styles
[zshcompsys-Standard-Styles-format]: https://zsh.sourceforge.io/Doc/Release/Completion-System.html#index-format_002c-completion-style
## Other changes:
- Document `$ZSH_HIGHLIGHT_MAXLENGTH`.
[#698]
- Optimize highlighting unquoted words (words that are not in single quotes, double quotes, backticks, or dollar-single-quotes)
[#730]
- Redirection operators (e.g., `<` and `>`) are now highlighted by default
[#646]
- Propertly terminate `noglob` scope in try/always blocks
[#577]
- Don't error out when `KSH_ARRAYS` is set in the calling scope
[#622, #689]
- Literal semicolons in array assignments (`foo=( bar ; baz )`) are now
highlighted as errors.
[3ca93f864fb6]
- Command separators in array assignments (`foo=( bar | baz )`) are now
highlighted as errors.
[#651, 81267ca3130c]
- Support parameter elision in command position (e.g., `$foo ls` where `$foo` is unset or empty)
[#667]
- Don't consider the filename in `sudo -e /path/to/file` to be a command position
[#678]
- Don't look up absolute directory names in $cdpath
[2cc2583f8f12, part of #669]
- Fix `exec 2>&1;` being highlighted as an error.
[#676]
- Fix `: $(<*)` being highlighted as globbing.
[#582]
- Fix `cat < *` being highlighting as globbing when the `MULTIOS` option is unset.
[#583]
- Fix `echo >&2` highlighting the `2` as a filename if a file by that name happened to exist
[#694, part of #645]
- Fix `echo >&-` highlighting the `-` as a filename if a file by that name happened to exist
[part of #645]
- Fix `echo >&p` highlighting the `p` as a filename if a file by that name happened to exist
[part of #645]
- Fix wrong highlighting of unquoted parameter expansions under zsh 5.2 and older
[e165f18c758e]
- Highlight global aliases
[#700]
- Highlight `: =nosuchcommand' as an error (when the `EQUALS` option hasn't been unset).
[#430]
- Highlight reserved word after assignments as errors (e.g., `foo=bar (ls;)`)
[#461]
- Correctly highlight `[[ foo && bar || baz ]]`.
- Highlight non-executable files in command position correctly (e.g., `% /etc/passwd`)
[#202, #669]
- Highlight directories in command position correctly, including `AUTO_CD` support
[#669]
- Recognize `env` as a precommand (e.g., `env FOO=bar ls`)
- Recognize `ionice` as a precommand
- Recognize `strace` as a precommand
- Fix an error message on stderr before every prompt when the `WARN_NESTED_VAR` zsh option is set:
`_zsh_highlight_main__precmd_hook:1: array parameter _zsh_highlight_main__command_type_cache set in enclosing scope in function _zsh_highlight_main__precmd_hook`
[#727, #731, #732, #733]
- Fix highlighting of alias whose definitions use a simple command terminator
(such as `;`, `|`, `&&`) before a newline
[#677; had regressed in 0.7.0]
- Highlight arithmetic expansions (e.g., `$(( 42 ))`)
[#607 #649 #704]
- Highlight the parentheses of array assignments as reserved words (`foo=( bar )`).
The `assign` style remains supported and has precedence.
[#585]
- Fix interoperability issue with other plugins that use highlighting. The fix
requires zsh 5.8.0.3 or newer. (zsh 5.8.0.2-dev from the `master` branch,
revision zsh-5.8-172-gdd6e702ee or newer is also fine.)
[#418, https://github.com/okapia/zsh-viexchange/issues/1]
- Improve performance of the `brackets` highlighter.
- Fix highlighting of pre-command redirections (e.g., the `$fn` in `<$fn cat`)
[#712]
# Changes in version 0.7.1
- Remove out-of-date information from the 0.7.0 changelog.
# Changes in version 0.7.0
This is a stable bugfix and feature release. Major new features and changes include:
- Add `ZSH_HIGHLIGHT_DIRS_BLACKLIST` to disable "path" and "path prefix"
highlighting for specific directories
[#379]
- Add the "regexp" highlighter, modelled after the pattern highlighter
[4e6f60063f1c]
- When a word uses globbing, only the globbing metacharacters will be highlighted as globbing:
in `: foo*bar`, only the `*` will be blue.
[e48af357532c]
- Highlight pasted quotes (e.g., `: foo"bar"`)
[dc1b2f6fa4bb]
- Highlight command substitutions (`` : `ls` ``, `: $(ls)`)
[c0e64fe13178 and parents, e86f75a840e7, et al]
- Highlight process substitutions (`: >(nl)`, `: <(pwd)`, `: =(git diff)`)
[c0e64fe13178 and parents, e86f75a840e7, et al]
- Highlight command substitutions inside double quotes (``: "`foo`"``)
[f16e858f0c83]
- Highlight many precommands (e.g., `nice`, `stdbuf`, `eatmydata`;
see `$precommand_options` in the source)
- Highlight numeric globs (e.g., `echo /lib<->`)
- Assorted improvements to aliases highlighting
(e.g.,
`alias sudo_u='sudo -u'; sudo_u jrandom ls`,
`alias x=y y=z z=nosuchcommand; x`,
`alias ls='ls -l'; \ls`)
[f3410c5862fc, 57386f30aec8, #544, and many others]
- Highlight some more syntax errors
[dea05e44e671, 298ef6a2fa30]
- New styles: named file descriptors, `RC_QUOTES`, and unclosed quotes (e.g., `echo "foo<CURSOR>`)
[38c794a978cd, 25ae1c01216c, 967335dfc5fd]
- The 'brackets' highlighting no longer treats quotes specially.
[ecdda36ef56f]
Selected bugfixes include:
- Highlight `sudo` correctly when it's not installed
[26a82113b08b]
- Handle some non-default options being set in zshrc
[b07ada1255b7, a2a899b41b8, 972ad197c13d, b3f66fc8748f]
- Fix off-by-one highlighting in vi "visual" mode (vicmd keymap)
[be3882aeb054]
- The 'yank-pop' widget is not wrapped
[#183]
Known issues include:
- A multiline alias that uses a simple command terminator (such as `;`, `|`, `&&`)
before a newline will incorrectly be highlighted as an error. See issue #677
for examples and workarounds.
[#677]
[UPDATE: Fixed in 0.8.0]
# Changes in version 0.6.0
This is a stable release, featuring bugfixes and minor improvements.
## Performance improvements:
(none)
## Added highlighting of:
- The `isearch` and `suffix` [`$zle_highlight` settings][zshzle-Character-Highlighting].
(79e4d3d12405, 15db71abd0cc, b56ee542d619; requires zsh 5.3 for `$ISEARCHMATCH_ACTIVE` / `$SUFFIX_ACTIVE` support)
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
- Possible history expansions in double-quoted strings.
(76ea9e1df316)
- Mismatched `if`/`then`/`elif`/`else`/`fi`.
(73cb83270262)
## Fixed highlighting of:
- A comment line followed by a non-comment line.
(#385, 9396ad5c5f9c)
- An unquoted `$*` (expands to the positional parameters).
(237f89ad629f)
- history-incremental-pattern-search-backward under zsh 5.3.1.
(#407, #415, 462779629a0c)
## API changes (for highlighter authors):
(none)
## Developer-visible changes:
- tests: Set the `ALIAS_FUNC_DEF` option for zsh 5.4 compatibility.
(9523d6d49cb3)
## Other changes:
- docs: Added before/after screenshots.
(cd9ec14a65ec..b7e277106b49)
- docs: Link Fedora package.
(3d74aa47e4a7, 5feed23962df)
- docs: Link FreeBSD port.
(626c034c68d7)
- docs: Link OpenSUSE Build Service packages
(#419, dea1fedc7358)
- Prevent user-defined aliases from taking effect in z-sy-h's own code.
(#390, 2dce602727d7, 8d5afe47f774; and #392, #395, b8fa1b9dc954)
- docs: Update zplug installation instructions.
(#399, 4f49c4a35f17)
- Improve "unhandled ZLE widget 'foo'" error message.
(#409, be083d7f3710)
- Fix printing of "failed loading highlighters" error message.
(#426, ad522a091429)
# Changes in version 0.5.0
## Performance improvements:
We thank Sebastian Gniazdowski and "m0viefreak" for significant contributions
in this area.
- Optimize string operations in the `main` (default) highlighter.
(#372/3cb58fd7d7b9, 02229ebd6328, ef4bfe5bcc14, #372/c6b6513ac0d6, #374/15461e7d21c3)
- Command word highlighting: Use the `zsh/parameter` module to avoid forks.
Memoize (cache) the results.
(#298, 3ce01076b521, 2f18ba64e397, 12b879caf7a6; #320, 3b67e656bff5)
- Avoid forks in the driver and in the `root` highlighter.
(b9112aec798a, 38c8fbea2dd2)
## Added highlighting of:
- `pkexec` (a precommand).
(#248, 4f3910cbbaa5)
- Aliases that cannot be defined normally nor invoked normally (highlighted as an error).
(#263 (in part), 28932316cca6)
- Path separators (`/`) — the default behaviour remains to highlight path separators
and path components the same way.
(#136, #260, 6cd39e7c70d3, 9a934d291e7c, f3d3aaa00cc4)
- Assignments to individual positional arguments (`42=foo` to assign to `$42`).
(f4036a09cee3)
- Linewise region (the `visual-line-mode` widget, bound to `V` in zsh's `vi` keymap).
(#267, a7a7f8b42280, ee07588cfd9b)
- Command-lines recalled by `isearch` mode; requires zsh≥5.3.
(#261 (in part); #257; 4ad311ec0a68)
- Command-lines whilst the `IGNORE_BRACES` or `IGNORE_CLOSE_BRACES` option is in effect.
(a8a6384356af, 02807f1826a5)
- Mismatched parentheses and braces (in the `main` highlighter).
(51b9d79c3bb6, 2fabf7ca64b7, a4196eda5e6f, and others)
- Mismatched `do`/`done` keywords.
(b2733a64da93)
- Mismatched `foreach`/`end` keywords.
(#96, 2bb8f0703d8f)
- In Bourne-style function definitions, when the `MULTI_FUNC_DEF` option is set
(which is the default), highlight the first word in the function body as
a command word: `f() { g "$@" }`.
(6f91850a01e1)
- `always` blocks.
(#335, e5782e4ddfb6)
- Command substitutions inside double quotes, `"$(echo foo)"`.
(#139 (in part), c3913e0d8ead)
- Non-alphabetic parameters inside double quotes (`"$$"`, `"$#"`, `"$*"`, `"$@"`, `"$?"`, `"$-"`).
(4afe670f7a1b, 44ef6e38e5a7)
- Command words from future versions of zsh (forward compatibly).
This also adds an `arg0` style that all other command word styles fall back to.
(b4537a972eed, bccc3dc26943)
- Escaped history expansions inside double quotes: `: "\!"`
(28d7056a7a06, et seq)
## Fixed highlighting of:
- Command separator tokens in syntactically-invalid positions.
(09c4114eb980)
- Redirections with a file descriptor number at command word.
(#238 (in part), 73ee7c1f6c4a)
- The `select` prompt, `$PS3`.
(#268, 451665cb2a8b)
- Values of variables in `vared`.
(e500ca246286)
- `!` as an argument (neither a history expansion nor a reserved word).
(4c23a2fd1b90)
- "division by zero" error under the `brackets` highlighter when `$ZSH_HIGHLIGHT_STYLES` is empty.
(f73f3d53d3a6)
- Process substitutions, `<(pwd)` and `>(wc -l)`.
(#302, 6889ff6bd2ad, bfabffbf975c, fc9c892a3f15)
- The non-`SHORT_LOOPS` form of `repeat` loops: `repeat 42; do true; done`.
(#290, 4832f18c50a5, ef68f50c048f, 6362c757b6f7)
- Broken symlinks (are now highlighted as files).
(#342, 95f7206a9373, 53083da8215e)
- Lines accepted from `isearch` mode.
(#284; #257, #259, #288; 5bae6219008b, a8fe22d42251)
- Work around upstream bug that triggered when the command word was a relative
path, that when interpreted relative to a $PATH directory denoted a command;
the effect of that upstream bug was that the relative path was cached as
a "valid external command name".
(#354, #355, 51614ca2c994, fdaeec45146b, 7d38d07255e4;
upstream fix slated to be released in 5.3 (workers/39104))
- After accepting a line with the cursor on a bracket, the matching bracket
of the bracket under the cursor no longer remains highlighted (with the
`brackets` highlighter).
(4c4baede519a)
- The first word on a new line within an array assignment or initialization is no
longer considered a command position.
(8bf423d16d46)
- Subshells that end at command position, `(A=42)`, `(true;)`.
(#231, 7fb6f9979121; #344, 4fc35362ee5a)
- Command word after array assignment, `a=(lorem ipsum) pwd`.
(#330, 7fb6f9979121)
## API changes (for highlighter authors):
- New interface `_zsh_highlight_add_highlight`.
(341a3ae1f015, c346f6eb6fb6)
- tests: Specify the style key, not its value, in test expectations.
(a830613467af, fd061b5730bf, eaa4335c3441, among others)
- Module author documentation improvements.
(#306 (in part), 217669270418, 0ff354b44b6e, 80148f6c8402, 364f206a547f, and others)
- The driver no longer defines a `_zsh_highlight_${highlighter}_highlighter_cache`
variable, which is in the highlighters' namespace.
(3e59ab41b6b8, 80148f6c8402, f91a7b885e7d)
- Rename highlighter entry points. The old names remain supported for
backwards compatibility.
(a3d5dfcbdae9, c793e0dceab1)
- tests: Add the "NONE" expectation.
(4da9889d1545, 13018f3dd735, d37c55c788cd)
- tests: consider a test that writes to stderr to have failed.
(#291, 1082067f9315)
## Developer-visible changes:
- Add `make quiet-test`.
(9b64ad750f35)
- test harness: Better quote replaceables in error messages.
(30d8f92df225)
- test harness: Fix exit code for XPASS.
(bb8d325c0cbd)
- Create [HACKING.md](HACKING.md).
(cef49752fd0e)
- tests: Emit a description for PASS test points.
(6aa57d60aa64, f0bae44b76dd)
- tests: Create a script that generates a test file.
(8013dc3b8db6, et seq; `tests/generate.zsh`)
## Other changes:
- Under zsh≤5.2, widgets whose names start with a `_` are no longer excluded
from highlighting.
(ed33d2cb1388; reverts part of 186d80054a40 which was for #65)
- Under zsh≤5.2, widgets implemented by a function named after the widget are
no longer excluded from highlighting.
(487b122c480d; reverts part of 776453cb5b69)
- Under zsh≤5.2, shell-unsafe widget names can now be wrapped.
(#278, 6a634fac9fb9, et seq)
- Correct some test expectations.
(78290e043bc5)
- `zsh-syntax-highlighting.plugin.zsh`: Convert from symlink to plain file
for msys2 compatibility.
(#292, d4f8edc9f3ad)
- Document installation under some plugin managers.
(e635f766bef9, 9cab566f539b)
- Don't leak the `PATH_DIRS` option.
(7b82b88a7166)
- Don't require the `FUNCTION_ARGZERO` option to be set.
(#338, 750aebc553f2)
- Under zsh≤5.2, support binding incomplete/nonexistent widgets.
(9e569bb0fe04, part of #288)
- Make the driver reentrant, fixing possibility of infinite recursion
under zsh≤5.2 under interaction with theoretical third-party code.
(#305, d711563fe1bf, 295d62ec888d, f3242cbd6aba)
- Fix warnings when `WARN_CREATE_GLOBAL` is set prior to sourcing zsh-syntax-highlighting.
(z-sy-h already sets `WARN_CREATE_GLOBAL` internally.)
(da60234fb236)
- Warn only once, rather than once per keypress, when a highlighter is unavailable.
(0a9b347483ae)
# Changes in version 0.4.1
## Fixes:
- Arguments to widgets were not properly dash-escaped. Only matters for widgets
that take arguments (i.e., that are invoked as `zle ${widget} -- ${args}`).
(282c7134e8ac, reverts c808d2187a73)
# Changes in version 0.4.0
## Added highlighting of:
- incomplete sudo commands
(a3047a912100, 2f05620b19ae)
```zsh
sudo;
sudo -u;
```
- command words following reserved words
(#207, #222, b397b12ac139 et seq, 6fbd2aa9579b et seq, 8b4adbd991b0)
```zsh
if ls; then ls; else ls; fi
repeat 10 do ls; done
```
(The `ls` are now highlighted as a command.)
- comments (when `INTERACTIVE_COMMENTS` is set)
(#163, #167, 693de99a9030)
```zsh
echo Hello # comment
```
- closing brackets of arithmetic expansion, subshells, and blocks
(#226, a59f442d2d34, et seq)
```zsh
(( foo ))
( foo )
{ foo }
```
- command names enabled by the `PATH_DIRS` option
(#228, 96ee5116b182)
```zsh
# When ~/bin/foo/bar exists, is executable, ~/bin is in $PATH,
# and 'setopt PATH_DIRS' is in effect
foo/bar
```
- parameter expansions with braces inside double quotes
(#186, 6e3720f39d84)
```zsh
echo "${foo}"
```
- parameter expansions in command word
(#101, 4fcfb15913a2)
```zsh
x=/bin/ls
$x -l
```
- the command separators '\|&', '&!', '&\|'
```zsh
view file.pdf &! ls
```
## Fixed highlighting of:
- precommand modifiers at non-command-word position
(#209, 2c9f8c8c95fa)
```zsh
ls command foo
```
- sudo commands with infix redirections
(#221, be006aded590, 86e924970911)
```zsh
sudo -u >/tmp/foo.out user ls
```
- subshells; anonymous functions
(#166, #194, 0d1bfbcbfa67, 9e178f9f3948)
```zsh
(true)
() { true }
```
- parameter assignment statements with no command
(#205, 01d7eeb3c713)
```zsh
A=1;
```
(The semicolon used to be highlighted as a mistake)
- cursor highlighter: Remove the cursor highlighting when accepting a line.
(#109, 4f0c293fdef0)
## Removed features:
- Removed highlighting of approximate paths (`path_approx`).
(#187, 98aee7f8b9a3)
## Other changes:
- main highlighter refactored to use states rather than booleans.
(2080a441ac49, et seq)
- Fix initialization when sourcing `zsh-syntax-highlighting.zsh` via a symlink
(083c47b00707)
- docs: Add screenshot.
(57624bb9f64b)
- widgets wrapping: Don't add '--' when invoking widgets.
(c808d2187a73) [_reverted in 0.4.1_]
- Refresh highlighting upon `accept-*` widgets (`accept-line` et al).
(59fbdda64c21)
- Stop leaking match/mbegin/mend to global scope (thanks to upstream
`WARN_CREATE_GLOBAL` improvements).
(d3deffbf46a4)
- 'make install': Permit setting `$(SHARE_DIR)` from the environment.
(e1078a8b4cf1)
- driver: Tolerate KSH_ARRAYS being set in the calling context.
(#162, 8f19af6b319d)
- 'make install': Install documentation fully and properly.
(#219, b1619c001390, et seq)
- docs: Improve 'main' highlighter's documentation.
(00de155063f5, 7d4252f5f596)
- docs: Moved to a new docs/ tree; assorted minor updates
(c575f8f37567, 5b34c23cfad5, et seq)
- docs: Split README.md into INSTALL.md
(0b3183f6cb9a)
- driver: Report `$ZSH_HIGHLIGHT_REVISION` when running from git
(84734ba95026)
## Developer-visible changes:
- Test harness converted to [TAP](https://testanything.org/tap-specification.html) format
(d99aa58aaaef, et seq)
- Run each test in a separate subprocess, isolating them from each other
(d99aa58aaaef, et seq)
- Fix test failure with nonexisting $HOME
(#216, b2ac98b98150)
- Test output is now colorized.
(4d3da30f8b72, 6fe07c096109)
- Document `make install`
(a18a7427fd2c)
- tests: Allow specifying the zsh binary to use.
(557bb7e0c6a0)
- tests: Add 'make perf' target
(4513eaea71d7)
- tests: Run each test in a sandbox directory
(c01533920245)
# Changes in version 0.3.0
## Added highlighting of:
- suffix aliases (requires zsh 5.1.1 or newer):
```zsh
alias -s png=display
foo.png
```
- prefix redirections:
```zsh
<foo.txt cat
```
- redirection operators:
```zsh
echo > foo.txt
```
- arithmetic evaluations:
```zsh
(( 42 ))
```
- $'' strings, including \x/\octal/\u/\U escapes
```zsh
: $'foo\u0040bar'
```
- multiline strings:
```zsh
% echo "line 1
line 2"
```
- string literals that haven't been finished:
```zsh
% echo "Hello, world
```
- command words that involve tilde expansion:
```zsh
% ~/bin/foo
```
## Fixed highlighting of:
- quoted command words:
```zsh
% \ls
```
- backslash escapes in "" strings:
```zsh
% echo "\x41"
```
- noglob after command separator:
```zsh
% :; noglob echo *
```
- glob after command separator, when the first command starts with 'noglob':
```zsh
% noglob true; echo *
```
- the region (vi visual mode / set-mark-command) (issue #165)
- redirection and command separators that would be highlighted as `path_approx`
```zsh
% echo foo;‸
% echo <‸
```
(where `‸` represents the cursor location)
- escaped globbing (outside quotes)
```zsh
% echo \*
```
## Other changes:
- implemented compatibility with zsh's paste highlighting (issue #175)
- `$?` propagated correctly to wrapped widgets
- don't leak $REPLY into global scope
## Developer-visible changes:
- added makefile with `install` and `test` targets
- set `warn_create_global` internally
- document release process
# Version 0.2.1
(Start of changelog.)
================================================
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 brackets
* `bracket-level-N` - brackets with nest level N
* `cursor-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`:
```zsh
# 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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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
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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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
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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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 / errors
* `reserved-word` - shell reserved words (`if`, `for`)
* `alias` - aliases
* `suffix-alias` - suffix aliases (requires zsh 5.1.1 or newer)
* `global-alias` - global aliases
* `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
* `autodirectory` - a directory name in command position when the `AUTO_CD` option is set
* `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 `)`)
* `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 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`)
* `comment` - elided parameters in command position (`$x ls` when `$x` is unset or empty)
* `named-fd` - named file descriptor (the `fd` in `echo foo {fd}>&2`)
* `numeric-fd` - numeric file descriptor (the `2` in `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`:
```zsh
# 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][zshzle-Character-Highlighting].
#### Parameters
To avoid partial path lookups on a path, add the path to the `ZSH_HIGHLIGHT_DIRS_BLACKLIST` array.
```zsh
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)`][zshmisc-Simple-Commands-And-Pipelines]
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.
[zshmisc-Simple-Commands-And-Pipelines]: https://zsh.sourceforge.io/Doc/Release/Shell-Grammar.html#Simple-Commands-_0026-Pipelines
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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 the
`ZSH_HIGHLIGHT_PATTERNS` associative array, for example in `~/.zshrc`:
```zsh
# 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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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 the
`ZSH_HIGHLIGHT_REGEXP` associative array, for example in `~/.zshrc`:
```zsh
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][pcresyntax] when the
`RE_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][MAN_ZSH_REGEX] and the
`regcomp(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_PCRE` is set:
```zsh
typeset -A ZSH_HIGHLIGHT_REGEXP
ZSH_HIGHLIGHT_REGEXP+=('\bsudo\b' fg=123,bold)
```
* When the `RE_MATCH_PCRE` is unset, on platforms with GNU `libc` (e.g., many GNU/Linux distributions):
```zsh
typeset -A ZSH_HIGHLIGHT_REGEXP
ZSH_HIGHLIGHT_REGEXP+=('\<sudo\>' fg=123,bold)
```
* When the `RE_MATCH_PCRE` is unset, on BSD-based platforms (e.g., macOS):
```zsh
typeset -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][zshzle-Character-Highlighting].
See also: [regular expressions tutorial][perlretut], zsh regexp operator `=~`
in [the `zshmisc(1)` manual page][zshmisc-Conditional-Expressions]
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
[perlretut]: https://perldoc.perl.org/perlretut
[zshmisc-Conditional-Expressions]: https://zsh.sourceforge.io/Doc/Release/Conditional-Expressions.html#Conditional-Expressions
[MAN_ZSH_REGEX]: https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html#The-zsh_002fregex-Module
[pcresyntax]: https://www.pcre.org/original/doc/html/pcresyntax.html
================================================
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
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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
================================================
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][main].
* `brackets` - [matches brackets][brackets] and parenthesis.
* `pattern` - matches [user-defined patterns][pattern].
* `regexp` - matches [user-defined regular expressions][regexp].
* `cursor` - matches [the cursor position][cursor].
* `root` - highlights the whole command line [if the current user is root][root].
* `line` - applied to [the whole command line][line].
[main]: highlighters/main.md
[brackets]: highlighters/brackets.md
[pattern]: highlighters/pattern.md
[regexp]: highlighters/regexp.md
[cursor]: highlighters/cursor.md
[root]: highlighters/root.md
[line]: highlighters/line.md
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`][fned] utility
function). Example:
[fned]: https://zsh.sourceforge.io/Doc/Release/User-Contributions.html#index-zed
```zsh
ZSH_HIGHLIGHT_MAXLENGTH=512
```
How 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 activate
`brackets`, `pattern`, and `cursor` highlighters, in `~/.zshrc` do:
```zsh
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](highlighters/) 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][zshzle-Character-Highlighting].
[zshzle-Character-Highlighting]: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html#Character-Highlighting
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_predicate` function.
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_paint` function.
This function does the actual syntax highlighting, by calling
`_zsh_highlight_add_highlight` with the start and end of the region to
be highlighted and the `ZSH_HIGHLIGHT_STYLES` key 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_predicate` and
`_zsh_highlight_highlighter_acme_paint`
were named
`_zsh_highlight_acme_highlighter_predicate` and
`_zsh_highlight_highlighter_acme_paint` respectively.
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`:
```zsh
ZSH_HIGHLIGHT_HIGHLIGHTERS+=(acme)
```
* [Write tests](../tests/README.md).
================================================
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](../docs/highlighters.md) for further
information.
================================================
FILE: highlighters/brackets/brackets-highlighter.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2010-2017 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Define default styles.
: ${ZSH_HIGHLIGHT_STYLES[bracket-error]:=fg=red,bold}
: ${ZSH_HIGHLIGHT_STYLES[bracket-level-1]:=fg=blue,bold}
: ${ZSH_HIGHLIGHT_STYLES[bracket-level-2]:=fg=green,bold}
: ${ZSH_HIGHLIGHT_STYLES[bracket-level-3]:=fg=magenta,bold}
: ${ZSH_HIGHLIGHT_STYLES[bracket-level-4]:=fg=yellow,bold}
: ${ZSH_HIGHLIGHT_STYLES[bracket-level-5]:=fg=cyan,bold}
: ${ZSH_HIGHLIGHT_STYLES[cursor-matchingbracket]:=standout}
# Whether the brackets highlighter should be called or not.
_zsh_highlight_highlighter_brackets_predicate()
{
[[ $WIDGET == zle-line-finish ]] || _zsh_highlight_cursor_moved || _zsh_highlight_buffer_modified
}
# Brackets highlighting function.
_zsh_highlight_highlighter_brackets_paint()
{
local char style
local -i bracket_color_size=${#ZSH_HIGHLIGHT_STYLES[(I)bracket-level-*]} buflen=${#BUFFER} level=0 matchingpos pos
local -A levelpos lastoflevel matching
# Find all brackets and remember which one is matching
pos=0
for char in ${(s..)BUFFER} ; do
(( ++pos ))
case $char in
["([{"])
levelpos[$pos]=$((++level))
lastoflevel[$level]=$pos
;;
[")]}"])
if (( level > 0 )); then
matchingpos=$lastoflevel[$level]
levelpos[$pos]=$((level--))
if _zsh_highlight_brackets_match $matchingpos $pos; then
matching[$matchingpos]=$pos
matching[$pos]=$matchingpos
fi
else
levelpos[$pos]=-1
fi
;;
esac
done
# Now highlight all found brackets
for pos in ${(k)levelpos}; do
if (( $+matching[$pos] )); then
if (( bracket_color_size )); then
_zsh_highlight_add_highlight $((pos - 1)) $pos bracket-level-$(( (levelpos[$pos] - 1) % bracket_color_size + 1 ))
fi
else
_zsh_highlight_add_highlight $((pos - 1)) $pos bracket-error
fi
done
# If cursor is on a bracket, then highlight corresponding bracket, if any.
if [[ $WIDGET != zle-line-finish ]]; then
pos=$((CURSOR + 1))
if (( $+levelpos[$pos] )) && (( $+matching[$pos] )); then
local -i otherpos=$matching[$pos]
_zsh_highlight_add_highlight $((otherpos - 1)) $otherpos cursor-matchingbracket
fi
fi
}
# Helper function to differentiate type
_zsh_highlight_brackets_match()
{
case $BUFFER[$1] in
\() [[ $BUFFER[$2] == \) ]];;
\[) [[ $BUFFER[$2] == \] ]];;
\{) [[ $BUFFER[$2] == \} ]];;
*) false;;
esac
}
================================================
FILE: highlighters/brackets/test-data/cursor-matchingbracket-line-finish.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
WIDGET=zle-line-finish
BUFFER=': $foo[bar]'
CURSOR=6 # cursor is zero-based
expected_region_highlight=(
)
================================================
FILE: highlighters/brackets/test-data/cursor-matchingbracket.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
ZSH_HIGHLIGHT_STYLES[bracket-level-3]=
BUFFER=': ((( )))'
CURSOR=2 # cursor is zero-based
expected_region_highlight=(
"3 3 bracket-level-1"
"4 4 bracket-level-2"
"5 5 bracket-level-3"
"7 7 bracket-level-3"
"8 8 bracket-level-2"
"9 9 bracket-level-1"
"9 9 cursor-matchingbracket"
)
================================================
FILE: highlighters/brackets/test-data/empty-styles.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=': (x)'
expected_region_highlight=(
)
================================================
FILE: highlighters/brackets/test-data/loop-styles.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
ZSH_HIGHLIGHT_STYLES[bracket-level-3]=
BUFFER=': ({[({[(x)]})]})'
expected_region_highlight=(
"3 3 bracket-level-1"
"4 4 bracket-level-2"
"5 5 bracket-level-3"
"6 6 bracket-level-1"
"7 7 bracket-level-2"
"8 8 bracket-level-3"
"9 9 bracket-level-1"
"11 11 bracket-level-1"
"12 12 bracket-level-3"
"13 13 bracket-level-2"
"14 14 bracket-level-1"
"15 15 bracket-level-3"
"16 16 bracket-level-2"
"17 17 bracket-level-1"
)
================================================
FILE: highlighters/brackets/test-data/mismatch-patentheses.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
BUFFER='echo ({x}]'
expected_region_highlight=(
"6 6 bracket-error" # (
"7 7 bracket-level-2" # {
"9 9 bracket-level-2" # }
"10 10 bracket-error" # )
)
================================================
FILE: highlighters/brackets/test-data/near-quotes.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
BUFFER=': {"{x}"}'
expected_region_highlight=(
"3 3 bracket-level-1"
"5 5 bracket-level-2"
"7 7 bracket-level-2"
"9 9 bracket-level-1"
)
================================================
FILE: highlighters/brackets/test-data/nested-parentheses.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
ZSH_HIGHLIGHT_STYLES[bracket-level-3]=
BUFFER='echo $(echo ${(z)array})'
expected_region_highlight=(
"7 7 bracket-level-1" # (
"14 14 bracket-level-2" # {
"15 15 bracket-level-3" # (
"17 17 bracket-level-3" # )
"23 23 bracket-level-2" # }
"24 24 bracket-level-1" # )
)
================================================
FILE: highlighters/brackets/test-data/only-error.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2017 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=': x)'
expected_region_highlight=(
"4 4 bracket-error" # )
)
================================================
FILE: highlighters/brackets/test-data/quoted-patentheses.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER='echo "foo ( bar"'
expected_region_highlight=(
"11 11 bracket-error"
)
================================================
FILE: highlighters/brackets/test-data/simple-parentheses.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
BUFFER='echo ({x})'
expected_region_highlight=(
"6 6 bracket-level-1" # (
"7 7 bracket-level-2" # {
"9 9 bracket-level-2" # }
"10 10 bracket-level-1" # )
)
================================================
FILE: highlighters/brackets/test-data/unclosed-patentheses.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
BUFFER='echo ({x}'
expected_region_highlight=(
"6 6 bracket-error" # (
"7 7 bracket-level-2" # {
"9 9 bracket-level-2" # }
)
================================================
FILE: highlighters/brackets/test-data/unclosed-patentheses2.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
unsorted=1
ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
BUFFER='echo {x})'
expected_region_highlight=(
"6 6 bracket-level-1" # {
"8 8 bracket-level-1" # }
"9 9 bracket-error" # )
)
================================================
FILE: highlighters/cursor/cursor-highlighter.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2010-2011 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Define default styles.
: ${ZSH_HIGHLIGHT_STYLES[cursor]:=standout}
# Whether the cursor highlighter should be called or not.
_zsh_highlight_highlighter_cursor_predicate()
{
# remove cursor highlighting when the line is finished
[[ $WIDGET == zle-line-finish ]] || _zsh_highlight_cursor_moved
}
# Cursor highlighting function.
_zsh_highlight_highlighter_cursor_paint()
{
[[ $WIDGET == zle-line-finish ]] && return
_zsh_highlight_add_highlight $CURSOR $(( $CURSOR + 1 )) cursor
}
================================================
FILE: highlighters/line/line-highlighter.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2010-2011 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Define default styles.
: ${ZSH_HIGHLIGHT_STYLES[line]:=}
# Whether the root highlighter should be called or not.
_zsh_highlight_highlighter_line_predicate()
{
_zsh_highlight_buffer_modified
}
# root highlighting function.
_zsh_highlight_highlighter_line_paint()
{
_zsh_highlight_add_highlight 0 $#BUFFER line
}
================================================
FILE: highlighters/main/main-highlighter.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2010-2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Define default styles.
: ${ZSH_HIGHLIGHT_STYLES[default]:=none}
: ${ZSH_HIGHLIGHT_STYLES[unknown-token]:=fg=red,bold}
: ${ZSH_HIGHLIGHT_STYLES[reserved-word]:=fg=yellow}
: ${ZSH_HIGHLIGHT_STYLES[suffix-alias]:=fg=green,underline}
: ${ZSH_HIGHLIGHT_STYLES[global-alias]:=fg=cyan}
: ${ZSH_HIGHLIGHT_STYLES[precommand]:=fg=green,underline}
: ${ZSH_HIGHLIGHT_STYLES[commandseparator]:=none}
: ${ZSH_HIGHLIGHT_STYLES[autodirectory]:=fg=green,underline}
: ${ZSH_HIGHLIGHT_STYLES[path]:=underline}
: ${ZSH_HIGHLIGHT_STYLES[path_pathseparator]:=}
: ${ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=}
: ${ZSH_HIGHLIGHT_STYLES[globbing]:=fg=blue}
: ${ZSH_HIGHLIGHT_STYLES[history-expansion]:=fg=blue}
: ${ZSH_HIGHLIGHT_STYLES[command-substitution]:=none}
: ${ZSH_HIGHLIGHT_STYLES[command-substitution-delimiter]:=fg=magenta}
: ${ZSH_HIGHLIGHT_STYLES[process-substitution]:=none}
: ${ZSH_HIGHLIGHT_STYLES[process-substitution-delimiter]:=fg=magenta}
: ${ZSH_HIGHLIGHT_STYLES[single-hyphen-option]:=none}
: ${ZSH_HIGHLIGHT_STYLES[double-hyphen-option]:=none}
: ${ZSH_HIGHLIGHT_STYLES[back-quoted-argument]:=none}
: ${ZSH_HIGHLIGHT_STYLES[back-quoted-argument-delimiter]:=fg=magenta}
: ${ZSH_HIGHLIGHT_STYLES[single-quoted-argument]:=fg=yellow}
: ${ZSH_HIGHLIGHT_STYLES[double-quoted-argument]:=fg=yellow}
: ${ZSH_HIGHLIGHT_STYLES[dollar-quoted-argument]:=fg=yellow}
: ${ZSH_HIGHLIGHT_STYLES[rc-quote]:=fg=cyan}
: ${ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument]:=fg=cyan}
: ${ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]:=fg=cyan}
: ${ZSH_HIGHLIGHT_STYLES[back-dollar-quoted-argument]:=fg=cyan}
: ${ZSH_HIGHLIGHT_STYLES[assign]:=none}
: ${ZSH_HIGHLIGHT_STYLES[redirection]:=fg=yellow}
: ${ZSH_HIGHLIGHT_STYLES[comment]:=fg=black,bold}
: ${ZSH_HIGHLIGHT_STYLES[named-fd]:=none}
: ${ZSH_HIGHLIGHT_STYLES[numeric-fd]:=none}
: ${ZSH_HIGHLIGHT_STYLES[arg0]:=fg=green}
# Whether the highlighter should be called or not.
_zsh_highlight_highlighter_main_predicate()
{
# may need to remove path_prefix highlighting when the line ends
[[ $WIDGET == zle-line-finish ]] || _zsh_highlight_buffer_modified
}
# Helper to deal with tokens crossing line boundaries.
_zsh_highlight_main_add_region_highlight() {
integer start=$1 end=$2
shift 2
if (( $#in_alias )); then
[[ $1 == unknown-token ]] && alias_style=unknown-token
return
fi
if (( in_param )); then
if [[ $1 == unknown-token ]]; then
param_style=unknown-token
fi
if [[ -n $param_style ]]; then
return
fi
param_style=$1
return
fi
# The calculation was relative to $buf but region_highlight is relative to $BUFFER.
(( start += buf_offset ))
(( end += buf_offset ))
list_highlights+=($start $end $1)
}
_zsh_highlight_main_add_many_region_highlights() {
for 1 2 3; do
_zsh_highlight_main_add_region_highlight $1 $2 $3
done
}
_zsh_highlight_main_calculate_fallback() {
local -A fallback_of; fallback_of=(
alias arg0
suffix-alias arg0
global-alias dollar-double-quoted-argument
builtin arg0
function arg0
command arg0
precommand arg0
hashed-command arg0
autodirectory arg0
arg0_\* arg0
# TODO: Maybe these? —
# named-fd file-descriptor
# numeric-fd file-descriptor
path_prefix path
# The path separator fallback won't ever be used, due to the optimisation
# in _zsh_highlight_main_highlighter_highlight_path_separators().
path_pathseparator path
path_prefix_pathseparator path_prefix
single-quoted-argument{-unclosed,}
double-quoted-argument{-unclosed,}
dollar-quoted-argument{-unclosed,}
back-quoted-argument{-unclosed,}
command-substitution{-quoted,,-unquoted,}
command-substitution-delimiter{-quoted,,-unquoted,}
command-substitution{-delimiter,}
process-substitution{-delimiter,}
back-quoted-argument{-delimiter,}
)
local needle=$1 value
reply=($1)
while [[ -n ${value::=$fallback_of[(k)$needle]} ]]; do
unset "fallback_of[$needle]" # paranoia against infinite loops
reply+=($value)
needle=$value
done
}
# Get the type of a command.
#
# Uses the zsh/parameter module if available to avoid forks, and a
# wrapper around 'type -w' as fallback.
#
# If $2 is 0, do not consider aliases.
#
# The result will be stored in REPLY.
_zsh_highlight_main__type() {
integer -r aliases_allowed=${2-1}
# We won't cache replies of anything that exists as an alias at all, to
# ensure the cached value is correct regardless of $aliases_allowed.
#
# ### We probably _should_ cache them in a cache that's keyed on the value of
# ### $aliases_allowed, on the assumption that aliases are the common case.
integer may_cache=1
# Cache lookup
if (( $+_zsh_highlight_main__command_type_cache )); then
REPLY=$_zsh_highlight_main__command_type_cache[(e)$1]
if [[ -n "$REPLY" ]]; then
return
fi
fi
# Main logic
if (( $#options_to_set )); then
setopt localoptions $options_to_set;
fi
unset REPLY
if zmodload -e zsh/parameter; then
if (( $+aliases[(e)$1] )); then
may_cache=0
fi
if (( ${+galiases[(e)$1]} )) && (( aliases_allowed )); then
REPLY='global alias'
elif (( $+aliases[(e)$1] )) && (( aliases_allowed )); then
REPLY=alias
elif [[ $1 == *.* && -n ${1%.*} ]] && (( $+saliases[(e)${1##*.}] )); then
REPLY='suffix alias'
elif (( $reswords[(Ie)$1] )); then
REPLY=reserved
elif (( $+functions[(e)$1] )); then
REPLY=function
elif (( $+builtins[(e)$1] )); then
REPLY=builtin
elif (( $+commands[(e)$1] )); then
REPLY=command
# None of the special hashes had a match, so fall back to 'type -w', for
# forward compatibility with future versions of zsh that may add new command
# types.
#
# zsh 5.2 and older have a bug whereby running 'type -w ./sudo' implicitly
# runs 'hash ./sudo=/usr/local/bin/./sudo' (assuming /usr/local/bin/sudo
# exists and is in $PATH). Avoid triggering the bug, at the expense of
# falling through to the $() below, incurring a fork. (Issue #354.)
#
# The first disjunct mimics the isrelative() C call from the zsh bug.
elif { [[ $1 != */* ]] || is-at-least 5.3 } &&
# Add a subshell to avoid a zsh upstream bug; see issue #606.
# ### Remove the subshell when we stop supporting zsh 5.7.1 (I assume 5.8 will have the bugfix).
! (builtin type -w -- "$1") >/dev/null 2>&1; then
REPLY=none
fi
fi
if ! (( $+REPLY )); then
# zsh/parameter not available or had no matches.
#
# Note that 'type -w' will run 'rehash' implicitly.
#
# We 'unalias' in a subshell, so the parent shell is not affected.
#
# The colon command is there just to avoid a command substitution that
# starts with an arithmetic expression [«((…))» as the first thing inside
# «$(…)»], which is area that has had some parsing bugs before 5.6
# (approximately).
REPLY="${$(:; (( aliases_allowed )) || unalias -- "$1" 2>/dev/null; LC_ALL=C builtin type -w -- "$1" 2>/dev/null)##*: }"
if [[ $REPLY == 'alias' ]]; then
may_cache=0
fi
fi
# Cache population
if (( may_cache )) && (( $+_zsh_highlight_main__command_type_cache )); then
_zsh_highlight_main__command_type_cache[(e)$1]=$REPLY
fi
[[ -n $REPLY ]]
return $?
}
# Checks whether $1 is something that can be run.
#
# Return 0 if runnable, 1 if not runnable, 2 if trouble.
_zsh_highlight_main__is_runnable() {
if _zsh_highlight_main__type "$1"; then
[[ $REPLY != none ]]
else
return 2
fi
}
# Check whether the first argument is a redirection operator token.
# Report result via the exit code.
_zsh_highlight_main__is_redirection() {
# A redirection operator token:
# - starts with an optional single-digit number;
# - is one of the tokens listed in zshmisc(1)
# - however (z) normalizes ! to |
[[ ${1#[0-9]} == (\<|\<\>|(\>|\>\>)(|\|)|\<\<(|-)|\<\<\<|\<\&|\&\<|(\>|\>\>)\&(|\|)|\&(\>|\>\>)(|\||\!)) ]]
}
# Resolve alias.
#
# Takes a single argument.
#
# The result will be stored in REPLY.
_zsh_highlight_main__resolve_alias() {
if zmodload -e zsh/parameter; then
REPLY=${aliases[$arg]}
else
REPLY="${"$(alias -- $arg)"#*=}"
fi
}
# Return true iff $1 is a global alias
_zsh_highlight_main__is_global_alias() {
if zmodload -e zsh/parameter; then
(( ${+galiases[$arg]} ))
elif [[ $arg == '='* ]]; then
# avoid running into «alias -L '=foo'» erroring out with 'bad assignment'
return 1
else
alias -L -g -- "$1" >/dev/null
fi
}
# Check that the top of $braces_stack has the expected value. If it does, set
# the style according to $2; otherwise, set style=unknown-token.
#
# $1: character expected to be at the top of $braces_stack
# $2: optional assignment to style it if matches
# return value is 0 if there is a match else 1
_zsh_highlight_main__stack_pop() {
if [[ $braces_stack[1] == $1 ]]; then
braces_stack=${braces_stack:1}
if (( $+2 )); then
style=$2
fi
return 0
else
style=unknown-token
return 1
fi
}
# Main syntax highlighting function.
_zsh_highlight_highlighter_main_paint()
{
setopt localoptions extendedglob
# At the PS3 prompt and in vared, highlight nothing.
#
# (We can't check this in _zsh_highlight_highlighter_main_predicate because
# if the predicate returns false, the previous value of region_highlight
# would be reused.)
if [[ $CONTEXT == (select|vared) ]]; then
return
fi
typeset -a ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR
typeset -a ZSH_HIGHLIGHT_TOKENS_CONTROL_FLOW
local -a options_to_set reply # used in callees
local REPLY
# $flags_with_argument is a set of letters, corresponding to the option letters
# that would be followed by a colon in a getopts specification.
local flags_with_argument
# $flags_sans_argument is a set of letters, corresponding to the option letters
# that wouldn't be followed by a colon in a getopts specification.
local flags_sans_argument
# $flags_solo is a set of letters, corresponding to option letters that, if
# present, mean the precommand will not be acting as a precommand, i.e., will
# not be followed by a :start: word.
local flags_solo
# $precommand_options maps precommand name to values of $flags_with_argument,
# $flags_sans_argument, and flags_solo for that precommand, joined by a
# colon. (The value is NOT a getopt(3) spec, although it resembles one.)
#
# Currently, setting $flags_sans_argument is only important for commands that
# have a non-empty $flags_with_argument; see test-data/precommand4.zsh.
local -A precommand_options
precommand_options=(
# Precommand modifiers as of zsh 5.6.2 cf. zshmisc(1).
'-' ''
'builtin' ''
'command' :pvV
'exec' a:cl
'noglob' ''
# 'time' and 'nocorrect' shouldn't be added here; they're reserved words, not precommands.
# miscellaneous commands
'doas' aCu:Lns # as of OpenBSD's doas(1) dated September 4, 2016
'nice' n: # as of current POSIX spec
'pkexec' '' # doesn't take short options; immune to #121 because it's usually not passed --option flags
# Not listed: -h, which has two different meanings.
'sudo' Cgprtu:AEHPSbilns:eKkVv # as of sudo 1.8.21p2
'stdbuf' ioe:
'eatmydata' ''
'catchsegv' ''
'nohup' ''
'setsid' :wc
'env' u:i
'ionice' cn:t:pPu # util-linux 2.33.1-0.1
'strace' IbeaosXPpEuOS:ACdfhikqrtTvVxyDc # strace 4.26-0.2
'proxychains' f:q # proxychains 4.4.0
'torsocks' idq:upaP # Torsocks 2.3.0
'torify' idq:upaP # Torsocks 2.3.0
'ssh-agent' aEPt:csDd:k # As of OpenSSH 8.1p1
'tabbed' gnprtTuU:cdfhs:v # suckless-tools v44
'chronic' :ev # moreutils 0.62-1
'ifne' :n # moreutils 0.62-1
'grc' :se # grc - a "generic colouriser" (that's their spelling, not mine)
'cpulimit' elp:ivz # cpulimit 0.2
'ktrace' fgpt:aBCcdiT
'caffeinate' tw:dimsu # as of macOS's caffeinate(8) dated November 9, 2012
)
# Commands that would need to skip one positional argument:
# flock
# ssh
# _wanted (skip two)
if [[ $zsyh_user_options[ignorebraces] == on || ${zsyh_user_options[ignoreclosebraces]:-off} == on ]]; then
local right_brace_is_recognised_everywhere=false
else
local right_brace_is_recognised_everywhere=true
fi
if [[ $zsyh_user_options[pathdirs] == on ]]; then
options_to_set+=( PATH_DIRS )
fi
ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR=(
'|' '||' ';' '&' '&&'
$'\n' # ${(z)} returns ';' but we convert it to $'\n'
'|&'
'&!' '&|'
# ### 'case' syntax, but followed by a pattern, not by a command
# ';;' ';&' ';|'
)
# Tokens that, at (naively-determined) "command position", are followed by
# a de jure command position. All of these are reserved words.
ZSH_HIGHLIGHT_TOKENS_CONTROL_FLOW=(
$'\x7b' # block
$'\x28' # subshell
'()' # anonymous function
'while'
'until'
'if'
'then'
'elif'
'else'
'do'
'time'
'coproc'
'!' # reserved word; unrelated to $histchars[1]
)
if (( $+X_ZSH_HIGHLIGHT_DIRS_BLACKLIST )); then
print >&2 'zsh-syntax-highlighting: X_ZSH_HIGHLIGHT_DIRS_BLACKLIST is deprecated. Please use ZSH_HIGHLIGHT_DIRS_BLACKLIST.'
ZSH_HIGHLIGHT_DIRS_BLACKLIST=($X_ZSH_HIGHLIGHT_DIRS_BLACKLIST)
unset X_ZSH_HIGHLIGHT_DIRS_BLACKLIST
fi
_zsh_highlight_main_highlighter_highlight_list -$#PREBUFFER '' 1 "$PREBUFFER$BUFFER"
# end is a reserved word
local start end_ style
for start end_ style in $reply; do
(( start >= end_ )) && { print -r -- >&2 "zsh-syntax-highlighting: BUG: _zsh_highlight_highlighter_main_paint: start($start) >= end($end_)"; return }
(( end_ <= 0 )) && continue
(( start < 0 )) && start=0 # having start<0 is normal with e.g. multiline strings
_zsh_highlight_main_calculate_fallback $style
_zsh_highlight_add_highlight $start $end_ $reply
done
}
# Try to expand $1, if it's possible to do so safely.
#
# Uses two parameters from the caller: $parameter_name_pattern and $res.
#
# If expansion was done, set $reply to the expansion and return true.
# Otherwise, return false.
_zsh_highlight_main_highlighter__try_expand_parameter()
{
local arg="$1"
unset reply
{
# ### For now, expand just '$foo' or '${foo}', possibly with braces, but with
# ### no other features of the parameter expansion syntax. (No ${(x)foo},
# ### no ${foo[x]}, no ${foo:-x}.)
{
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
local parameter_name
local -a words
if [[ $arg[1] != '$' ]]; then
return 1
fi
if [[ ${arg[2]} == '{' ]] && [[ ${arg[-1]} == '}' ]]; then
parameter_name=${${arg:2}%?}
else
parameter_name=${arg:1}
fi
if [[ $res == none ]] &&
[[ ${parameter_name} =~ ^${~parameter_name_pattern}$ ]] &&
[[ ${(tP)MATCH} != *special* ]]
then
# Set $arg and update $res.
case ${(tP)MATCH} in
(*array*|*assoc*)
words=( ${(P)MATCH} )
;;
("")
# not set
words=( )
;;
(*)
# scalar, presumably
if [[ $zsyh_user_options[shwordsplit] == on ]]; then
words=( ${(P)=MATCH} )
else
words=( ${(P)MATCH} )
fi
;;
esac
reply=( "${words[@]}" )
else
return 1
fi
}
}
}
# $1 is the offset of $4 from the parent buffer. Added to the returned highlights.
# $2 is the initial braces_stack (for a closing paren).
# $3 is 1 if $4 contains the end of $BUFFER, else 0.
# $4 is the buffer to highlight.
# Returns:
# $REPLY: $buf[REPLY] is the last character parsed.
# $reply is an array of region_highlight additions.
# exit code is 0 if the braces_stack is empty, 1 otherwise.
_zsh_highlight_main_highlighter_highlight_list()
{
integer start_pos end_pos=0 buf_offset=$1 has_end=$3
# alias_style is the style to apply to an alias once $#in_alias == 0
# Usually 'alias' but set to 'unknown-token' if any word expanded from
# the alias would be highlighted as unknown-token
# param_style is analogous for parameter expansions
local alias_style param_style last_arg arg buf=$4 highlight_glob=true saw_assignment=false style
local in_array_assignment=false # true between 'a=(' and the matching ')'
# in_alias is an array of integers with each element equal to the number
# of shifts needed until arg=args[1] pops an arg from the next level up
# alias or from BUFFER.
# in_param is analogous for parameter expansions
integer in_param=0 len=$#buf
local -a in_alias match mbegin mend list_highlights
# seen_alias is a map of aliases already seen to avoid loops like alias a=b b=a
local -A seen_alias
# Pattern for parameter names
readonly parameter_name_pattern='([A-Za-z_][A-Za-z0-9_]*|[0-9]+)'
list_highlights=()
# "R" for round
# "Q" for square
# "Y" for curly
# "T" for [[ ]]
# "S" for $( ), =( ), <( ), >( )
# "D" for do/done
# "$" for 'end' (matches 'foreach' always; also used with cshjunkiequotes in repeat/while)
# "?" for 'if'/'fi'; also checked by 'elif'/'else'
# ":" for 'then'
local braces_stack=$2
# State machine
#
# The states are:
# - :start: Command word
# - :start_of_pipeline: Start of a 'pipeline' as defined in zshmisc(1).
# Only valid when :start: is present
# - :sudo_opt: A leading-dash option to a precommand, whether it takes an
# argument or not. (Example: sudo's "-u" or "-i".)
# - :sudo_arg: The argument to a precommand's leading-dash option,
# when given as a separate word; i.e., "foo" in "-u foo" (two
# words) but not in "-ufoo" (one word).
# Note: :sudo_opt: and :sudo_arg: are used for any precommand
# declared in ${precommand_options}, not just for sudo(8).
# The naming is historical.
# - :regular: "Not a command word", and command delimiters are permitted.
# Mainly used to detect premature termination of commands.
# - :always: The word 'always' in the «{ foo } always { bar }» syntax.
#
# When the kind of a word is not yet known, $this_word / $next_word may contain
# multiple states. For example, after "sudo -i", the next word may be either
# another --flag or a command name, hence the state would include both ':start:'
# and ':sudo_opt:'.
#
# The tokens are always added with both leading and trailing colons to serve as
# word delimiters (an improvised array); [[ $x == *':foo:'* ]] and x=${x//:foo:/}
# will DTRT regardless of how many elements or repetitions $x has.
#
# Handling of redirections: upon seeing a redirection token, we must stall
# the current state --- that is, the value of $this_word --- for two iterations
# (one for the redirection operator, one for the word following it representing
# the redirection target). Therefore, we set $in_redirection to 2 upon seeing a
# redirection operator, decrement it each iteration, and stall the current state
# when it is non-zero. Thus, upon reaching the next word (the one that follows
# the redirection operator and target), $this_word will still contain values
# appropriate for the word immediately following the word that preceded the
# redirection operator.
#
# The "the previous word was a redirection operator" state is not communicated
# to the next iteration via $next_word/$this_word as usual, but via
# $in_redirection. The value of $next_word from the iteration that processed
# the operator is discarded.
#
# $in_redirection is currently used for:
# - comments
# - aliases
# - redirections
# - parameter elision in command position
# - 'repeat' loops
#
local this_word next_word=':start::start_of_pipeline:'
integer in_redirection
# Processing buffer
local proc_buf="$buf"
local -a args
if [[ $zsyh_user_options[interactivecomments] == on ]]; then
args=(${(zZ+c+)buf})
else
args=(${(z)buf})
fi
# Special case: $(<*) isn't globbing.
if [[ $braces_stack == 'S' ]] && (( $+args[3] && ! $+args[4] )) && [[ $args[3] == $'\x29' ]] &&
[[ $args[1] == *'<'* ]] && _zsh_highlight_main__is_redirection $args[1]; then
highlight_glob=false
fi
while (( $#args )); do
last_arg=$arg
arg=$args[1]
shift args
if (( $#in_alias )); then
(( in_alias[1]-- ))
# Remove leading 0 entries
in_alias=($in_alias[$in_alias[(i)<1->],-1])
if (( $#in_alias == 0 )); then
seen_alias=()
# start_pos and end_pos are of the alias (previous $arg) here
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style
else
# We can't unset keys that contain special characters (] \ and some others).
# More details: https://www.zsh.org/workers/43269
(){
local alias_name
for alias_name in ${(k)seen_alias[(R)<$#in_alias->]}; do
seen_alias=("${(@kv)seen_alias[(I)^$alias_name]}")
done
}
fi
fi
if (( in_param )); then
(( in_param-- ))
if (( in_param == 0 )); then
# start_pos and end_pos are of the '$foo' word (previous $arg) here
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $param_style
param_style=""
fi
fi
# Initialize this_word and next_word.
if (( in_redirection == 0 )); then
this_word=$next_word
next_word=':regular:'
elif (( !in_param )); then
# Stall $next_word.
(( --in_redirection ))
fi
# Initialize per-"simple command" [zshmisc(1)] variables:
#
# $style how to highlight $arg
# $in_array_assignment boolean flag for "between '(' and ')' of array assignment"
# $highlight_glob boolean flag for "'noglob' is in effect"
# $saw_assignment boolean flag for "was preceded by an assignment"
#
style=unknown-token
if [[ $this_word == *':start:'* ]]; then
in_array_assignment=false
if [[ $arg == 'noglob' ]]; then
highlight_glob=false
fi
fi
if (( $#in_alias == 0 && in_param == 0 )); then
# Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
[[ "$proc_buf" = (#b)(#s)(''([ $'\t']|[\\]$'\n')#)(?|)* ]]
# The first, outer parenthesis
integer offset="${#match[1]}"
(( start_pos = end_pos + offset ))
(( end_pos = start_pos + $#arg ))
# The zsh lexer considers ';' and newline to be the same token, so
# ${(z)} converts all newlines to semicolons. Convert them back here to
# make later processing simpler.
[[ $arg == ';' && ${match[3]} == $'\n' ]] && arg=$'\n'
# Compute the new $proc_buf. We advance it
# (chop off characters from the beginning)
# beyond what end_pos points to, by skipping
# as many characters as end_pos was advanced.
#
# end_pos was advanced by $offset (via start_pos)
# and by $#arg. Note the `start_pos=$end_pos`
# below.
#
# As for the [,len]. We could use [,len-start_pos+offset]
# here, but to make it easier on eyes, we use len and
# rely on the fact that Zsh simply handles that. The
# length of proc_buf is len-start_pos+offset because
# we're chopping it to match current start_pos, so its
# length matches the previous value of start_pos.
#
# Why [,-1] is slower than [,length] isn't clear.
proc_buf="${proc_buf[offset + $#arg + 1,len]}"
fi
# Handle the INTERACTIVE_COMMENTS option.
#
# We use the (Z+c+) flag so the entire comment is presented as one token in $arg.
if [[ $zsyh_user_options[interactivecomments] == on && $arg[1] == $histchars[3] ]]; then
if [[ $this_word == *(':regular:'|':start:')* ]]; then
style=comment
else
style=unknown-token # prematurely terminated
fi
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $style
# Stall this arg
in_redirection=1
continue
fi
if [[ $this_word == *':start:'* ]] && ! (( in_redirection )); then
# Expand aliases.
# An alias is ineligible for expansion while it's being expanded (see #652/#653).
_zsh_highlight_main__type "$arg" "$(( ! ${+seen_alias[$arg]} ))"
local res="$REPLY"
if [[ $res == "alias" ]]; then
# Mark insane aliases as unknown-token (cf. #263).
if [[ $arg == ?*=* ]]; then
_zsh_highlight_main_add_region_highlight $start_pos $end_pos unknown-token
continue
fi
seen_alias[$arg]=$#in_alias
_zsh_highlight_main__resolve_alias $arg
local -a alias_args
# Elision is desired in case alias x=''
if [[ $zsyh_user_options[interactivecomments] == on ]]; then
alias_args=(${(zZ+c+)REPLY})
else
alias_args=(${(z)REPLY})
fi
args=( $alias_args $args )
if (( $#in_alias == 0 )); then
alias_style=alias
else
# Transfer the count of this arg to the new element about to be appended.
(( in_alias[1]-- ))
fi
# Add one because we will in_alias[1]-- on the next loop iteration so
# this iteration should be considered in in_alias as well
in_alias=( $(($#alias_args + 1)) $in_alias )
(( in_redirection++ )) # Stall this arg
continue
else
_zsh_highlight_main_highlighter_expand_path $arg
_zsh_highlight_main__type "$REPLY" 0
res="$REPLY"
fi
fi
# Analyse the current word.
if _zsh_highlight_main__is_redirection $arg ; then
if (( in_redirection == 1 )); then
# Two consecutive redirection operators is an error.
_zsh_highlight_main_add_region_highlight $start_pos $end_pos unknown-token
else
in_redirection=2
_zsh_highlight_main_add_region_highlight $start_pos $end_pos redirection
fi
continue
elif [[ $arg == '{'${~parameter_name_pattern}'}' ]] && _zsh_highlight_main__is_redirection $args[1]; then
# named file descriptor: {foo}>&2
in_redirection=3
_zsh_highlight_main_add_region_highlight $start_pos $end_pos named-fd
continue
fi
# Expand parameters.
if (( ! in_param )) && _zsh_highlight_main_highlighter__try_expand_parameter "$arg"; then
# That's not entirely correct --- if the parameter's value happens to be a reserved
# word, the parameter expansion will be highlighted as a reserved word --- but that
# incorrectness is outweighed by the usability improvement of permitting the use of
# parameters that refer to commands, functions, and builtins.
() {
local -a words; words=( "${reply[@]}" )
if (( $#words == 0 )) && (( ! in_redirection )); then
# Parameter elision is happening
(( ++in_redirection ))
_zsh_highlight_main_add_region_highlight $start_pos $end_pos comment
continue
else
(( in_param = 1 + $#words ))
args=( $words $args )
arg=$args[1]
_zsh_highlight_main__type "$arg" 0
res=$REPLY
fi
}
fi
# Parse the sudo command line
if (( ! in_redirection )); then
if [[ $this_word == *':sudo_opt:'* ]]; then
if [[ -n $flags_with_argument ]] &&
{
# Trenary
if [[ -n $flags_sans_argument ]]
then [[ $arg == '-'[$flags_sans_argument]#[$flags_with_argument] ]]
else [[ $arg == '-'[$flags_with_argument] ]]
fi
} then
# Flag that requires an argument
this_word=${this_word//:start:/}
next_word=':sudo_arg:'
elif [[ -n $flags_with_argument ]] &&
{
# Trenary
if [[ -n $flags_sans_argument ]]
then [[ $arg == '-'[$flags_sans_argument]#[$flags_with_argument]* ]]
else [[ $arg == '-'[$flags_with_argument]* ]]
fi
} then
# Argument attached in the same word
this_word=${this_word//:start:/}
next_word+=':start:'
next_word+=':sudo_opt:'
elif [[ -n $flags_sans_argument ]] &&
[[ $arg == '-'[$flags_sans_argument]# ]]; then
# Flag that requires no argument
this_word=':sudo_opt:'
next_word+=':start:'
next_word+=':sudo_opt:'
elif [[ -n $flags_solo ]] &&
{
# Trenary
if [[ -n $flags_sans_argument ]]
then [[ $arg == '-'[$flags_sans_argument]#[$flags_solo]* ]]
else [[ $arg == '-'[$flags_solo]* ]]
fi
} then
# Solo flags
this_word=':sudo_opt:'
next_word=':regular:' # no :start:, nor :sudo_opt: since we don't know whether the solo flag takes an argument or not
elif [[ $arg == '-'* ]]; then
# Unknown flag. We don't know whether it takes an argument or not,
# so modify $next_word as we do for flags that require no argument.
# With that behaviour, if the flag in fact takes no argument we'll
# highlight the inner command word correctly, and if it does take an
# argument we'll highlight the command word correctly if the argument
# was given in the same shell word as the flag (as in '-uphy1729' or
# '--user=phy1729' without spaces).
this_word=':sudo_opt:'
next_word+=':start:'
next_word+=':sudo_opt:'
else
# Not an option flag; nothing to do. (If the command line is
# syntactically valid, ${this_word//:sudo_opt:/} should be
# non-empty now.)
this_word=${this_word//:sudo_opt:/}
fi
elif [[ $this_word == *':sudo_arg:'* ]]; then
next_word+=':sudo_opt:'
next_word+=':start:'
fi
fi
# The Great Fork: is this a command word? Is this a non-command word?
if [[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR:#"$arg"} ]] &&
[[ $braces_stack != *T* || $arg != ('||'|'&&') ]]; then
# First, determine the style of the command separator itself.
if _zsh_highlight_main__stack_pop T || _zsh_highlight_main__stack_pop Q; then
# Missing closing square bracket(s)
style=unknown-token
elif $in_array_assignment; then
case $arg in
# Literal newlines are just fine.
($'\n') style=commandseparator;;
# Semicolons are parsed the same way as literal newlines. Nevertheless,
# highlight them as errors since they're probably unintended. Compare
# issue #691.
(';') style=unknown-token;;
# Other command separators aren't allowed.
(*) style=unknown-token;;
esac
elif [[ $this_word == *':regular:'* ]]; then
style=commandseparator
elif [[ $this_word == *':start:'* ]] && [[ $arg == $'\n' ]]; then
style=commandseparator
elif [[ $this_word == *':start:'* ]] && [[ $arg == ';' ]] && (( $#in_alias )); then
style=commandseparator
else
# Empty commands (semicolon follows nothing) are valid syntax.
# However, in interactive use they are likely to be erroneous;
# therefore, we highlight them as errors.
#
# Alias definitions are exempted from this check to allow multiline aliases
# with explicit (redundant) semicolons: «alias foo=$'bar;\nbaz'» (issue #677).
#
# See also #691 about possibly changing the style used here.
style=unknown-token
fi
# Second, determine the style of next_word.
if [[ $arg == $'\n' ]] && $in_array_assignment; then
# literal newline inside an array assignment
next_word=':regular:'
elif [[ $arg == ';' ]] && $in_array_assignment; then
# literal semicolon inside an array assignment
next_word=':regular:'
else
next_word=':start:'
highlight_glob=true
saw_assignment=false
(){
local alias_name
for alias_name in ${(k)seen_alias[(R)<$#in_alias->]}; do
# We can't unset keys that contain special characters (] \ and some others).
# More details: https://www.zsh.org/workers/43269
seen_alias=("${(@kv)seen_alias[(I)^$alias_name]}")
done
}
if [[ $arg != '|' && $arg != '|&' ]]; then
next_word+=':start_of_pipeline:'
fi
fi
elif ! (( in_redirection)) && [[ $this_word == *':always:'* && $arg == 'always' ]]; then
# try-always construct
style=reserved-word # de facto a reserved word, although not de jure
highlight_glob=true
saw_assignment=false
next_word=':start::start_of_pipeline:' # only left brace is allowed, apparently
elif ! (( in_redirection)) && [[ $this_word == *':start:'* ]]; then # $arg is the command word
if (( ${+precommand_options[$arg]} )) && _zsh_highlight_main__is_runnable $arg; then
style=precommand
() {
set -- "${(@s.:.)precommand_options[$arg]}"
flags_with_argument=$1
flags_sans_argument=$2
flags_solo=$3
}
next_word=${next_word//:regular:/}
next_word+=':sudo_opt:'
next_word+=':start:'
if [[ $arg == 'exec' || $arg == 'env' ]]; then
# To allow "exec 2>&1;" and "env | grep" where there's no command word
next_word+=':regular:'
fi
else
case $res in
(reserved) # reserved word
style=reserved-word
# Match braces and handle special cases.
case $arg in
(time|nocorrect)
next_word=${next_word//:regular:/}
next_word+=':start:'
;;
($'\x7b')
braces_stack='Y'"$braces_stack"
;;
($'\x7d')
# We're at command word, so no need to check $right_brace_is_recognised_everywhere
_zsh_highlight_main__stack_pop 'Y' reserved-word
if [[ $style == reserved-word ]]; then
next_word+=':always:'
fi
;;
($'\x5b\x5b')
braces_stack='T'"$braces_stack"
;;
('do')
braces_stack='D'"$braces_stack"
;;
('done')
_zsh_highlight_main__stack_pop 'D' reserved-word
;;
('if')
braces_stack=':?'"$braces_stack"
;;
('then')
_zsh_highlight_main__stack_pop ':' reserved-word
;;
('elif')
if [[ ${braces_stack[1]} == '?' ]]; then
braces_stack=':'"$braces_stack"
else
style=unknown-token
fi
;;
('else')
if [[ ${braces_stack[1]} == '?' ]]; then
:
else
style=unknown-token
fi
;;
('fi')
_zsh_highlight_main__stack_pop '?'
;;
('foreach')
braces_stack='$'"$braces_stack"
;;
('end')
_zsh_highlight_main__stack_pop '$' reserved-word
;;
('repeat')
# skip the repeat-count word
in_redirection=2
# The redirection mechanism assumes $this_word describes the word
# following the redirection. Make it so.
#
# That word can be a command word with shortloops (`repeat 2 ls`)
# or a command separator (`repeat 2; ls` or `repeat 2; do ls; done`).
#
# The repeat-count word will be handled like a redirection target.
this_word=':start::regular:'
;;
('!')
if [[ $this_word != *':start_of_pipeline:'* ]]; then
style=unknown-token
else
# '!' reserved word at start of pipeline; style already set above
fi
;;
esac
if $saw_assignment && [[ $style != unknown-token ]]; then
style=unknown-token
fi
;;
('suffix alias')
style=suffix-alias
;;
('global alias')
style=global-alias
;;
(alias) :;;
(builtin) style=builtin
[[ $arg == $'\x5b' ]] && braces_stack='Q'"$braces_stack"
;;
(function) style=function;;
(command) style=command;;
(hashed) style=hashed-command;;
(none) if (( ! in_param )) && _zsh_highlight_main_highlighter_check_assign; then
_zsh_highlight_main_add_region_highlight $start_pos $end_pos assign
local i=$(( arg[(i)=] + 1 ))
saw_assignment=true
if [[ $arg[i] == '(' ]]; then
in_array_assignment=true
_zsh_highlight_main_add_region_highlight start_pos+i-1 start_pos+i reserved-word
else
# assignment to a scalar parameter.
# (For array assignments, the command doesn't start until the ")" token.)
#
# Discard :start_of_pipeline:, if present, as '!' is not valid
# after assignments.
next_word+=':start:'
if (( i <= $#arg )); then
() {
local highlight_glob=false
[[ $zsyh_user_options[globassign] == on ]] && highlight_glob=true
_zsh_highlight_main_highlighter_highlight_argument $i
}
fi
fi
continue
elif (( ! in_param )) &&
[[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
style=history-expansion
elif (( ! in_param )) &&
[[ $arg[0,1] == $histchars[2,2] ]]; then
style=history-expansion
elif (( ! in_param )) &&
! $saw_assignment &&
[[ $arg[1,2] == '((' ]]; then
# Arithmetic evaluation.
#
# Note: prior to zsh-5.1.1-52-g4bed2cf (workers/36669), the ${(z)...}
# splitter would only output the '((' token if the matching '))' had
# been typed. Therefore, under those versions of zsh, BUFFER="(( 42"
# would be highlighted as an error until the matching "))" are typed.
#
# We highlight just the opening parentheses, as a reserved word; this
# is how [[ ... ]] is highlighted, too.
_zsh_highlight_main_add_region_highlight $start_pos $((start_pos + 2)) reserved-word
if [[ $arg[-2,-1] == '))' ]]; then
_zsh_highlight_main_add_region_highlight $((end_pos - 2)) $end_pos reserved-word
fi
continue
elif (( ! in_param )) &&
[[ $arg == '()' ]]; then
# anonymous function
style=reserved-word
elif (( ! in_param )) &&
! $saw_assignment &&
[[ $arg == $'\x28' ]]; then
# subshell
style=reserved-word
braces_stack='R'"$braces_stack"
elif (( ! in_param )) &&
[[ $arg == $'\x29' ]]; then
# end of subshell or command substitution
if _zsh_highlight_main__stack_pop 'S'; then
REPLY=$start_pos
reply=($list_highlights)
return 0
fi
_zsh_highlight_main__stack_pop 'R' reserved-word
else
if _zsh_highlight_main_highlighter_check_path $arg 1; then
style=$REPLY
else
style=unknown-token
fi
fi
;;
(*) _zsh_highlight_main_add_region_highlight $start_pos $end_pos arg0_$res
continue
;;
esac
fi
if [[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_CONTROL_FLOW:#"$arg"} ]]; then
next_word=':start::start_of_pipeline:'
fi
elif _zsh_highlight_main__is_global_alias "$arg"; then # $arg is a global alias that isn't in command position
style=global-alias
else # $arg is a non-command word
case $arg in
($'\x29')
# subshell or end of array assignment
if $in_array_assignment; then
_zsh_highlight_main_add_region_highlight $start_pos $end_pos assign
_zsh_highlight_main_add_region_highlight $start_pos $end_pos reserved-word
in_array_assignment=false
next_word+=':start:'
continue
elif (( in_redirection )); then
style=unknown-token
else
if _zsh_highlight_main__stack_pop 'S'; then
REPLY=$start_pos
reply=($list_highlights)
return 0
fi
_zsh_highlight_main__stack_pop 'R' reserved-word
fi
;;
($'\x28\x29')
# possibly a function definition
if (( in_redirection )) || $in_array_assignment; then
style=unknown-token
else
if [[ $zsyh_user_options[multifuncdef] == on ]] || false # TODO: or if the previous word was a command word
then
next_word+=':start::start_of_pipeline:'
fi
style=reserved-word
fi
;;
(*) if false; then
elif [[ $arg = $'\x7d' ]] && $right_brace_is_recognised_everywhere; then
# Parsing rule: {
#
# Additionally, `tt(})' is recognized in any position if neither the
# tt(IGNORE_BRACES) option nor the tt(IGNORE_CLOSE_BRACES) option is set.
if (( in_redirection )) || $in_array_assignment; then
style=unknown-token
else
_zsh_highlight_main__stack_pop 'Y' reserved-word
if [[ $style == reserved-word ]]; then
next_word+=':always:'
fi
fi
elif [[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
style=history-expansion
elif [[ $arg == $'\x5d\x5d' ]] && _zsh_highlight_main__stack_pop 'T' reserved-word; then
:
elif [[ $arg == $'\x5d' ]] && _zsh_highlight_main__stack_pop 'Q' builtin; then
:
else
_zsh_highlight_main_highlighter_highlight_argument 1 $(( 1 != in_redirection ))
continue
fi
;;
esac
fi
_zsh_highlight_main_add_region_highlight $start_pos $end_pos $style
done
(( $#in_alias )) && in_alias=() _zsh_highlight_main_add_region_highlight $start_pos $end_pos $alias_style
(( in_param == 1 )) && in_param=0 _zsh_highlight_main_add_region_highlight $start_pos $end_pos $param_style
[[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\$'\n')#) ]]
REPLY=$(( end_pos + ${#match[1]} - 1 ))
reply=($list_highlights)
return $(( $#braces_stack > 0 ))
}
# Check if $arg is variable assignment
_zsh_highlight_main_highlighter_check_assign()
{
setopt localoptions extended_glob
[[ $arg == [[:alpha:]_][[:alnum:]_]#(|\[*\])(|[+])=* ]] ||
[[ $arg == [0-9]##(|[+])=* ]]
}
_zsh_highlight_main_highlighter_highlight_path_separators()
{
local pos style_pathsep
style_pathsep=$1_pathseparator
reply=()
[[ -z "$ZSH_HIGHLIGHT_STYLES[$style_pathsep]" || "$ZSH_HIGHLIGHT_STYLES[$1]" == "$ZSH_HIGHLIGHT_STYLES[$style_pathsep]" ]] && return 0
for (( pos = start_pos; $pos <= end_pos; pos++ )) ; do
if [[ $BUFFER[pos] == / ]]; then
reply+=($((pos - 1)) $pos $style_pathsep)
fi
done
}
# Check if $1 is a path.
# If yes, return 0 and in $REPLY the style to use.
# Else, return non-zero (and the contents of $REPLY is undefined).
#
# $2 should be non-zero iff we're in command position.
_zsh_highlight_main_highlighter_check_path()
{
_zsh_highlight_main_highlighter_expand_path "$1"
local expanded_path="$REPLY" tmp_path
integer in_command_position=$2
if [[ $zsyh_user_options[autocd] == on ]]; then
integer autocd=1
else
integer autocd=0
fi
if (( in_command_position )); then
# ### Currently, this value is never returned: either it's overwritten
# ### below, or the return code is non-zero
REPLY=arg0
else
REPLY=path
fi
if [[ ${1[1]} == '=' && $1 == ??* && ${1[2]} != $'\x28' && $zsyh_user_options[equals] == 'on' && $expanded_path[1] != '/' ]]; then
REPLY=unknown-token # will error out if executed
return 0
fi
[[ -z $expanded_path ]] && return 1
# Check if this is a blacklisted path
if [[ $expanded_path[1] == / ]]; then
tmp_path=$expanded_path
else
tmp_path=$PWD/$expanded_path
fi
tmp_path=$tmp_path:a
while [[ $tmp_path != / ]]; do
[[ -n ${(M)ZSH_HIGHLIGHT_DIRS_BLACKLIST:#$tmp_path} ]] && return 1
tmp_path=$tmp_path:h
done
if (( in_command_position )); then
if [[ -x $expanded_path ]]; then
if (( autocd )); then
if [[ -d $expanded_path ]]; then
REPLY=autodirectory
fi
return 0
elif [[ ! -d $expanded_path ]]; then
# ### This seems unreachable for the current callers
return 0
fi
fi
else
if [[ -L $expanded_path || -e $expanded_path ]]; then
return 0
fi
fi
# Search the path in CDPATH
if [[ $expanded_path != /* ]] && (( autocd || ! in_command_position )); then
# TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here.
local cdpath_dir
for cdpath_dir in $cdpath ; do
if [[ -d "$cdpath_dir/$expanded_path" && -x "$cdpath_dir/$expanded_path" ]]; then
if (( in_command_position && autocd )); then
REPLY=autodirectory
fi
return 0
fi
done
fi
# If dirname($1) doesn't exist, neither does $1.
[[ ! -d ${expanded_path:h} ]] && return 1
# If this word ends the buffer, check if it's the prefix of a valid path.
if (( has_end && (len == end_pos) )) &&
(( ! $#in_alias )) &&
[[ $WIDGET != zle-line-finish ]]; then
# TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here.
local -a tmp
if (( in_command_position )); then
# We include directories even when autocd is enabled, because those
# directories might contain executable files: e.g., BUFFER="/bi" en route
# to typing "/bin/sh".
tmp=( ${expanded_path}*(N-*,N-/) )
else
tmp=( ${expanded_path}*(N) )
fi
(( ${+tmp[1]} )) && REPLY=path_prefix && return 0
fi
# It's not a path.
return 1
}
# Highlight an argument and possibly special chars in quotes starting at $1 in $arg
# This command will at least highlight $1 to end_pos with the default style
# If $2 is set to 0, the argument cannot be highlighted as an option.
#
# This function currently assumes it's never called for the command word.
_zsh_highlight_main_highlighter_highlight_argument()
{
local base_style=default i=$1 option_eligible=${2:-1} path_eligible=1 ret start style
local -a highlights
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
case "$arg[i]" in
'%')
if [[ $arg[i+1] == '?' ]]; then
(( i += 2 ))
fi
;;
'-')
if (( option_eligible )); then
if [[ $arg[i+1] == - ]]; then
base_style=double-hyphen-option
else
base_style=single-hyphen-option
fi
path_eligible=0
fi
;;
'=')
if [[ $arg[i+1] == $'\x28' ]]; then
(( i += 2 ))
_zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
highlights+=(
$(( start_pos + $1 - 1 )) $(( start_pos + i )) process-substitution
$(( start_pos + $1 - 1 )) $(( start_pos + $1 + 1 )) process-substitution-delimiter
$reply
)
if (( ret == 0 )); then
highlights+=($(( start_pos + i - 1 )) $(( start_pos + i )) process-substitution-delimiter)
fi
fi
esac
# This loop is a hot path. Keep it fast!
(( --i ))
while (( ++i <= $#arg )); do
i=${arg[(ib.i.)[\\\'\"\`\$\<\>\*\?]]}
case "$arg[$i]" in
"") break;;
"\\") (( i += 1 )); continue;;
"'")
_zsh_highlight_main_highlighter_highlight_single_quote $i
(( i = REPLY ))
highlights+=($reply)
;;
'"')
_zsh_highlight_main_highlighter_highlight_double_quote $i
(( i = REPLY ))
highlights+=($reply)
;;
'`')
_zsh_highlight_main_highlighter_highlight_backtick $i
(( i = REPLY ))
highlights+=($reply)
;;
'$')
if [[ $arg[i+1] != "'" ]]; then
path_eligible=0
fi
if [[ $arg[i+1] == "'" ]]; then
_zsh_highlight_main_highlighter_highlight_dollar_quote $i
(( i = REPLY ))
highlights+=($reply)
continue
elif [[ $arg[i+1] == $'\x28' ]]; then
if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
# Arithmetic expansion
(( i = REPLY ))
highlights+=($reply)
continue
fi
start=$i
(( i += 2 ))
_zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
highlights+=(
$(( start_pos + start - 1)) $(( start_pos + i )) command-substitution-unquoted
$(( start_pos + start - 1)) $(( start_pos + start + 1)) command-substitution-delimiter-unquoted
$reply
)
if (( ret == 0 )); then
highlights+=($(( start_pos + i - 1)) $(( start_pos + i )) command-substitution-delimiter-unquoted)
fi
continue
fi
while [[ $arg[i+1] == [=~#+'^'] ]]; do
(( i += 1 ))
done
if [[ $arg[i+1] == [*@#?$!-] ]]; then
(( i += 1 ))
fi;;
[\<\>])
if [[ $arg[i+1] == $'\x28' ]]; then # \x28 = open paren
start=$i
(( i += 2 ))
_zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
highlights+=(
$(( start_pos + start - 1)) $(( start_pos + i )) process-substitution
$(( start_pos + start - 1)) $(( start_pos + start + 1 )) process-substitution-delimiter
$reply
)
if (( ret == 0 )); then
highlights+=($(( start_pos + i - 1)) $(( start_pos + i )) process-substitution-delimiter)
fi
continue
fi
;|
*)
if $highlight_glob &&
[[ $zsyh_user_options[multios] == on || $in_redirection -eq 0 ]] &&
[[ ${arg[$i]} =~ ^[*?] || ${arg:$i-1} =~ ^\<[0-9]*-[0-9]*\> ]]; then
highlights+=($(( start_pos + i - 1 )) $(( start_pos + i + $#MATCH - 1)) globbing)
(( i += $#MATCH - 1 ))
path_eligible=0
else
continue
fi
;;
esac
done
if (( path_eligible )); then
if (( in_redirection )) && [[ $last_arg == *['<>']['&'] && $arg[$1,-1] == (<0->|p|-) ]]; then
if [[ $arg[$1,-1] == (p|-) ]]; then
base_style=redirection
else
base_style=numeric-fd
fi
# This function is currently never called for the command word, so $2 is hard-coded as 0.
elif _zsh_highlight_main_highlighter_check_path $arg[$1,-1] 0; then
base_style=$REPLY
_zsh_highlight_main_highlighter_highlight_path_separators $base_style
highlights+=($reply)
fi
fi
highlights=($(( start_pos + $1 - 1 )) $end_pos $base_style $highlights)
_zsh_highlight_main_add_many_region_highlights $highlights
}
# Quote Helper Functions
#
# $arg is expected to be set to the current argument
# $start_pos is expected to be set to the start of $arg in $BUFFER
# $1 is the index in $arg which starts the quote
# $REPLY is returned as the end of quote index in $arg
# $reply is returned as an array of region_highlight additions
# Highlight single-quoted strings
_zsh_highlight_main_highlighter_highlight_single_quote()
{
local arg1=$1 i q=\' style
i=$arg[(ib:arg1+1:)$q]
reply=()
if [[ $zsyh_user_options[rcquotes] == on ]]; then
while [[ $arg[i+1] == "'" ]]; do
reply+=($(( start_pos + i - 1 )) $(( start_pos + i + 1 )) rc-quote)
(( i++ ))
i=$arg[(ib:i+1:)$q]
done
fi
if [[ $arg[i] == "'" ]]; then
style=single-quoted-argument
else
# If unclosed, i points past the end
(( i-- ))
style=single-quoted-argument-unclosed
fi
reply=($(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style $reply)
REPLY=$i
}
# Highlight special chars inside double-quoted strings
_zsh_highlight_main_highlighter_highlight_double_quote()
{
local -a breaks match mbegin mend saved_reply
local MATCH; integer last_break=$(( start_pos + $1 - 1 )) MBEGIN MEND
local i j k ret style
reply=()
for (( i = $1 + 1 ; i <= $#arg ; i += 1 )) ; do
(( j = i + start_pos - 1 ))
(( k = j + 1 ))
case "$arg[$i]" in
('"') break;;
('`') saved_reply=($reply)
_zsh_highlight_main_highlighter_highlight_backtick $i
(( i = REPLY ))
reply=($saved_reply $reply)
continue
;;
('$') style=dollar-double-quoted-argument
# Look for an alphanumeric parameter name.
if [[ ${arg:$i} =~ ^([A-Za-z_][A-Za-z0-9_]*|[0-9]+) ]] ; then
(( k += $#MATCH )) # highlight the parameter name
(( i += $#MATCH )) # skip past it
elif [[ ${arg:$i} =~ ^[{]([A-Za-z_][A-Za-z0-9_]*|[0-9]+)[}] ]] ; then
(( k += $#MATCH )) # highlight the parameter name and braces
(( i += $#MATCH )) # skip past it
elif [[ $arg[i+1] == '$' ]]; then
# $$ - pid
(( k += 1 )) # highlight both dollar signs
(( i += 1 )) # don't consider the second one as introducing another parameter expansion
elif [[ $arg[i+1] == [-#*@?] ]]; then
# $#, $*, $@, $?, $- - like $$ above
(( k += 1 )) # highlight both dollar signs
(( i += 1 )) # don't consider the second one as introducing another parameter expansion
elif [[ $arg[i+1] == $'\x28' ]]; then
saved_reply=($reply)
if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
# Arithmetic expansion
(( i = REPLY ))
reply=($saved_reply $reply)
continue
fi
breaks+=( $last_break $(( start_pos + i - 1 )) )
(( i += 2 ))
_zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
last_break=$(( start_pos + i ))
reply=(
$saved_reply
$j $(( start_pos + i )) command-substitution-quoted
$j $(( j + 2 )) command-substitution-delimiter-quoted
$reply
)
if (( ret == 0 )); then
reply+=($(( start_pos + i - 1 )) $(( start_pos + i )) command-substitution-delimiter-quoted)
fi
continue
else
continue
fi
;;
"\\") style=back-double-quoted-argument
if [[ \\\`\"\$${histchars[1]} == *$arg[$i+1]* ]]; then
(( k += 1 )) # Color following char too.
(( i += 1 )) # Skip parsing the escaped char.
else
continue
fi
;;
($histchars[1]) # ! - may be a history expansion
if [[ $arg[i+1] != ('='|$'\x28'|$'\x7b'|[[:blank:]]) ]]; then
style=history-expansion
else
continue
fi
;;
*) continue ;;
esac
reply+=($j $k $style)
done
if [[ $arg[i] == '"' ]]; then
style=double-quoted-argument
else
# If unclosed, i points past the end
(( i-- ))
style=double-quoted-argument-unclosed
fi
(( last_break != start_pos + i )) && breaks+=( $last_break $(( start_pos + i )) )
saved_reply=($reply)
reply=()
for 1 2 in $breaks; do
(( $1 != $2 )) && reply+=($1 $2 $style)
done
reply+=($saved_reply)
REPLY=$i
}
# Highlight special chars inside dollar-quoted strings
_zsh_highlight_main_highlighter_highlight_dollar_quote()
{
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
local i j k style
local AA
integer c
reply=()
for (( i = $1 + 2 ; i <= $#arg ; i += 1 )) ; do
(( j = i + start_pos - 1 ))
(( k = j + 1 ))
case "$arg[$i]" in
"'") break;;
"\\") style=back-dollar-quoted-argument
for (( c = i + 1 ; c <= $#arg ; c += 1 )); do
[[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break
done
AA=$arg[$i+1,$c-1]
# Matching for HEX and OCT values like \0xA6, \xA6 or \012
if [[ "$AA" =~ "^(x|X)[0-9a-fA-F]{1,2}"
|| "$AA" =~ "^[0-7]{1,3}"
|| "$AA" =~ "^u[0-9a-fA-F]{1,4}"
|| "$AA" =~ "^U[0-9a-fA-F]{1,8}"
]]; then
(( k += $#MATCH ))
(( i += $#MATCH ))
else
if (( $#arg > $i+1 )) && [[ $arg[$i+1] == [xXuU] ]]; then
# \x not followed by hex digits is probably an error
style=unknown-token
fi
(( k += 1 )) # Color following char too.
(( i += 1 )) # Skip parsing the escaped char.
fi
;;
*) continue ;;
esac
reply+=($j $k $style)
done
if [[ $arg[i] == "'" ]]; then
style=dollar-quoted-argument
else
# If unclosed, i points past the end
(( i-- ))
style=dollar-quoted-argument-unclosed
fi
reply=($(( start_pos + $1 - 1 )) $(( start_pos + i )) $style $reply)
REPLY=$i
}
# Highlight backtick substitutions
_zsh_highlight_main_highlighter_highlight_backtick()
{
# buf is the contents of the backticks with a layer of backslashes removed.
# last is the index of arg for the start of the string to be copied into buf.
# It is either one past the beginning backtick or one past the last backslash.
# offset is a count of consumed \ (the delta between buf and arg).
# offsets is an array indexed by buf offset of when the delta between buf and arg changes.
# It is sparse, so search backwards to the last value
local buf highlight style=back-quoted-argument-unclosed style_end
local -i arg1=$1 end_ i=$1 last offset=0 start subshell_has_end=0
local -a highlight_zone highlights offsets
reply=()
last=$(( arg1 + 1 ))
# Remove one layer of backslashes and find the end
while i=$arg[(ib:i+1:)[\\\\\`]]; do # find the next \ or `
if (( i > $#arg )); then
buf=$buf$arg[last,i]
offsets[i-arg1-offset]='' # So we never index past the end
(( i-- ))
subshell_has_end=$(( has_end && (start_pos + i == len) ))
break
fi
if [[ $arg[i] == '\' ]]; then
(( i++ ))
# POSIX XCU 2.6.3
if [[ $arg[i] == ('$'|'`'|'\') ]]; then
buf=$buf$arg[last,i-2]
(( offset++ ))
# offsets is relative to buf, so adjust by -arg1
offsets[i-arg1-offset]=$offset
else
buf=$buf$arg[last,i-1]
fi
else # it's an unquoted ` and this is the end
style=back-quoted-argument
style_end=back-quoted-argument-delimiter
buf=$buf$arg[last,i-1]
offsets[i-arg1-offset]='' # So we never index past the end
break
fi
last=$i
done
_zsh_highlight_main_highlighter_highlight_list 0 '' $subshell_has_end $buf
# Munge the reply to account for removed backslashes
for start end_ highlight in $reply; do
start=$(( start_pos + arg1 + start + offsets[(Rb:start:)?*] ))
end_=$(( start_pos + arg1 + end_ + offsets[(Rb:end_:)?*] ))
highlights+=($start $end_ $highlight)
if [[ $highlight == back-quoted-argument-unclosed && $style == back-quoted-argument ]]; then
# An inner backtick command substitution is unclosed, but this level is closed
style_end=unknown-token
fi
done
reply=(
$(( start_pos + arg1 - 1 )) $(( start_pos + i )) $style
$(( start_pos + arg1 - 1 )) $(( start_pos + arg1 )) back-quoted-argument-delimiter
$highlights
)
if (( $#style_end )); then
reply+=($(( start_pos + i - 1)) $(( start_pos + i )) $style_end)
fi
REPLY=$i
}
# Highlight special chars inside arithmetic expansions
_zsh_highlight_main_highlighter_highlight_arithmetic()
{
local -a saved_reply
local style
integer i j k paren_depth ret
reply=()
for (( i = $1 + 3 ; i <= end_pos - start_pos ; i += 1 )) ; do
(( j = i + start_pos - 1 ))
(( k = j + 1 ))
case "$arg[$i]" in
[\'\"\\@{}])
style=unknown-token
;;
'(')
(( paren_depth++ ))
continue
;;
')')
if (( paren_depth )); then
(( paren_depth-- ))
continue
fi
[[ $arg[i+1] == ')' ]] && { (( i++ )); break; }
# Special case ) at the end of the buffer to avoid flashing command substitution for a character
(( has_end && (len == k) )) && break
# This is a single paren and there are no open parens, so this isn't an arithmetic expansion
return 1
;;
'`')
saved_reply=($reply)
_zsh_highlight_main_highlighter_highlight_backtick $i
(( i = REPLY ))
reply=($saved_reply $reply)
continue
;;
'$' )
if [[ $arg[i+1] == $'\x28' ]]; then
saved_reply=($reply)
if [[ $arg[i+2] == $'\x28' ]] && _zsh_highlight_main_highlighter_highlight_arithmetic $i; then
# Arithmetic expansion
(( i = REPLY ))
reply=($saved_reply $reply)
continue
fi
(( i += 2 ))
_zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,end_pos]
ret=$?
(( i += REPLY ))
reply=(
$saved_reply
$j $(( start_pos + i )) command-substitution-quoted
$j $(( j + 2 )) command-substitution-delimiter-quoted
$reply
)
if (( ret == 0 )); then
reply+=($(( start_pos + i - 1 )) $(( start_pos + i )) command-substitution-delimiter)
fi
continue
else
continue
fi
;;
($histchars[1]) # ! - may be a history expansion
if [[ $arg[i+1] != ('='|$'\x28'|$'\x7b'|[[:blank:]]) ]]; then
style=history-expansion
else
continue
fi
;;
*)
continue
;;
esac
reply+=($j $k $style)
done
if [[ $arg[i] != ')' ]]; then
# If unclosed, i points past the end
(( i-- ))
fi
style=arithmetic-expansion
reply=($(( start_pos + $1 - 1)) $(( start_pos + i )) arithmetic-expansion $reply)
REPLY=$i
}
# Called with a single positional argument.
# Perform filename expansion (tilde expansion) on the argument and set $REPLY to the expanded value.
#
# Does not perform filename generation (globbing).
_zsh_highlight_main_highlighter_expand_path()
{
(( $# == 1 )) || print -r -- >&2 "zsh-syntax-highlighting: BUG: _zsh_highlight_main_highlighter_expand_path: called without argument"
# The $~1 syntax normally performs filename generation, but not when it's on the right-hand side of ${x:=y}.
setopt localoptions nonomatch
unset REPLY
: ${REPLY:=${(Q)${~1}}}
}
# -------------------------------------------------------------------------------------------------
# Main highlighter initialization
# -------------------------------------------------------------------------------------------------
_zsh_highlight_main__precmd_hook() {
# Unset the WARN_NESTED_VAR option, taking care not to error if the option
# doesn't exist (zsh older than zsh-5.3.1-test-2).
setopt localoptions
if eval '[[ -o warnnestedvar ]]' 2>/dev/null; then
unsetopt warnnestedvar
fi
_zsh_highlight_main__command_type_cache=()
}
autoload -Uz add-zsh-hook
if add-zsh-hook precmd _zsh_highlight_main__precmd_hook 2>/dev/null; then
# Initialize command type cache
typeset -gA _zsh_highlight_main__command_type_cache
else
print -r -- >&2 'zsh-syntax-highlighting: Failed to load add-zsh-hook. Some speed optimizations will not be used.'
# Make sure the cache is unset
unset _zsh_highlight_main__command_type_cache
fi
typeset -ga ZSH_HIGHLIGHT_DIRS_BLACKLIST
================================================
FILE: highlighters/main/test-data/abspath-in-command-position1.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=$'/'
expected_region_highlight=(
'1 1 path_prefix' # /
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position1b.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
setopt autocd
BUFFER=$'/'
expected_region_highlight=(
'1 1 autodirectory' # /
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position2.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=$'/bi'
expected_region_highlight=(
'1 3 path_prefix' # /bi
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position3.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=$'/bin; /bin'
expected_region_highlight=(
'1 4 unknown-token' # /bin (in middle)
'5 5 commandseparator' # ;
'7 10 path_prefix' # /bin (at end)
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position3b.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
setopt autocd
BUFFER=$'/bin; /bin'
expected_region_highlight=(
'1 4 autodirectory' # /bin (in middle)
'5 5 commandseparator' # ;
'7 10 autodirectory' # /bin (at end)
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position4.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=$'/bin/s'
expected_region_highlight=(
'1 6 path_prefix' # /bin/s
)
================================================
FILE: highlighters/main/test-data/abspath-in-command-position5.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2020 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
BUFFER=$'/bin/sh'
expected_region_highlight=(
'1 7 command' # /bin/sh
)
================================================
FILE: highlighters/main/test-data/alias-assignment1.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Issue #263 (more-pathological case): aliases[x=y]=z works; the ${(z)} splitter considers
# that a single word; but it's not looked up as an alias. Hence, highlight it as an error.
aliases[x=y]='lorem ipsum dolor sit amet'
BUFFER='x=y ls'
expected_region_highlight=(
"1 3 unknown-token" # x=y
"5 6 default" # ls
)
================================================
FILE: highlighters/main/test-data/alias-basic.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2015 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
alias foo="echo hello world"
BUFFER="foo"
expected_region_highlight+=(
"1 3 alias" # foo
)
================================================
FILE: highlighters/main/test-data/alias-brackets.zsh
================================================
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2021 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Have to use cat here as it must be a command that exists.
# Otherwise, the test would fail with the first token being recognized
# as an "unknown-token".
alias ]=cat
BUFFER='] /'
expected_region_highlight=(
'1 1 alias' # ]
'3 3 path' # /
)
================================================
FILE: highlighters/main/test-data/alias-command-substitution.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2019 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# Alias must be at least 4 characters to test the regression
# cf. 139ea2b189819c43cc251825981c116959b15cc3
alias foobar='echo "$(echo foobar)"'
BUFFER='foobar'
expected_region_highlight=(
"1 6 alias" # foobar
)
================================================
FILE: highlighters/main/test-data/alias-comment1.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
# see alias-comment2.zsh and comment-followed.zsh
setopt interactivecomments
alias x=$'# foo\npwd'
BUFFER='x'
expected_region_highlight=(
'1 1 alias' # x
)
================================================
FILE: highlighters/main/test-data/alias-comment2.zsh
================================================
# -------------------------------------------------------------------------------------------------
# Copyright (c) 2016 zsh-syntax-highlighting contributors
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
gitextract_ggwn6lie/ ├── .editorconfig ├── .gitattributes ├── .github/ │ └── workflows/ │ └── test.yml ├── .gitignore ├── .revision-hash ├── .version ├── COPYING.md ├── HACKING.md ├── INSTALL.md ├── Makefile ├── README.md ├── changelog.md ├── docs/ │ ├── highlighters/ │ │ ├── brackets.md │ │ ├── cursor.md │ │ ├── line.md │ │ ├── main.md │ │ ├── pattern.md │ │ ├── regexp.md │ │ └── root.md │ └── highlighters.md ├── highlighters/ │ ├── README.md │ ├── brackets/ │ │ ├── brackets-highlighter.zsh │ │ └── test-data/ │ │ ├── cursor-matchingbracket-line-finish.zsh │ │ ├── cursor-matchingbracket.zsh │ │ ├── empty-styles.zsh │ │ ├── loop-styles.zsh │ │ ├── mismatch-patentheses.zsh │ │ ├── near-quotes.zsh │ │ ├── nested-parentheses.zsh │ │ ├── only-error.zsh │ │ ├── quoted-patentheses.zsh │ │ ├── simple-parentheses.zsh │ │ ├── unclosed-patentheses.zsh │ │ └── unclosed-patentheses2.zsh │ ├── cursor/ │ │ └── cursor-highlighter.zsh │ ├── line/ │ │ └── line-highlighter.zsh │ ├── main/ │ │ ├── main-highlighter.zsh │ │ └── test-data/ │ │ ├── abspath-in-command-position1.zsh │ │ ├── abspath-in-command-position1b.zsh │ │ ├── abspath-in-command-position2.zsh │ │ ├── abspath-in-command-position3.zsh │ │ ├── abspath-in-command-position3b.zsh │ │ ├── abspath-in-command-position4.zsh │ │ ├── abspath-in-command-position5.zsh │ │ ├── alias-assignment1.zsh │ │ ├── alias-basic.zsh │ │ ├── alias-brackets.zsh │ │ ├── alias-command-substitution.zsh │ │ ├── alias-comment1.zsh │ │ ├── alias-comment2.zsh │ │ ├── alias-complex.zsh │ │ ├── alias-empty.zsh │ │ ├── alias-eponymous1.zsh │ │ ├── alias-eponymous2.zsh │ │ ├── alias-in-cmdsubst.zsh │ │ ├── alias-loop.zsh │ │ ├── alias-loop2.zsh │ │ ├── alias-nested-precommand.zsh │ │ ├── alias-nested.zsh │ │ ├── alias-parameter.zsh │ │ ├── alias-precommand-option-argument1.zsh │ │ ├── alias-precommand-option-argument2.zsh │ │ ├── alias-precommand-option-argument3.zsh │ │ ├── alias-precommand-option-argument4.zsh │ │ ├── alias-quoted.zsh │ │ ├── alias-redirect.zsh │ │ ├── alias-reuse1.zsh │ │ ├── alias-reuse2.zsh │ │ ├── alias-reuse3.zsh │ │ ├── alias-reuse4.zsh │ │ ├── alias-reuse5.zsh │ │ ├── alias-self.zsh │ │ ├── alias-self2.zsh │ │ ├── alias-to-dir.zsh │ │ ├── alias-to-dir1b.zsh │ │ ├── alias-unknown-token1.zsh │ │ ├── alias-unknown-token2.zsh │ │ ├── alias.zsh │ │ ├── always1.zsh │ │ ├── always2.zsh │ │ ├── always3.zsh │ │ ├── anonymous-function.zsh │ │ ├── arg0-colon.zsh │ │ ├── arith-cmdsubst-mess.zsh │ │ ├── arith1.zsh │ │ ├── arith2.zsh │ │ ├── arithmetic-command-substitution.zsh │ │ ├── arithmetic-doubled-parens.zsh │ │ ├── arithmetic-empty.zsh │ │ ├── arithmetic-evaluation.zsh │ │ ├── arithmetic-hist-expn.zsh │ │ ├── arithmetic-invalid-chars.zsh │ │ ├── arithmetic-multiplication.zsh │ │ ├── arithmetic-nested.zsh │ │ ├── arithmetic-quoted.zsh │ │ ├── arithmetic-unclosed.zsh │ │ ├── arithmetic-unfinished.zsh │ │ ├── array-cmdsep1.zsh │ │ ├── array-cmdsep2.zsh │ │ ├── array-cmdsep3.zsh │ │ ├── assign-append.zsh │ │ ├── assign-argv.zsh │ │ ├── assign-array.zsh │ │ ├── assign-array2.zsh │ │ ├── assign-array3.zsh │ │ ├── assign-invalid-command.zsh │ │ ├── assign-not-array.zsh │ │ ├── assign-not-array2.zsh │ │ ├── assign-quoted-cmdsubst.zsh │ │ ├── assign-semicolon.zsh │ │ ├── assign-subshell.zsh │ │ ├── assign-value-quote1.zsh │ │ ├── assign-value-quote2.zsh │ │ ├── assign.zsh │ │ ├── assignment-before-resword1.zsh │ │ ├── assignment-before-resword2.zsh │ │ ├── assignment-before-resword3.zsh │ │ ├── assignment-before-resword4.zsh │ │ ├── assignment-before-resword5.zsh │ │ ├── assignment-quoted.zsh │ │ ├── back-quoted-argument.zsh │ │ ├── back-quoted-open.zsh │ │ ├── backslash-continuation.zsh │ │ ├── backslash-continuation2.zsh │ │ ├── backslash-space.zsh │ │ ├── backslash.zsh │ │ ├── bang-assign-array.zsh │ │ ├── bang-assign-scalar.zsh │ │ ├── bang-pipeline.zsh │ │ ├── block-assignment-no-command.zsh │ │ ├── braces1.zsh │ │ ├── braces2.zsh │ │ ├── brackets-matching1.zsh │ │ ├── brackets-matching2.zsh │ │ ├── brackets-mismatch1.zsh │ │ ├── brackets-mismatch10-if-negative.zsh │ │ ├── brackets-mismatch2.zsh │ │ ├── brackets-mismatch3.zsh │ │ ├── brackets-mismatch4.zsh │ │ ├── brackets-mismatch5.zsh │ │ ├── brackets-mismatch6.zsh │ │ ├── brackets-mismatch7.zsh │ │ ├── brackets-mismatch8-if-positive.zsh │ │ ├── brackets-mismatch8.zsh │ │ ├── brackets-mismatch9-if-positive.zsh │ │ ├── brackets-premature-termination.zsh │ │ ├── cdpath-abspath.zsh │ │ ├── cmdpos-elision-partial.zsh │ │ ├── command-substitution-adjacent.zsh │ │ ├── command-substitution-in-assignment.zsh │ │ ├── command-substitution-unclosed.zsh │ │ ├── commandseparator.zsh │ │ ├── comment-followed.zsh │ │ ├── comment-leading.zsh │ │ ├── comment-off.zsh │ │ ├── comments.zsh │ │ ├── commmand-parameter.zsh │ │ ├── control-flow.zsh │ │ ├── control-flow2.zsh │ │ ├── control-flow3.zsh │ │ ├── cthulhu.zsh │ │ ├── dinbrack1.zsh │ │ ├── dirs_blacklist.zsh │ │ ├── dollar-dollar.zsh │ │ ├── dollar-noise.zsh │ │ ├── dollar-paren.zsh │ │ ├── dollar-quoted.zsh │ │ ├── dollar-quoted2.zsh │ │ ├── dollar-quoted3.zsh │ │ ├── double-hyphen-option.zsh │ │ ├── double-quoted.zsh │ │ ├── double-quoted2.zsh │ │ ├── double-quoted3.zsh │ │ ├── double-quoted4.zsh │ │ ├── empty-command-newline.zsh │ │ ├── empty-command.zsh │ │ ├── empty-command2.zsh │ │ ├── empty-line.zsh │ │ ├── equals1.zsh │ │ ├── equals2.zsh │ │ ├── equals3.zsh │ │ ├── equals4.zsh │ │ ├── escaped-single-quote.zsh │ │ ├── exec-redirection1.zsh │ │ ├── fd-target-not-filename.zsh │ │ ├── function-altsyntax.zsh │ │ ├── function-named1.zsh │ │ ├── function-named2.zsh │ │ ├── function.zsh │ │ ├── glob.zsh │ │ ├── global-alias1.zsh │ │ ├── globs-with-quoting.zsh │ │ ├── hashed-command.zsh │ │ ├── history-double-quoted-escaped.zsh │ │ ├── history-double-quoted-followed.zsh │ │ ├── history-double-quoted-no.zsh │ │ ├── history-double-quoted-unescaped.zsh │ │ ├── history-double-quoted-yes.zsh │ │ ├── history-expansion.zsh │ │ ├── history-expansion2.zsh │ │ ├── inheritance.zsh │ │ ├── jobsubst-isnt-glob.zsh │ │ ├── jobsubst-isnt-glob2.zsh │ │ ├── loop-newline.zsh │ │ ├── meta-no-eval1.zsh │ │ ├── meta-no-eval2.zsh │ │ ├── multiline-array-assignment1.zsh │ │ ├── multiline-string.zsh │ │ ├── multiline-string2.zsh │ │ ├── multios-negates-globbing.zsh │ │ ├── multios-negates-globbing2.zsh │ │ ├── multiple-quotes.zsh │ │ ├── multiple-redirections.zsh │ │ ├── noglob-alias.zsh │ │ ├── noglob-always.zsh │ │ ├── noglob1.zsh │ │ ├── noglob2.zsh │ │ ├── noglob3.zsh │ │ ├── noglob4.zsh │ │ ├── null-exec.zsh │ │ ├── null-exec2-printenv.zsh │ │ ├── number_range-glob.zsh │ │ ├── off-by-one.zsh │ │ ├── opt-shwordsplit1.zsh │ │ ├── optimized-cmdsubst-input.zsh │ │ ├── option-dollar-quote-isnt-filename.zsh │ │ ├── option-path_dirs.zsh │ │ ├── option-with-quotes.zsh │ │ ├── order-path-after-dollar.zsh │ │ ├── order-path-before-globbing.zsh │ │ ├── param-positional-in-array-append.zsh │ │ ├── param-precommand-option-argument1.zsh │ │ ├── param-precommand-option-argument3.zsh │ │ ├── parameter-elision-command-word.zsh │ │ ├── parameter-expansion-shwordsplit.zsh │ │ ├── parameter-expansion-untokenized1.zsh │ │ ├── parameter-expansion-untokenized2.zsh │ │ ├── parameter-star.zsh │ │ ├── parameter-to-global-alias.zsh │ │ ├── parameter-value-contains-command-position1.zsh │ │ ├── parameter-value-contains-command-position2.zsh │ │ ├── pasted-quotes.zsh │ │ ├── path-broken-symlink.zsh │ │ ├── path-dollared-word.zsh │ │ ├── path-dollared-word2.zsh │ │ ├── path-dollared-word3.zsh │ │ ├── path-dollared-word3b.zsh │ │ ├── path-dollared-word4.zsh │ │ ├── path-mixed-quoting.zsh │ │ ├── path-separators.zsh │ │ ├── path-separators2.zsh │ │ ├── path-space.zsh │ │ ├── path-tilde-home.zsh │ │ ├── path-tilde-home2.zsh │ │ ├── path-tilde-home3.zsh │ │ ├── path-tilde-named.zsh │ │ ├── path.zsh │ │ ├── path_prefix.zsh │ │ ├── path_prefix2.zsh │ │ ├── path_prefix3.zsh │ │ ├── plain-file-in-command-position.zsh │ │ ├── precommand-killing1.zsh │ │ ├── precommand-killing2.zsh │ │ ├── precommand-then-assignment.zsh │ │ ├── precommand-type1.zsh │ │ ├── precommand-type2.zsh │ │ ├── precommand-type3.zsh │ │ ├── precommand-uninstalled.zsh │ │ ├── precommand-unknown-option.zsh │ │ ├── precommand.zsh │ │ ├── precommand2.zsh │ │ ├── precommand3.zsh │ │ ├── precommand4.zsh │ │ ├── prefix-redirection.zsh │ │ ├── process-substitution-after-redirection.zsh │ │ ├── process-substitution-redirection-isnt-globbing.zsh │ │ ├── process-substitution.zsh │ │ ├── process-substitution2.zsh │ │ ├── quoted-command-substitution-empty.zsh │ │ ├── quoted-redirection-in-command-word.zsh │ │ ├── rc-quotes.zsh │ │ ├── redirection-all.zsh │ │ ├── redirection-comment.zsh │ │ ├── redirection-from-param.zsh │ │ ├── redirection-in-cmdsubst.zsh │ │ ├── redirection-inhibits-elision.zsh │ │ ├── redirection-is-not-option.zsh │ │ ├── redirection-special-cases.zsh │ │ ├── redirection.zsh │ │ ├── redirection2.zsh │ │ ├── redirection3.zsh │ │ ├── reserved-word.zsh │ │ ├── simple-command.zsh │ │ ├── simple-redirection.zsh │ │ ├── subshell.zsh │ │ ├── sudo-command.zsh │ │ ├── sudo-comment.zsh │ │ ├── sudo-longopt.zsh │ │ ├── sudo-redirection.zsh │ │ ├── sudo-redirection2.zsh │ │ ├── sudo-redirection3.zsh │ │ ├── tilde-command-word.zsh │ │ ├── time-and-nocorrect1.zsh │ │ ├── time-and-nocorrect2.zsh │ │ ├── unbackslash.zsh │ │ ├── unknown-command.zsh │ │ ├── vanilla-newline.zsh │ │ └── vi-linewise-mode.zsh │ ├── pattern/ │ │ ├── pattern-highlighter.zsh │ │ └── test-data/ │ │ └── rm-rf.zsh │ ├── regexp/ │ │ ├── regexp-highlighter.zsh │ │ └── test-data/ │ │ ├── complex.zsh │ │ ├── subexpression.zsh │ │ └── word-boundary.zsh │ └── root/ │ └── root-highlighter.zsh ├── release.md ├── tests/ │ ├── README.md │ ├── edit-failed-tests │ ├── generate.zsh │ ├── tap-colorizer.zsh │ ├── tap-filter │ ├── test-highlighting.zsh │ ├── test-perfs.zsh │ └── test-zprof.zsh ├── zsh-syntax-highlighting.plugin.zsh └── zsh-syntax-highlighting.zsh
Condensed preview — 326 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (900K chars).
[
{
"path": ".editorconfig",
"chars": 181,
"preview": "# Top-most editorconfig file\n\nroot = true\n\n[*]\nend_of_line = lf\ntab_width = 2\nindent_size = 2\nindent_style = space\n\n[M"
},
{
"path": ".gitattributes",
"chars": 28,
"preview": ".revision-hash export-subst\n"
},
{
"path": ".github/workflows/test.yml",
"chars": 1534,
"preview": "---\nname: Tests\non:\n push:\n paths-ignore:\n - '**.md'\n - '**.png'\n pull_request:\n paths-ignore:\n -"
},
{
"path": ".gitignore",
"chars": 24,
"preview": "*.zwc*\n.pc/\ndocs/all.md\n"
},
{
"path": ".revision-hash",
"chars": 12,
"preview": "$Format:%H$\n"
},
{
"path": ".version",
"chars": 10,
"preview": "0.8.1-dev\n"
},
{
"path": "COPYING.md",
"chars": 1544,
"preview": "Copyright (c) 2010-2020 zsh-syntax-highlighting contributors\nAll rights reserved.\n\nRedistribution and use in source and "
},
{
"path": "HACKING.md",
"chars": 2658,
"preview": "Hacking on zsh-syntax-highlighting itself\n=========================================\n\nThis document includes information "
},
{
"path": "INSTALL.md",
"chars": 6568,
"preview": "How to install\n--------------\n\n### Using packages\n\nFirst, install the package:\n\n* Arch Linux: [community/zsh-syntax-high"
},
{
"path": "Makefile",
"chars": 1941,
"preview": "NAME=zsh-syntax-highlighting\n\nINSTALL?=install -c\nPREFIX?=/usr/local\nSHARE_DIR?=$(DESTDIR)$(PREFIX)/share/$(NAME)\nDOC_DI"
},
{
"path": "README.md",
"chars": 3779,
"preview": "zsh-syntax-highlighting [![Build Status][build-status-image]][build-status]\n=======================\n\n**[Fish shell][fish"
},
{
"path": "changelog.md",
"chars": 23810,
"preview": "# Changes in HEAD\n\n\n- Highlight `&>` `>&|` `>&!` `&>|` and `&>!` as redirection.\n [#942]\n\n\n# Changes in 0.8.0\n\nThis is "
},
{
"path": "docs/highlighters/brackets.md",
"chars": 1140,
"preview": "zsh-syntax-highlighting / highlighters / brackets\n-------------------------------------------------\n\nThis is the `bracke"
},
{
"path": "docs/highlighters/cursor.md",
"chars": 762,
"preview": "zsh-syntax-highlighting / highlighters / cursor\n-----------------------------------------------\n\nThis is the `cursor` hi"
},
{
"path": "docs/highlighters/line.md",
"chars": 740,
"preview": "zsh-syntax-highlighting / highlighters / line\n---------------------------------------------\n\nThis is the `line` highligh"
},
{
"path": "docs/highlighters/main.md",
"chars": 5860,
"preview": "zsh-syntax-highlighting / highlighters / main\n---------------------------------------------\n\nThis is the `main` highligh"
},
{
"path": "docs/highlighters/pattern.md",
"chars": 831,
"preview": "zsh-syntax-highlighting / highlighters / pattern\n------------------------------------------------\n\nThis is the `pattern`"
},
{
"path": "docs/highlighters/regexp.md",
"chars": 2584,
"preview": "zsh-syntax-highlighting / highlighters / regexp\n------------------------------------------------\n\nThis is the `regexp` h"
},
{
"path": "docs/highlighters/root.md",
"chars": 799,
"preview": "zsh-syntax-highlighting / highlighters / root\n---------------------------------------------\n\nThis is the `root` highligh"
},
{
"path": "docs/highlighters.md",
"chars": 4740,
"preview": "zsh-syntax-highlighting / highlighters\n======================================\n\nSyntax highlighting is done by pluggable "
},
{
"path": "highlighters/README.md",
"chars": 308,
"preview": "zsh-syntax-highlighting / highlighters\n======================================\n\nNavigate into the individual highlighters"
},
{
"path": "highlighters/brackets/brackets-highlighter.zsh",
"chars": 4436,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2010"
},
{
"path": "highlighters/brackets/test-data/cursor-matchingbracket-line-finish.zsh",
"chars": 2101,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/brackets/test-data/cursor-matchingbracket.zsh",
"chars": 2380,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/brackets/test-data/empty-styles.zsh",
"chars": 2039,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/brackets/test-data/loop-styles.zsh",
"chars": 2545,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/brackets/test-data/mismatch-patentheses.zsh",
"chars": 2251,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/brackets/test-data/near-quotes.zsh",
"chars": 2230,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/brackets/test-data/nested-parentheses.zsh",
"chars": 2368,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/brackets/test-data/only-error.zsh",
"chars": 2064,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2017"
},
{
"path": "highlighters/brackets/test-data/quoted-patentheses.zsh",
"chars": 2072,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/brackets/test-data/simple-parentheses.zsh",
"chars": 2255,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/brackets/test-data/unclosed-patentheses.zsh",
"chars": 2222,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/brackets/test-data/unclosed-patentheses2.zsh",
"chars": 2182,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/cursor/cursor-highlighter.zsh",
"chars": 2492,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2010"
},
{
"path": "highlighters/line/line-highlighter.zsh",
"chars": 2318,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2010"
},
{
"path": "highlighters/main/main-highlighter.zsh",
"chars": 69900,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2010"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position1.zsh",
"chars": 2079,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position1b.zsh",
"chars": 2095,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position2.zsh",
"chars": 2083,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position3.zsh",
"chars": 2171,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position3b.zsh",
"chars": 2187,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position4.zsh",
"chars": 2089,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/abspath-in-command-position5.zsh",
"chars": 2087,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-assignment1.zsh",
"chars": 2314,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/alias-basic.zsh",
"chars": 2087,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/alias-brackets.zsh",
"chars": 2260,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-command-substitution.zsh",
"chars": 2208,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2019"
},
{
"path": "highlighters/main/test-data/alias-comment1.zsh",
"chars": 2152,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/alias-comment2.zsh",
"chars": 2142,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/alias-complex.zsh",
"chars": 2135,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/alias-empty.zsh",
"chars": 2120,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/alias-eponymous1.zsh",
"chars": 2078,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2019"
},
{
"path": "highlighters/main/test-data/alias-eponymous2.zsh",
"chars": 2086,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2019"
},
{
"path": "highlighters/main/test-data/alias-in-cmdsubst.zsh",
"chars": 2341,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-loop.zsh",
"chars": 2373,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-loop2.zsh",
"chars": 2070,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/alias-nested-precommand.zsh",
"chars": 2257,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-nested.zsh",
"chars": 2165,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-parameter.zsh",
"chars": 2133,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-precommand-option-argument1.zsh",
"chars": 2284,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-precommand-option-argument2.zsh",
"chars": 2267,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-precommand-option-argument3.zsh",
"chars": 2253,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-precommand-option-argument4.zsh",
"chars": 2236,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-quoted.zsh",
"chars": 2189,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-redirect.zsh",
"chars": 2147,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/alias-reuse1.zsh",
"chars": 2144,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-reuse2.zsh",
"chars": 2147,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-reuse3.zsh",
"chars": 2142,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-reuse4.zsh",
"chars": 2290,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-reuse5.zsh",
"chars": 2291,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-self.zsh",
"chars": 2127,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-self2.zsh",
"chars": 2099,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-to-dir.zsh",
"chars": 2095,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-to-dir1b.zsh",
"chars": 2097,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-unknown-token1.zsh",
"chars": 2098,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias-unknown-token2.zsh",
"chars": 2113,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/alias.zsh",
"chars": 2781,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/always1.zsh",
"chars": 2259,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/always2.zsh",
"chars": 2322,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/always3.zsh",
"chars": 2283,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/anonymous-function.zsh",
"chars": 2396,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/arg0-colon.zsh",
"chars": 2092,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arith-cmdsubst-mess.zsh",
"chars": 2465,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arith1.zsh",
"chars": 2165,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arith2.zsh",
"chars": 2218,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-command-substitution.zsh",
"chars": 2380,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-doubled-parens.zsh",
"chars": 2168,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-empty.zsh",
"chars": 2244,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-evaluation.zsh",
"chars": 2344,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/arithmetic-hist-expn.zsh",
"chars": 2202,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-invalid-chars.zsh",
"chars": 2244,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-multiplication.zsh",
"chars": 2237,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-nested.zsh",
"chars": 2243,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-quoted.zsh",
"chars": 2218,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-unclosed.zsh",
"chars": 2142,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/arithmetic-unfinished.zsh",
"chars": 2282,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/array-cmdsep1.zsh",
"chars": 2551,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/array-cmdsep2.zsh",
"chars": 2289,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/array-cmdsep3.zsh",
"chars": 2242,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assign-append.zsh",
"chars": 2197,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/assign-argv.zsh",
"chars": 2151,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/assign-array.zsh",
"chars": 2251,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/assign-array2.zsh",
"chars": 2221,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/assign-array3.zsh",
"chars": 2247,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/assign-invalid-command.zsh",
"chars": 2151,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assign-not-array.zsh",
"chars": 2131,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/assign-not-array2.zsh",
"chars": 2112,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/assign-quoted-cmdsubst.zsh",
"chars": 2447,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assign-semicolon.zsh",
"chars": 2200,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/assign-subshell.zsh",
"chars": 2132,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/assign-value-quote1.zsh",
"chars": 2169,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assign-value-quote2.zsh",
"chars": 2182,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assign.zsh",
"chars": 2277,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/assignment-before-resword1.zsh",
"chars": 2222,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assignment-before-resword2.zsh",
"chars": 2222,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assignment-before-resword3.zsh",
"chars": 2153,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assignment-before-resword4.zsh",
"chars": 2238,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assignment-before-resword5.zsh",
"chars": 2162,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/assignment-quoted.zsh",
"chars": 2149,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/back-quoted-argument.zsh",
"chars": 3009,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/back-quoted-open.zsh",
"chars": 2253,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/backslash-continuation.zsh",
"chars": 2134,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/backslash-continuation2.zsh",
"chars": 2199,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/backslash-space.zsh",
"chars": 2220,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/backslash.zsh",
"chars": 2064,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/bang-assign-array.zsh",
"chars": 2271,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/bang-assign-scalar.zsh",
"chars": 2164,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/bang-pipeline.zsh",
"chars": 2194,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/block-assignment-no-command.zsh",
"chars": 2170,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/braces1.zsh",
"chars": 2253,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/braces2.zsh",
"chars": 2246,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-matching1.zsh",
"chars": 2177,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-matching2.zsh",
"chars": 2161,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch1.zsh",
"chars": 2196,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch10-if-negative.zsh",
"chars": 2304,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch2.zsh",
"chars": 2196,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch3.zsh",
"chars": 2108,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch4.zsh",
"chars": 2108,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch5.zsh",
"chars": 2130,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch6.zsh",
"chars": 2232,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch7.zsh",
"chars": 2363,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch8-if-positive.zsh",
"chars": 2654,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch8.zsh",
"chars": 2160,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-mismatch9-if-positive.zsh",
"chars": 2300,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/brackets-premature-termination.zsh",
"chars": 2230,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/cdpath-abspath.zsh",
"chars": 2122,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/cmdpos-elision-partial.zsh",
"chars": 2412,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/command-substitution-adjacent.zsh",
"chars": 2527,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/command-substitution-in-assignment.zsh",
"chars": 2366,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/command-substitution-unclosed.zsh",
"chars": 2482,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/commandseparator.zsh",
"chars": 2170,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/comment-followed.zsh",
"chars": 2195,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/comment-leading.zsh",
"chars": 2103,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/comment-off.zsh",
"chars": 2162,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/comments.zsh",
"chars": 2220,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/commmand-parameter.zsh",
"chars": 2359,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/control-flow.zsh",
"chars": 2788,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/control-flow2.zsh",
"chars": 2254,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/control-flow3.zsh",
"chars": 2214,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2016"
},
{
"path": "highlighters/main/test-data/cthulhu.zsh",
"chars": 4209,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/dinbrack1.zsh",
"chars": 2247,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/dirs_blacklist.zsh",
"chars": 2277,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2018"
},
{
"path": "highlighters/main/test-data/dollar-dollar.zsh",
"chars": 2246,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/dollar-noise.zsh",
"chars": 2399,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/dollar-paren.zsh",
"chars": 2663,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/dollar-quoted.zsh",
"chars": 2206,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/dollar-quoted2.zsh",
"chars": 2312,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/dollar-quoted3.zsh",
"chars": 2302,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/double-hyphen-option.zsh",
"chars": 2117,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/double-quoted.zsh",
"chars": 2407,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/double-quoted2.zsh",
"chars": 2312,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/double-quoted3.zsh",
"chars": 2371,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/double-quoted4.zsh",
"chars": 2191,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/empty-command-newline.zsh",
"chars": 2204,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/empty-command.zsh",
"chars": 2119,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/empty-command2.zsh",
"chars": 2210,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/empty-line.zsh",
"chars": 2109,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/equals1.zsh",
"chars": 2098,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/equals2.zsh",
"chars": 2141,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/equals3.zsh",
"chars": 2130,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/equals4.zsh",
"chars": 2097,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/escaped-single-quote.zsh",
"chars": 2229,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/exec-redirection1.zsh",
"chars": 2177,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/fd-target-not-filename.zsh",
"chars": 2181,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/function-altsyntax.zsh",
"chars": 2516,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/function-named1.zsh",
"chars": 2370,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/function-named2.zsh",
"chars": 2203,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/function.zsh",
"chars": 2166,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/glob.zsh",
"chars": 2241,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/global-alias1.zsh",
"chars": 2133,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/globs-with-quoting.zsh",
"chars": 2399,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/hashed-command.zsh",
"chars": 2196,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/history-double-quoted-escaped.zsh",
"chars": 2206,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/history-double-quoted-followed.zsh",
"chars": 2236,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/history-double-quoted-no.zsh",
"chars": 2217,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/history-double-quoted-unescaped.zsh",
"chars": 2192,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/history-double-quoted-yes.zsh",
"chars": 2198,
"preview": "#!/usr/bin/env zsh\n# -------------------------------------------------------------------------------------------------\n#"
},
{
"path": "highlighters/main/test-data/history-expansion.zsh",
"chars": 2224,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
},
{
"path": "highlighters/main/test-data/history-expansion2.zsh",
"chars": 2079,
"preview": "# -------------------------------------------------------------------------------------------------\n# Copyright (c) 2015"
}
]
// ... and 126 more files (download for full content)
About this extraction
This page contains the full source code of the zsh-users/zsh-syntax-highlighting GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 326 files (834.2 KB), approximately 198.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.