master 1d85c692615a cached
326 files
834.2 KB
198.8k tokens
1 requests
Download .txt
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: [![Screenshot #1.1](images/before1-smaller.png)](images/before1.png)
<br/>
After:&nbsp; [![Screenshot #1.2](images/after1-smaller.png)](images/after1.png)

Before: [![Screenshot #2.1](images/before2-smaller.png)](images/before2.png)
<br/>
After:&nbsp; [![Screenshot #2.2](images/after2-smaller.png)](images/after2.png)

Before: [![Screenshot #3.1](images/before3-smaller.png)](images/before3.png)
<br/>
After:&nbsp; [![Screenshot #3.2](images/after3-smaller.png)](images/after3.png)

Before: [![Screenshot #4.1](images/before4-smaller.png)](images/before4-smaller.png)
<br/>
After:&nbsp; [![Screenshot #4.2](images/after4-smaller.png)](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,
Download .txt
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.

Copied to clipboard!