diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..cda541d
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+# 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
+
diff --git a/.travis.yml b/.travis.yml
index cea0ad9..4ee2765 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,6 +3,9 @@ sudo: required
env:
- ZSH=master
+ - ZSH=5.8
+ - ZSH=5.7.1
+ - ZSH=5.7
- ZSH=5.6.2
- ZSH=5.6.1
- ZSH=5.6
@@ -33,7 +36,7 @@ env:
- ZSH=4.3.12
- ZSH=4.3.11
-script: docker run -v $PWD:/work -w /work zshusers/zsh-${ZSH} /bin/sh -c 'install_packages make procps && make test'
+script: docker run -v $PWD:/work -w /work zshusers/zsh:${ZSH} /bin/sh -c 'install_packages make procps bsdmainutils && make test'
notifications:
webhooks:
diff --git a/.version b/.version
index e1bde80..c7d2522 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-0.7.0-dev
+0.7.2-dev
diff --git a/COPYING.md b/COPYING.md
index 22eea4f..cacbcbe 100644
--- a/COPYING.md
+++ b/COPYING.md
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2018 zsh-syntax-highlighting contributors
+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
diff --git a/HACKING.md b/HACKING.md
index 5266a33..6fd195c 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -11,16 +11,18 @@ The `main` highlighter
The following function `pz` is useful when working on the `main` highlighting:
- pq() {
- (( $#argv )) || return 0
- print -r -l -- ${(qqqq)argv}
- }
- pz() {
- local arg
- for arg; do
- pq ${(z)arg}
- done
- }
+```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.
@@ -32,17 +34,19 @@ 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_HIGHLIGHT_STYLES[bracket-level-1]=
- ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
+```zsh
+ZSH_HIGHLIGHT_STYLES[bracket-level-1]=
+ZSH_HIGHLIGHT_STYLES[bracket-level-2]=
- BUFFER='echo ({x})'
+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" # )
- )
+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
-----------------------------------------------
@@ -53,20 +57,40 @@ 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_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')
+```zsh
+ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')
- BUFFER='rm -rf /'
+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.
- expected_region_highlight=(
- "1 8 fg=white,bold,bg=red" # rm -rf /
- )
Miscellany
----------
If you work on the driver (`zsh-syntax-highlighting.zsh`), you may find the following zstyle useful:
- zstyle ':completion:*:*:*:*:globbed-files' ignored-patterns {'*/',}zsh-syntax-highlighting.plugin.zsh
+```zsh
+zstyle ':completion:*:*:*:*:globbed-files' ignored-patterns {'*/',}zsh-syntax-highlighting.plugin.zsh
+```
IRC channel
-----------
diff --git a/INSTALL.md b/INSTALL.md
index 468e9bd..fc0f752 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -6,7 +6,7 @@ How to install
* 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: [`textproc/zsh-syntax-highlighting`][freebsd-port])
+* FreeBSD: `pkg install zsh-syntax-highlighting` (port name: [`shells/zsh-syntax-highlighting`][freebsd-port])
* Gentoo: [mv overlay][gentoo-overlay]
* Mac OS X / Homebrew: [brew install zsh-syntax-highlighting][brew-package]
* Ubuntu: `zsh-syntax-highlighting` package [in Xenial][ubuntu-package] (or in [OBS repository][obs-repository])
@@ -23,8 +23,8 @@ How to install
[ubuntu-package]: https://launchpad.net/ubuntu/+source/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
-[obs-repository]: https://software.opensuse.org//download.html?project=shells%3Azsh-users%3Azsh-syntax-highlighting&package=zsh-syntax-highlighting
-[void-package]: https://github.com/voidlinux/void-packages/tree/master/srcpkgs/zsh-syntax-highlighting
+[obs-repository]: https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-syntax-highlighting&package=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)
@@ -33,17 +33,23 @@ See also [repology's cross-distro index](https://repology.org/metapackage/zsh-sy
Simply clone this repository and source the script:
- 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
+```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:
- source ./zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+```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
+```
+https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz
+```
Note the `source` command must be **at the end** of `~/.zshrc`.
@@ -69,15 +75,17 @@ your `.zshrc`.
1. Clone this repository in oh-my-zsh's plugins directory:
- git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
+ ```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`:
- plugins=( [plugins...] zsh-syntax-highlighting)
+ ```zsh
+ plugins=( [plugins...] zsh-syntax-highlighting)
+ ```
-3. Source `~/.zshrc` to take changes into account:
-
- source ~/.zshrc
+3. Restart zsh (such as by opening a new instance of your terminal emulator).
#### [Prezto](https://github.com/sorin-ionescu/prezto)
@@ -106,10 +114,14 @@ 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
- make install
+```zsh
+make install
+```
and directing your users to add
- source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+```zsh
+source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+```
to their `.zshrc`s.
diff --git a/Makefile b/Makefile
index 6cc2648..bbc1d43 100644
--- a/Makefile
+++ b/Makefile
@@ -41,7 +41,7 @@ test:
for test in highlighters/*; do \
if [ -d $$test/test-data ]; then \
echo "Running test $${test##*/}"; \
- $(ZSH) -f tests/test-highlighting.zsh "$${test##*/}"; \
+ env -i QUIET=$$QUIET $${TERM:+"TERM=$$TERM"} $(ZSH) -f tests/test-highlighting.zsh "$${test##*/}"; \
: $$(( result |= $$? )); \
fi \
done; \
diff --git a/README.md b/README.md
index dbfc8b8..52896c0 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,11 @@ Before: [](images/before3.png)
After: [](images/after3.png)
+Before: [](images/before4-smaller.png)
+
+After: [](images/after4-smaller.png)
+
+
How to install
--------------
diff --git a/changelog.md b/changelog.md
index 6ed90f1..280f434 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,196 @@
+# Changes in HEAD
+
+## 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.
+
+
+## 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 `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]
+
+
+# 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`)
+ [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.
@@ -331,50 +524,66 @@ in this area.
- incomplete sudo commands
(a3047a912100, 2f05620b19ae)
- sudo;
- sudo -u;
+ ```zsh
+ sudo;
+ sudo -u;
+ ```
- command words following reserved words
(#207, #222, b397b12ac139 et seq, 6fbd2aa9579b et seq, 8b4adbd991b0)
- if ls; then ls; else ls; fi
- repeat 10 do ls; done
+ ```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)
- echo Hello # comment
+ ```zsh
+ echo Hello # comment
+ ```
- closing brackets of arithmetic expansion, subshells, and blocks
(#226, a59f442d2d34, et seq)
- (( foo ))
- ( foo )
- { foo }
+ ```zsh
+ (( foo ))
+ ( foo )
+ { foo }
+ ```
- command names enabled by the `PATH_DIRS` option
(#228, 96ee5116b182)
- # When ~/bin/foo/bar exists, is executable, ~/bin is in $PATH,
- # and 'setopt PATH_DIRS' is in effect
- foo/bar
+ ```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)
- echo "${foo}"
+ ```zsh
+ echo "${foo}"
+ ```
- parameter expansions in command word
(#101, 4fcfb15913a2)
- x=/bin/ls
- $x -l
+ ```zsh
+ x=/bin/ls
+ $x -l
+ ```
-- the command separators '|&', '&!', '&|'
+- the command separators '\|&', '&!', '&\|'
- view file.pdf &! ls
+ ```zsh
+ view file.pdf &! ls
+ ```
## Fixed highlighting of:
@@ -382,23 +591,31 @@ in this area.
- precommand modifiers at non-command-word position
(#209, 2c9f8c8c95fa)
- ls command foo
+ ```zsh
+ ls command foo
+ ```
- sudo commands with infix redirections
(#221, be006aded590, 86e924970911)
- sudo -u >/tmp/foo.out user ls
+ ```zsh
+ sudo -u >/tmp/foo.out user ls
+ ```
- subshells; anonymous functions
(#166, #194, 0d1bfbcbfa67, 9e178f9f3948)
- (true)
- () { true }
+ ```zsh
+ (true)
+ () { true }
+ ```
- parameter assignment statements with no command
(#205, 01d7eeb3c713)
- A=1;
+ ```zsh
+ A=1;
+ ```
(The semicolon used to be highlighted as a mistake)
@@ -489,69 +706,95 @@ in this area.
- suffix aliases (requires zsh 5.1.1 or newer):
- alias -s png=display
- foo.png
+ ```zsh
+ alias -s png=display
+ foo.png
+ ```
- prefix redirections:
- foo.txt
+ ```zsh
+ echo > foo.txt
+ ```
- arithmetic evaluations:
- (( 42 ))
+ ```zsh
+ (( 42 ))
+ ```
- $'' strings, including \x/\octal/\u/\U escapes
- : $'foo\u0040bar'
+ ```zsh
+ : $'foo\u0040bar'
+ ```
- multiline strings:
- % echo "line 1
- line 2"
+ ```zsh
+ % echo "line 1
+ line 2"
+ ```
- string literals that haven't been finished:
- % echo "Hello, world
-
+ ```zsh
+ % echo "Hello, world
+ ```
- command words that involve tilde expansion:
- % ~/bin/foo
-
+ ```zsh
+ % ~/bin/foo
+ ```
## Fixed highlighting of:
- quoted command words:
- % \ls
+ ```zsh
+ % \ls
+ ```
- backslash escapes in "" strings:
- % echo "\x41"
+ ```zsh
+ % echo "\x41"
+ ```
- noglob after command separator:
- % :; noglob echo *
+ ```zsh
+ % :; noglob echo *
+ ```
- glob after command separator, when the first command starts with 'noglob':
- % noglob true; echo *
+ ```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`
- % echo foo;‸
- % echo <‸
+ ```zsh
+ % echo foo;‸
+ % echo <‸
+ ```
(where `‸` represents the cursor location)
- escaped globbing (outside quotes)
- % echo \*
+ ```zsh
+ % echo \*
+ ```
## Other changes:
diff --git a/docs/highlighters.md b/docs/highlighters.md
index 642d2bd..bb72e54 100644
--- a/docs/highlighters.md
+++ b/docs/highlighters.md
@@ -18,13 +18,32 @@ Syntax highlighting is done by pluggable highlighters:
[6]: 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 comand lines (for example, with the [`fned`][fned] utility
+function). Example:
+
+[fned]: http://zsh.sourceforge.net/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 in
`~/.zshrc`, for example:
- ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern cursor)
+```zsh
+ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern cursor)
+```
By default, `$ZSH_HIGHLIGHT_HIGHLIGHTERS` is unset and only the `main`
highlighter is active.
@@ -58,10 +77,12 @@ To create your own `acme` highlighter:
This function must return 0 when the highlighter needs to be called and
non-zero otherwise, for example:
- _zsh_highlight_highlighter_acme_predicate() {
- # Call this highlighter in SVN working copies
- [[ -d .svn ]]
- }
+ ```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
@@ -71,18 +92,22 @@ To create your own `acme` highlighter:
`: ${ZSH_HIGHLIGHT_STYLES[key]:=value}`, being sure to prefix
the key with your highlighter name and a colon. For example:
- : ${ZSH_HIGHLIGHT_STYLES[acme:aurora]:=fg=green}
+ ```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
- }
+ _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:
- [[ ${zsyh_user_options[ignoreclosebraces]:-off} == on ]]
+ ```zsh
+ [[ ${zsyh_user_options[ignoreclosebraces]:-off} == on ]]
+ ```
The option name must be all lowercase with no underscores and not an alias.
@@ -96,10 +121,12 @@ To create your own `acme` highlighter:
`_zsh_highlight_highlighter_acme_paint` respectively.
These names are still supported for backwards compatibility;
- however, support for them will be removed in a a future major or minor release (v0.x.0 or v1.0.0).
+ 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_HIGHLIGHT_HIGHLIGHTERS+=(acme)
+ ```zsh
+ ZSH_HIGHLIGHT_HIGHLIGHTERS+=(acme)
+ ```
* [Write tests](../tests/README.md).
diff --git a/docs/highlighters/brackets.md b/docs/highlighters/brackets.md
index 9001074..8410135 100644
--- a/docs/highlighters/brackets.md
+++ b/docs/highlighters/brackets.md
@@ -16,11 +16,13 @@ This highlighter defines the following styles:
To override one of those styles, change its entry in `ZSH_HIGHLIGHT_STYLES`,
for example in `~/.zshrc`:
- # To define styles for nested brackets up to level 4
- ZSH_HIGHLIGHT_STYLES[bracket-level-1]='fg=blue,bold'
- ZSH_HIGHLIGHT_STYLES[bracket-level-2]='fg=red,bold'
- ZSH_HIGHLIGHT_STYLES[bracket-level-3]='fg=yellow,bold'
- ZSH_HIGHLIGHT_STYLES[bracket-level-4]='fg=magenta,bold'
+```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)`
diff --git a/docs/highlighters/cursor.md b/docs/highlighters/cursor.md
index 7295fd1..c4f22b8 100644
--- a/docs/highlighters/cursor.md
+++ b/docs/highlighters/cursor.md
@@ -13,7 +13,9 @@ This highlighter defines the following styles:
To override one of those styles, change its entry in `ZSH_HIGHLIGHT_STYLES`,
for example in `~/.zshrc`:
- ZSH_HIGHLIGHT_STYLES[cursor]='bg=blue'
+```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)`
diff --git a/docs/highlighters/line.md b/docs/highlighters/line.md
index 4ba14e9..1081fe1 100644
--- a/docs/highlighters/line.md
+++ b/docs/highlighters/line.md
@@ -13,7 +13,9 @@ This highlighter defines the following styles:
To override one of those styles, change its entry in `ZSH_HIGHLIGHT_STYLES`,
for example in `~/.zshrc`:
- ZSH_HIGHLIGHT_STYLES[line]='bold'
+```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)`
diff --git a/docs/highlighters/main.md b/docs/highlighters/main.md
index 188da07..cc6186b 100644
--- a/docs/highlighters/main.md
+++ b/docs/highlighters/main.md
@@ -20,12 +20,14 @@ This highlighter defines the following styles:
* `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
@@ -33,9 +35,14 @@ This highlighter defines the following styles:
* `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` ``)
@@ -54,23 +61,28 @@ This highlighter defines the following styles:
* `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`:
- # Declare the variable
- typeset -A ZSH_HIGHLIGHT_STYLES
+```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'
+# 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)`
@@ -78,10 +90,11 @@ manual page][zshzle-Character-Highlighting].
#### Parameters
-To avoid partial path lookups on a path, add the path to the `X_ZSH_HIGHLIGHT_DIRS_BLACKLIST` array.
-This interface is still experimental.
+To avoid partial path lookups on a path, add the path to the `ZSH_HIGHLIGHT_DIRS_BLACKLIST` array.
- X_ZSH_HIGHLIGHT_DIRS_BLACKLIST+=(/mnt/slow_share)
+```zsh
+ZSH_HIGHLIGHT_DIRS_BLACKLIST+=(/mnt/slow_share)
+```
### Useless trivia
diff --git a/docs/highlighters/pattern.md b/docs/highlighters/pattern.md
index 3ad5f24..e67d79f 100644
--- a/docs/highlighters/pattern.md
+++ b/docs/highlighters/pattern.md
@@ -9,8 +9,13 @@ This is the `pattern` highlighter, that highlights user-defined patterns.
To use this highlighter, associate patterns with styles in the
`ZSH_HIGHLIGHT_PATTERNS` associative array, for example in `~/.zshrc`:
- # To have commands starting with `rm -rf` in red:
- ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red')
+```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)`
diff --git a/docs/highlighters/regexp.md b/docs/highlighters/regexp.md
index 25f1b6c..5c8a89e 100644
--- a/docs/highlighters/regexp.md
+++ b/docs/highlighters/regexp.md
@@ -10,7 +10,10 @@ patterns.
To use this highlighter, associate regular expressions with styles in the
`ZSH_HIGHLIGHT_REGEXP` associative array, for example in `~/.zshrc`:
- ZSH_HIGHLIGHT_REGEXP+=('\bsudo\b' fg=123,bold)
+```zsh
+typeset -A ZSH_HIGHLIGHT_REGEXP
+ZSH_HIGHLIGHT_REGEXP+=('\bsudo\b' fg=123,bold)
+```
This will highlight "sudo" only as a complete word, i.e., "sudo cmd", but not
"sudoedit"
diff --git a/docs/highlighters/root.md b/docs/highlighters/root.md
index 0b0d41f..d120d20 100644
--- a/docs/highlighters/root.md
+++ b/docs/highlighters/root.md
@@ -14,7 +14,9 @@ This highlighter defines the following styles:
To override one of those styles, change its entry in `ZSH_HIGHLIGHT_STYLES`,
for example in `~/.zshrc`:
- ZSH_HIGHLIGHT_STYLES[root]='bg=red'
+```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)`
diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh
index 41a4fb9..e59c61c 100644
--- a/highlighters/main/main-highlighter.zsh
+++ b/highlighters/main/main-highlighter.zsh
@@ -1,5 +1,5 @@
# -------------------------------------------------------------------------------------------------
-# Copyright (c) 2010-2018 zsh-syntax-highlighting contributors
+# 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
@@ -33,8 +33,10 @@
: ${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]:=}
@@ -56,8 +58,10 @@
: ${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]:=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.
@@ -72,6 +76,21 @@ _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 ))
@@ -89,13 +108,19 @@ _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().
@@ -107,6 +132,9 @@ _zsh_highlight_main_calculate_fallback() {
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,}
@@ -125,24 +153,40 @@ _zsh_highlight_main_calculate_fallback() {
# Uses the zsh/parameter module if available to avoid forks, and a
# wrapper around 'type -w' as fallback.
#
-# Takes a single argument.
+# 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 (( $+saliases[(e)${1##*.}] )); then
+ elif [[ $1 == *.* && -n ${1%.*} ]] && (( $+saliases[(e)${1##*.}] )); then
REPLY='suffix alias'
elif (( $reswords[(Ie)$1] )); then
REPLY=reserved
@@ -152,6 +196,10 @@ _zsh_highlight_main__type() {
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
@@ -159,15 +207,31 @@ _zsh_highlight_main__type() {
#
# The first disjunct mimics the isrelative() C call from the zsh bug.
elif { [[ $1 != */* ]] || is-at-least 5.3 } &&
- ! builtin type -w -- $1 >/dev/null 2>&1; then
+ # 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.
- REPLY="${$(LC_ALL=C builtin type -w -- $1 2>/dev/null)##*: }"
+ #
+ # 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
- if (( $+_zsh_highlight_main__command_type_cache )); then
+
+ # Cache population
+ if (( may_cache )) && (( $+_zsh_highlight_main__command_type_cache )); then
_zsh_highlight_main__command_type_cache[(e)$1]=$REPLY
fi
[[ -n $REPLY ]]
@@ -209,6 +273,18 @@ _zsh_highlight_main__resolve_alias() {
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.
#
@@ -253,8 +329,13 @@ _zsh_highlight_highlighter_main_paint()
# $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
- # $precommand_options maps precommand name to values of $flags_with_argument and
- # $flags_sans_argument for that precommand, joined by a colon.
+ # $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.
@@ -265,14 +346,37 @@ _zsh_highlight_highlighter_main_paint()
'builtin' ''
'command' :pvV
'exec' a:cl
- 'nocorrect' ''
'noglob' ''
+ # 'time' and 'nocorrect' shouldn't be added here; they're reserved words, not precommands.
'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
- 'sudo' Cgprtu:AEHKPSVbhiklnsv # as of sudo 1.8.21p2
+ # 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
+
+ # As of OpenSSH 8.1p1
+ 'ssh-agent' aEPt:csDd:k
+ # suckless-tools v44
+ # Argumentless flags that can't be followed by a command: -v
+ 'tabbed' gnprtTuU:cdfhs
+
+ # moreutils 0.62-1
+ 'chronic' :ev
+ 'ifne' :n
+
)
+ # Commands that would need to skip one positional argument:
+ # flock
+ # ssh
if [[ $zsyh_user_options[ignorebraces] == on || ${zsyh_user_options[ignoreclosebraces]:-off} == on ]]; then
local right_brace_is_recognised_everywhere=false
@@ -286,6 +390,7 @@ _zsh_highlight_highlighter_main_paint()
ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR=(
'|' '||' ';' '&' '&&'
+ $'\n' # ${(z)} returns ';' but we convert it to $'\n'
'|&'
'&!' '&|'
# ### 'case' syntax, but followed by a pattern, not by a command
@@ -310,6 +415,12 @@ _zsh_highlight_highlighter_main_paint()
'!' # 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
@@ -323,6 +434,59 @@ _zsh_highlight_highlighter_main_paint()
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
+ words=( ${(P)MATCH} )
+ ;;
+ 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.
@@ -334,16 +498,28 @@ _zsh_highlight_highlighter_main_paint()
_zsh_highlight_main_highlighter_highlight_list()
{
integer start_pos end_pos=0 buf_offset=$1 has_end=$3
- local buf=$4 highlight_glob=true arg arg_raw style
+ # 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 ')'
- integer len=$#buf
+ # in_alias is equal to the number of shifts needed until arg=args[1] pops an
+ # arg from BUFFER and not added by an alias.
+ # in_param is analogous for parameter expansions
+ integer in_alias=0 in_param=0 len=$#buf
local -a 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
- # "S" for $( )
+ # "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'
@@ -354,23 +530,28 @@ _zsh_highlight_main_highlighter_highlight_list()
#
# 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:.
+ # 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..
+ # 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
@@ -387,7 +568,14 @@ _zsh_highlight_main_highlighter_highlight_list()
# $in_redirection. The value of $next_word from the iteration that processed
# the operator is discarded.
#
- local this_word next_word=':start:'
+ # $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"
@@ -397,15 +585,39 @@ _zsh_highlight_main_highlighter_highlight_list()
else
args=(${(z)buf})
fi
- for arg in $args; do
- # Save an unmunged copy of the current word.
- arg_raw="$arg"
+
+ # 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-- ))
+ 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
+ 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:'
- else
+ elif (( !in_param )); then
# Stall $next_word.
(( --in_redirection ))
fi
@@ -415,6 +627,7 @@ _zsh_highlight_main_highlighter_highlight_list()
# $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
@@ -424,60 +637,38 @@ _zsh_highlight_main_highlighter_highlight_list()
fi
fi
- # Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
- start_pos=$end_pos
- if [[ $arg == ';' ]] ; then
- # We're looking for either a semicolon or a newline, whichever comes
- # first. Both of these are rendered as a ";" (SEPER) by the ${(z)..}
- # flag.
- #
- # We can't use the (Z+n+) flag because that elides the end-of-command
- # token altogether, so 'echo foo\necho bar' (two commands) becomes
- # indistinguishable from 'echo foo echo bar' (one command with three
- # words for arguments).
- local needle=$'[;\n]'
- integer offset=$(( ${proc_buf[(i)$needle]} - 1 ))
- (( start_pos += offset ))
+ 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 ))
- else
- # The line was:
- #
- # integer offset=$(((len-start_pos)-${#${proc_buf##([[:space:]]|\\[[:space:]])#}}))
- #
- # - len-start_pos is length of current proc_buf; basically: initial length minus where
- # we are, and proc_buf is chopped to the "where we are" (compare the "previous value
- # of start_pos" below, and the len-(start_pos-offset) = len-start_pos+offset)
- # - what's after main minus sign is: length of proc_buf without spaces at the beginning
- # - so what the line actually did, was computing length of the spaces!
- # - this can be done via (#b) flag, like below
- if [[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\$'\n')##)* ]]; then
- # The first, outer parenthesis
- integer offset="${#match[1]}"
- else
- integer offset=0
- fi
- ((start_pos+=offset))
- ((end_pos=$start_pos+${#arg}))
- fi
- # 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]}"
+ # 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.
#
@@ -494,131 +685,108 @@ _zsh_highlight_main_highlighter_highlight_list()
continue
fi
- if [[ $this_word == *:start:* ]] && ! (( in_redirection )); then
+ if [[ $this_word == *':start:'* ]] && ! (( in_redirection )); then
# Expand aliases.
- _zsh_highlight_main__type "$arg"
+ # 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
- () {
- local -A seen_arg
- while [[ $REPLY == alias ]]; do
- seen_arg[$arg]=1
- _zsh_highlight_main__resolve_alias $arg
- # Use a temporary array to ensure the subscript is interpreted as
- # an array subscript, not as a scalar subscript
- local -a reply
- # TODO: the ${interactive_comments+set} path needs to skip comments; see test-data/alias-comment1.zsh
- reply=( ${interactive_comments-${(z)REPLY}}
- ${interactive_comments+${(zZ+c+)REPLY}} )
- # Avoid looping forever on alias a=b b=c c=b, but allow alias foo='foo bar'
- [[ $arg == $reply[1] ]] && break
- arg=$reply[1]
- if (( $+seen_arg[$arg] )); then
- res=none
- break
- fi
- _zsh_highlight_main__type "$arg"
- done
- }
- _zsh_highlight_main_highlighter_expand_path $arg
- arg=$REPLY
- () {
- # Make sure to use $arg_raw here, rather than $arg.
- integer insane_alias
- case $arg_raw in
- # Issue #263: aliases with '=' on their LHS.
- #
- # There are three cases:
- #
- # - Unsupported, breaks 'alias -L' output, but invokable:
- ('='*) :;;
- # - Unsupported, not invokable:
- (*'='*) insane_alias=1;;
- # - The common case:
- (*) :;;
- esac
- if (( insane_alias )); then
- style=unknown-token
- # Calling 'type' again; since __type memoizes the answer, this call is just a hash lookup.
- elif ! _zsh_highlight_main__type "$arg" || [[ $REPLY == 'none' ]]; then
- style=unknown-token
- else
- # The common case.
- style=alias
- if (( ${+precommand_options[(re)"$arg"]} )) && (( ! ${+precommand_options[(re)"$arg_raw"]} )); then
- precommand_options[$arg_raw]=$precommand_options[$arg]
- fi
- fi
- }
+ # Mark insane aliases as unknown-token (cf. #263).
+ if [[ $arg == ?*=* ]]; then
+ (( in_alias == 0 )) && in_alias=1
+ _zsh_highlight_main_add_region_highlight $start_pos $end_pos unknown-token
+ continue
+ fi
+ seen_alias[$arg]=1
+ _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
+ # Add one because we will in_alias-- on the next loop iteration so
+ # this iteration should be considered in in_alias as well
+ (( in_alias += $#alias_args + 1 ))
+ else
+ # This arg is already included in the count, so no need to + 1.
+ (( in_alias += $#alias_args ))
+ fi
+ (( in_redirection++ )) # Stall this arg
+ continue
else
_zsh_highlight_main_highlighter_expand_path $arg
- arg=$REPLY
- _zsh_highlight_main__type "$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 )); then
+ if (( in_redirection == 1 )); then
+ # Two consecuive 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.
- #
- # ### 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}.)
- () {
+ 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 match mbegin mend
- local MATCH; integer MBEGIN MEND
- local parameter_name
- if [[ $arg[1] == '$' ]] && [[ ${arg[2]} == '{' ]] && [[ ${arg[-1]} == '}' ]]; then
- parameter_name=${${arg:2}%?}
- elif [[ $arg[1] == '$' ]]; then
- parameter_name=${arg:1}
- fi
- if [[ $res == none ]] && zmodload -e zsh/parameter &&
- [[ ${parameter_name} =~ ^([A-Za-z_][A-Za-z0-9_]*|[0-9]+)$ ]] &&
- (( ${+parameters[(e)${MATCH}]} )) && [[ ${parameters[(e)$MATCH]} != *special* ]]
- then
- # Set $arg.
- case ${(tP)MATCH} in
- (*array*|*assoc*)
- local -a words; words=( ${(P)MATCH} )
- arg=${words[1]}
- ;;
- (*)
- # scalar, presumably
- arg=${(P)MATCH}
- ;;
- esac
- _zsh_highlight_main__type "$arg"
- res=$REPLY
- fi
- }
+ () {
+ 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 ]] &&
- { [[ -n $flags_sans_argument ]] && [[ $arg == '-'[$flags_sans_argument]#[$flags_with_argument] ]] ||
- [[ $arg == '-'[$flags_with_argument] ]] }; then
+ {
+ # 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 ]] &&
- { [[ -n $flags_sans_argument ]] && [[ $arg == '-'[$flags_sans_argument]#[$flags_with_argument]* ]] ||
- [[ $arg == '-'[$flags_with_argument]* ]] }; then
+ {
+ # 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:'
@@ -626,16 +794,31 @@ _zsh_highlight_main_highlighter_highlight_list()
elif [[ -n $flags_sans_argument ]] &&
[[ $arg == '-'[$flags_sans_argument]# ]]; then
# Flag that requires no argument
- this_word=:sudo_opt:
+ 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
- this_word=:sudo_opt:
+ # 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:'
- _zsh_highlight_main_add_region_highlight $start_pos $end_pos unknown-token
- continue
else
# Not an option flag; nothing to do. (If the command line is
# syntactically valid, ${this_word//:sudo_opt:/} should be
@@ -646,43 +829,93 @@ _zsh_highlight_main_highlighter_highlight_list()
next_word+=':sudo_opt:'
next_word+=':start:'
fi
- fi
+ fi
- # The Great Fork: is this a command word? Is this a non-command word?
- if [[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR:#"$arg"} ]]; then
- if [[ $this_word == *':regular:'* ]]; then
- # This highlights empty commands (semicolon follows nothing) as an error.
- # Zsh accepts them, though.
- style=commandseparator
- else
- style=unknown-token
- fi
- if [[ $arg == ';' ]] && $in_array_assignment; then
- # literal newline inside an array assignment
- next_word=':regular:'
- else
- next_word=':start:'
- highlight_glob=true
- 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
- next_word=':start:'
- elif ! (( in_redirection)) && [[ $this_word == *':start:'* ]]; then # $arg is the command word
- if (( ${+precommand_options[$arg]} )) && _zsh_highlight_main__is_runnable $arg; then
- [[ $res != alias ]] && style=precommand
- flags_with_argument=${precommand_options[$arg]%:*}
- flags_sans_argument=${precommand_options[$arg]#*:}
- next_word=${next_word//:regular:/}
- next_word+=':sudo_opt:'
- next_word+=':start:'
- else
- case $res in
- reserved) # reserved word
+ # 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
+ 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' ]]; then
+ # To allow "exec 2>&1;" where there's no command word
+ next_word+=':regular:'
+ fi
+ else
+ case $res in
+ (reserved) # reserved word
style=reserved-word
- #
- # Match braces.
+ # 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"
;;
@@ -693,6 +926,9 @@ _zsh_highlight_main_highlighter_highlight_list()
next_word+=':always:'
fi
;;
+ ($'\x5b\x5b')
+ braces_stack='T'"$braces_stack"
+ ;;
('do')
braces_stack='D'"$braces_stack"
;;
@@ -728,35 +964,58 @@ _zsh_highlight_main_highlighter_highlight_list()
('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:'
+ ('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;;
- alias) :;;
- builtin) style=builtin;;
- function) style=function;;
- command) style=command;;
- hashed) style=hashed-command;;
- none) if _zsh_highlight_main_highlighter_check_assign; then
+ ('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 (( start_pos + i <= end_pos )); then
+ if (( i <= $#arg )); then
() {
local highlight_glob=false
[[ $zsyh_user_options[globassign] == on ]] && highlight_glob=true
@@ -765,11 +1024,15 @@ _zsh_highlight_main_highlighter_highlight_list()
fi
fi
continue
- elif [[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
+ elif (( ! in_param )) &&
+ [[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
style=history-expansion
- elif [[ $arg[0,1] == $histchars[2,2] ]]; then
+ elif (( ! in_param )) &&
+ [[ $arg[0,1] == $histchars[2,2] ]]; then
style=history-expansion
- elif [[ $arg[1,2] == '((' ]]; then
+ elif (( ! in_param )) &&
+ ! $saw_assignment &&
+ [[ $arg[1,2] == '((' ]]; then
# Arithmetic evaluation.
#
# Note: prior to zsh-5.1.1-52-g4bed2cf (workers/36669), the ${(z)...}
@@ -784,14 +1047,18 @@ _zsh_highlight_main_highlighter_highlight_list()
_zsh_highlight_main_add_region_highlight $((end_pos - 2)) $end_pos reserved-word
fi
continue
- elif [[ $arg == '()' ]]; then
+ elif (( ! in_param )) &&
+ [[ $arg == '()' ]]; then
# anonymous function
style=reserved-word
- elif [[ $arg == $'\x28' ]]; then
+ elif (( ! in_param )) &&
+ ! $saw_assignment &&
+ [[ $arg == $'\x28' ]]; then
# subshell
style=reserved-word
braces_stack='R'"$braces_stack"
- elif [[ $arg == $'\x29' ]]; then
+ elif (( ! in_param )) &&
+ [[ $arg == $'\x29' ]]; then
# end of subshell or command substitution
if _zsh_highlight_main__stack_pop 'S'; then
REPLY=$start_pos
@@ -800,75 +1067,89 @@ _zsh_highlight_main_highlighter_highlight_list()
fi
_zsh_highlight_main__stack_pop 'R' reserved-word
else
- if _zsh_highlight_main_highlighter_check_path $arg; then
+ 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
+ (*) _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:'
- fi
- else # $arg is a non-command word
+ 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
- style=assign
- in_array_assignment=false
- next_word+=':start:'
- 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:'
- 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
- else
- _zsh_highlight_main_highlighter_highlight_argument 1 $(( 1 - in_redirection ))
- continue
- fi
- ;;
+ ($'\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
- REPLY=$(( end_pos - 1 ))
+ (( in_alias == 1 )) && in_alias=0 _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 ))
}
@@ -897,12 +1178,32 @@ _zsh_highlight_main_highlighter_highlight_path_separators()
# 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
- REPLY=path
+ 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
@@ -915,28 +1216,60 @@ _zsh_highlight_main_highlighter_check_path()
tmp_path=$tmp_path:a
while [[ $tmp_path != / ]]; do
- [[ -n ${(M)X_ZSH_HIGHLIGHT_DIRS_BLACKLIST:#$tmp_path} ]] && return 1
+ [[ -n ${(M)ZSH_HIGHLIGHT_DIRS_BLACKLIST:#$tmp_path} ]] && return 1
tmp_path=$tmp_path:h
done
- [[ -L $expanded_path ]] && return 0
- [[ -e $expanded_path ]] && return 0
+ 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
- local cdpath_dir
- for cdpath_dir in $cdpath ; do
- [[ -e "$cdpath_dir/$expanded_path" ]] && return 0
- done
+ 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
- tmp=( ${expanded_path}*(N) )
- (( $#tmp > 0 )) && REPLY=path_prefix && return 0
+ 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.
@@ -946,6 +1279,8 @@ _zsh_highlight_main_highlighter_check_path()
# 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
@@ -955,6 +1290,11 @@ _zsh_highlight_main_highlighter_highlight_argument()
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
@@ -968,7 +1308,7 @@ _zsh_highlight_main_highlighter_highlight_argument()
'=')
if [[ $arg[i+1] == $'\x28' ]]; then
(( i += 2 ))
- _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,end_pos]
+ _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
highlights+=(
@@ -982,8 +1322,12 @@ _zsh_highlight_main_highlighter_highlight_argument()
fi
esac
- for (( ; i <= end_pos - start_pos ; i += 1 )); do
+ # 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
@@ -1001,30 +1345,37 @@ _zsh_highlight_main_highlighter_highlight_argument()
highlights+=($reply)
;;
'$')
- path_eligible=0
+ if [[ $arg[i+1] != "'" ]]; then
+ path_eligible=0
+ fi
if [[ $arg[i+1] == "'" ]]; then
- path_eligible=1
_zsh_highlight_main_highlighter_highlight_dollar_quote $i
(( i = REPLY ))
highlights+=($reply)
continue
- elif [[ $arg[i+1] == $'\x28' ]]; then
+ 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,end_pos]
+ _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
- $(( start_pos + start - 1)) $(( start_pos + start + 1)) command-substitution-delimiter
+ $(( 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)
+ highlights+=($(( start_pos + i - 1)) $(( start_pos + i )) command-substitution-delimiter-unquoted)
fi
continue
fi
- while [[ $arg[i+1] == [\^=~#+] ]]; do
+ while [[ $arg[i+1] == [=~#+'^'] ]]; do
(( i += 1 ))
done
if [[ $arg[i+1] == [*@#?$!-] ]]; then
@@ -1034,7 +1385,7 @@ _zsh_highlight_main_highlighter_highlight_argument()
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,end_pos]
+ _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,-1]
ret=$?
(( i += REPLY ))
highlights+=(
@@ -1049,7 +1400,9 @@ _zsh_highlight_main_highlighter_highlight_argument()
fi
;|
*)
- if $highlight_glob && [[ ${arg[$i]} =~ ^[*?] || ${arg:$i-1} =~ ^\<[0-9]*-[0-9]*\> ]]; then
+ 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
@@ -1060,10 +1413,19 @@ _zsh_highlight_main_highlighter_highlight_argument()
esac
done
- if (( path_eligible )) && _zsh_highlight_main_highlighter_check_path $arg[$1,end_pos]; then
- base_style=$REPLY
- _zsh_highlight_main_highlighter_highlight_path_separators $base_style
- highlights+=($reply)
+ 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)
@@ -1107,23 +1469,23 @@ _zsh_highlight_main_highlighter_highlight_single_quote()
# Highlight special chars inside double-quoted strings
_zsh_highlight_main_highlighter_highlight_double_quote()
{
- local -a match mbegin mend saved_reply
- local MATCH; integer MBEGIN MEND
+ 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 <= end_pos - start_pos ; i += 1 )) ; do
+ 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
+ ('"') 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
@@ -1140,19 +1502,28 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
(( 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
- (( i += 2 ))
saved_reply=($reply)
- _zsh_highlight_main_highlighter_highlight_list $(( start_pos + i - 1 )) S $has_end $arg[i,end_pos]
+ 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
- $j $(( j + 2 )) command-substitution-delimiter
+ $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)
+ reply+=($(( start_pos + i - 1 )) $(( start_pos + i )) command-substitution-delimiter-quoted)
fi
continue
else
@@ -1187,7 +1558,13 @@ _zsh_highlight_main_highlighter_highlight_double_quote()
(( i-- ))
style=double-quoted-argument-unclosed
fi
- reply=($(( start_pos + $1 - 1)) $(( start_pos + i )) $style $reply)
+ (( 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
}
@@ -1201,13 +1578,13 @@ _zsh_highlight_main_highlighter_highlight_dollar_quote()
integer c
reply=()
- for (( i = $1 + 2 ; i <= end_pos - start_pos ; i += 1 )) ; do
+ 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 <= end_pos - start_pos ; c += 1 )); do
+ for (( c = i + 1 ; c <= $#arg ; c += 1 )); do
[[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break
done
AA=$arg[$i+1,$c-1]
@@ -1262,7 +1639,7 @@ _zsh_highlight_main_highlighter_highlight_backtick()
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 > end_pos - start_pos )); then
+ if (( i > $#arg )); then
buf=$buf$arg[last,i]
offsets[i-arg1-offset]='' # So we never index past the end
(( i-- ))
@@ -1315,6 +1692,96 @@ _zsh_highlight_main_highlighter_highlight_backtick()
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.
#
@@ -1334,6 +1801,13 @@ _zsh_highlight_main_highlighter_expand_path()
# -------------------------------------------------------------------------------------------------
_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=()
}
@@ -1346,4 +1820,4 @@ else
# Make sure the cache is unset
unset _zsh_highlight_main__command_type_cache
fi
-typeset -ga X_ZSH_HIGHLIGHT_DIRS_BLACKLIST
+typeset -ga ZSH_HIGHLIGHT_DIRS_BLACKLIST
diff --git a/highlighters/main/test-data/abspath-in-command-position1.zsh b/highlighters/main/test-data/abspath-in-command-position1.zsh
new file mode 100644
index 0000000..cfc12a5
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position1.zsh
@@ -0,0 +1,35 @@
+#!/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' # /
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position1b.zsh b/highlighters/main/test-data/abspath-in-command-position1b.zsh
new file mode 100644
index 0000000..88fe60c
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position1b.zsh
@@ -0,0 +1,36 @@
+#!/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' # /
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position2.zsh b/highlighters/main/test-data/abspath-in-command-position2.zsh
new file mode 100644
index 0000000..5033d2c
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position2.zsh
@@ -0,0 +1,35 @@
+#!/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
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position3.zsh b/highlighters/main/test-data/abspath-in-command-position3.zsh
new file mode 100644
index 0000000..415e316
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position3.zsh
@@ -0,0 +1,37 @@
+#!/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)
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position3b.zsh b/highlighters/main/test-data/abspath-in-command-position3b.zsh
new file mode 100644
index 0000000..0e65c98
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position3b.zsh
@@ -0,0 +1,38 @@
+#!/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)
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position4.zsh b/highlighters/main/test-data/abspath-in-command-position4.zsh
new file mode 100644
index 0000000..9e935bf
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position4.zsh
@@ -0,0 +1,35 @@
+#!/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
+)
diff --git a/highlighters/main/test-data/abspath-in-command-position5.zsh b/highlighters/main/test-data/abspath-in-command-position5.zsh
new file mode 100644
index 0000000..e428b1a
--- /dev/null
+++ b/highlighters/main/test-data/abspath-in-command-position5.zsh
@@ -0,0 +1,35 @@
+#!/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
+)
diff --git a/highlighters/main/test-data/alias-basic.zsh b/highlighters/main/test-data/alias-basic.zsh
new file mode 100644
index 0000000..7af8b7c
--- /dev/null
+++ b/highlighters/main/test-data/alias-basic.zsh
@@ -0,0 +1,35 @@
+# -------------------------------------------------------------------------------------------------
+# 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
+)
diff --git a/highlighters/main/test-data/alias-command-substitution.zsh b/highlighters/main/test-data/alias-command-substitution.zsh
new file mode 100644
index 0000000..a7b77df
--- /dev/null
+++ b/highlighters/main/test-data/alias-command-substitution.zsh
@@ -0,0 +1,37 @@
+# -------------------------------------------------------------------------------------------------
+# 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
+)
diff --git a/highlighters/main/test-data/alias-comment1.zsh b/highlighters/main/test-data/alias-comment1.zsh
index a2b56c6..bae7ef6 100644
--- a/highlighters/main/test-data/alias-comment1.zsh
+++ b/highlighters/main/test-data/alias-comment1.zsh
@@ -27,11 +27,11 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
-# see alias-comment2.zsh
+# see alias-comment2.zsh and comment-followed.zsh
setopt interactivecomments
alias x=$'# foo\npwd'
BUFFER='x'
expected_region_highlight=(
- "1 1 alias 'interactivecomments applies to aliases'" # x becomes pwd
+ '1 1 alias' # x
)
diff --git a/highlighters/main/test-data/alias-comment2.zsh b/highlighters/main/test-data/alias-comment2.zsh
index e9ecfca..5a49822 100644
--- a/highlighters/main/test-data/alias-comment2.zsh
+++ b/highlighters/main/test-data/alias-comment2.zsh
@@ -33,5 +33,5 @@ alias x=$'# foo\npwd'
BUFFER='x'
expected_region_highlight=(
- "1 1 unknown-token" # x becomes #
+ '1 1 unknown-token' # x (#)
)
diff --git a/highlighters/main/test-data/alias-complex.zsh b/highlighters/main/test-data/alias-complex.zsh
new file mode 100644
index 0000000..5ad7c0a
--- /dev/null
+++ b/highlighters/main/test-data/alias-complex.zsh
@@ -0,0 +1,38 @@
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 x='echo && ls; >'
+
+BUFFER='x file echo'
+
+expected_region_highlight=(
+ '1 1 alias' # x
+ '3 6 default' # file
+ '8 11 builtin' # echo
+)
diff --git a/highlighters/main/test-data/alias-empty.zsh b/highlighters/main/test-data/alias-empty.zsh
new file mode 100644
index 0000000..535fccc
--- /dev/null
+++ b/highlighters/main/test-data/alias-empty.zsh
@@ -0,0 +1,38 @@
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 x=''
+
+BUFFER='x echo foo'
+
+expected_region_highlight=(
+ '1 1 alias' # x
+ '3 6 builtin' # echo
+ '8 10 default' # foo
+)
diff --git a/highlighters/main/test-data/alias-eponymous1.zsh b/highlighters/main/test-data/alias-eponymous1.zsh
new file mode 100644
index 0000000..2642e14
--- /dev/null
+++ b/highlighters/main/test-data/alias-eponymous1.zsh
@@ -0,0 +1,36 @@
+# -------------------------------------------------------------------------------------------------
+# 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 ls='command ls'
+
+BUFFER='ls'
+
+expected_region_highlight=(
+ "1 2 alias" # ls
+)
diff --git a/highlighters/main/test-data/alias-eponymous2.zsh b/highlighters/main/test-data/alias-eponymous2.zsh
new file mode 100644
index 0000000..dcd8565
--- /dev/null
+++ b/highlighters/main/test-data/alias-eponymous2.zsh
@@ -0,0 +1,36 @@
+# -------------------------------------------------------------------------------------------------
+# 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 ls=tmp tmp='command ls'
+
+BUFFER='ls'
+
+expected_region_highlight=(
+ "1 2 alias" # ls
+)
diff --git a/highlighters/main/test-data/alias-in-cmdsubst.zsh b/highlighters/main/test-data/alias-in-cmdsubst.zsh
new file mode 100644
index 0000000..b3cf777
--- /dev/null
+++ b/highlighters/main/test-data/alias-in-cmdsubst.zsh
@@ -0,0 +1,43 @@
+#!/usr/bin/env 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 p='print -r --'
+
+BUFFER=$'s=$(p foo)'
+
+expected_region_highlight=(
+ '1 10 assign' # s=$(p foo)
+ '3 10 default' # $(p foo)
+ '3 10 command-substitution-unquoted' # $(p foo)
+ '3 4 command-substitution-delimiter-unquoted' # $(
+ '5 5 alias' # p
+ '7 9 default' # foo
+ '10 10 command-substitution-delimiter-unquoted' # )
+)
diff --git a/highlighters/main/test-data/alias-loop.zsh b/highlighters/main/test-data/alias-loop.zsh
index 46e900b..83992db 100644
--- a/highlighters/main/test-data/alias-loop.zsh
+++ b/highlighters/main/test-data/alias-loop.zsh
@@ -28,12 +28,16 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
+function b() {} # beware of ALIAS_FUNC_DEF
alias a=b b=c c=b
BUFFER='a foo; :'
expected_region_highlight=(
- '1 1 unknown-token' # a
+ # An alias is ineligible for expansion whilst it's being expanded.
+ # Therefore, the "b" in the expansion of the alias "c" is not considered
+ # as an alias.
+ '1 1 alias' # a
'3 5 default' # foo
'6 6 commandseparator' # ;
'8 8 builtin' # :
diff --git a/highlighters/main/test-data/alias-loop2.zsh b/highlighters/main/test-data/alias-loop2.zsh
new file mode 100644
index 0000000..29e04ac
--- /dev/null
+++ b/highlighters/main/test-data/alias-loop2.zsh
@@ -0,0 +1,35 @@
+# -------------------------------------------------------------------------------------------------
+# 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 ls="ls"
+BUFFER="ls"
+
+expected_region_highlight+=(
+ "1 2 alias" # ls
+)
diff --git a/highlighters/main/test-data/alias-parameter.zsh b/highlighters/main/test-data/alias-parameter.zsh
new file mode 100644
index 0000000..21bc6b3
--- /dev/null
+++ b/highlighters/main/test-data/alias-parameter.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+alias '$foo'='echo alias'
+local foo; foo=(echo param)
+
+BUFFER='$foo'
+
+expected_region_highlight=(
+ '1 4 alias' # $foo
+)
diff --git a/highlighters/main/test-data/alias-precommand-option-argument1.zsh b/highlighters/main/test-data/alias-precommand-option-argument1.zsh
new file mode 100644
index 0000000..2d1f35c
--- /dev/null
+++ b/highlighters/main/test-data/alias-precommand-option-argument1.zsh
@@ -0,0 +1,42 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 also param-precommand-option-argument1.zsh
+alias sudo_u='sudo -u'
+sudo(){}
+
+BUFFER='sudo_u phy1729 echo foo'
+
+expected_region_highlight=(
+ '1 6 alias' # sudo_u
+ '8 14 default' # phy1729
+ '17 19 command "issue #540"' # echo (not builtin)
+ '21 23 default' # foo
+)
diff --git a/highlighters/main/test-data/alias-precommand-option-argument2.zsh b/highlighters/main/test-data/alias-precommand-option-argument2.zsh
new file mode 100644
index 0000000..fbc6eec
--- /dev/null
+++ b/highlighters/main/test-data/alias-precommand-option-argument2.zsh
@@ -0,0 +1,42 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 sudo_b='sudo -b'
+alias sudo_b_u='sudo_b -u'
+sudo(){}
+
+BUFFER='sudo_b_u phy1729 echo foo'
+
+expected_region_highlight=(
+ '1 8 alias' # sudo_b_u
+ '10 16 default' # phy1729
+ '18 21 command "issue #540"' # echo (not builtin)
+ '23 25 default' # foo
+)
diff --git a/highlighters/main/test-data/alias-precommand-option-argument3.zsh b/highlighters/main/test-data/alias-precommand-option-argument3.zsh
new file mode 100644
index 0000000..373f12b
--- /dev/null
+++ b/highlighters/main/test-data/alias-precommand-option-argument3.zsh
@@ -0,0 +1,42 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# See also param-precommand-option-argument3.zsh
+alias sudo_u='sudo -u'
+sudo(){}
+
+BUFFER='sudo_u phy1729 ls foo'
+
+expected_region_highlight=(
+ '1 6 alias' # sudo_u
+ '8 14 default' # phy1729
+ '16 17 command' # ls
+ '19 21 default' # foo
+)
diff --git a/highlighters/main/test-data/alias-precommand-option-argument.zsh b/highlighters/main/test-data/alias-precommand-option-argument4.zsh
similarity index 91%
rename from highlighters/main/test-data/alias-precommand-option-argument.zsh
rename to highlighters/main/test-data/alias-precommand-option-argument4.zsh
index ac96ad6..d47dccb 100644
--- a/highlighters/main/test-data/alias-precommand-option-argument.zsh
+++ b/highlighters/main/test-data/alias-precommand-option-argument4.zsh
@@ -28,14 +28,15 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
-alias sdu='sudo -u'
+alias sudo_b='sudo -b'
+alias sudo_b_u='sudo_b -u'
sudo(){}
-BUFFER='sdu phy1729 echo foo'
+BUFFER='sudo_b_u phy1729 ls foo'
expected_region_highlight=(
- '1 3 alias' # sdu
- '5 11 default "issue #540"' # phy1729
- '13 16 commmand "issue #540"' # echo (not builtin)
- '18 20 default' # foo
+ '1 8 alias' # sudo_b_u
+ '10 16 default' # phy1729
+ '18 19 command' # ls
+ '21 23 default' # foo
)
diff --git a/highlighters/main/test-data/alias-quoted.zsh b/highlighters/main/test-data/alias-quoted.zsh
index bf397f9..e42e2f0 100644
--- a/highlighters/main/test-data/alias-quoted.zsh
+++ b/highlighters/main/test-data/alias-quoted.zsh
@@ -35,5 +35,5 @@ expected_region_highlight=(
'1 3 unknown-token' # "a"
'5 7 default' # foo
'8 8 commandseparator' # ;
- '10 12 command "issue #544' # \ls
+ '10 12 command' # \ls
)
diff --git a/highlighters/main/test-data/alias-redirect.zsh b/highlighters/main/test-data/alias-redirect.zsh
index 518cdc3..acc3dcb 100644
--- a/highlighters/main/test-data/alias-redirect.zsh
+++ b/highlighters/main/test-data/alias-redirect.zsh
@@ -31,7 +31,7 @@ alias x=\>
BUFFER='x foo echo bar'
expected_region_highlight=(
- '1 1 redirection' # x becomes >
+ '1 1 alias' # x
'3 5 default' # foo
'7 10 builtin' # echo
'12 14 default' # bar
diff --git a/highlighters/main/test-data/alias-to-dir.zsh b/highlighters/main/test-data/alias-to-dir.zsh
new file mode 100644
index 0000000..30390d4
--- /dev/null
+++ b/highlighters/main/test-data/alias-to-dir.zsh
@@ -0,0 +1,36 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 x=/
+BUFFER=$'x'
+
+expected_region_highlight=(
+ '1 1 unknown-token' # x (/)
+)
diff --git a/highlighters/main/test-data/alias-to-dir1b.zsh b/highlighters/main/test-data/alias-to-dir1b.zsh
new file mode 100644
index 0000000..62ec521
--- /dev/null
+++ b/highlighters/main/test-data/alias-to-dir1b.zsh
@@ -0,0 +1,37 @@
+#!/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
+alias x=/
+BUFFER=$'x'
+
+expected_region_highlight=(
+ '1 1 alias' # x
+)
diff --git a/highlighters/main/test-data/alias-unknown-token1.zsh b/highlighters/main/test-data/alias-unknown-token1.zsh
new file mode 100644
index 0000000..9c996bf
--- /dev/null
+++ b/highlighters/main/test-data/alias-unknown-token1.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env 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 a=b b=foo
+
+BUFFER='a '
+
+expected_region_highlight=(
+ '1 1 unknown-token' # a
+)
diff --git a/highlighters/main/test-data/alias-unknown-token2.zsh b/highlighters/main/test-data/alias-unknown-token2.zsh
new file mode 100644
index 0000000..ab9facd
--- /dev/null
+++ b/highlighters/main/test-data/alias-unknown-token2.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env 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 a='() { ls "$@" ; foo }'
+
+BUFFER='a '
+
+expected_region_highlight=(
+ '1 1 unknown-token' # a
+)
diff --git a/highlighters/main/test-data/alias.zsh b/highlighters/main/test-data/alias.zsh
index fd867bf..4cafa80 100644
--- a/highlighters/main/test-data/alias.zsh
+++ b/highlighters/main/test-data/alias.zsh
@@ -27,14 +27,11 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
-alias alias1="unused expansion"
+alias alias1="ls"
alias -s alias2="echo"
-if set -o | grep -q aliasfuncdef; then
- setopt alias_func_def # 5.4+
-fi
-alias1() {} # to check that it's highlighted as an alias, not as a function
+function alias1() {} # to check that it's highlighted as an alias, not as a function
-BUFFER='x.alias2; alias1'
+BUFFER='x.alias2; alias1; alias2'
# Set expected_region_highlight as a function of zsh version.
#
@@ -51,4 +48,6 @@ fi
expected_region_highlight+=(
"9 9 commandseparator" # ;
"11 16 alias" # alias1
+ "17 17 commandseparator" # ;
+ "19 24 unknown-token" # alias2
)
diff --git a/highlighters/main/test-data/always2.zsh b/highlighters/main/test-data/always2.zsh
index f5852c6..991137c 100644
--- a/highlighters/main/test-data/always2.zsh
+++ b/highlighters/main/test-data/always2.zsh
@@ -32,7 +32,7 @@ BUFFER=$'{\nls\n} always { pwd }'
expected_region_highlight=(
'1 1 reserved-word' # {
- '2 2 unknown-token' # \n
+ '2 2 commandseparator' # \n
'3 4 command' # ls
'5 5 commandseparator' # \n
'6 6 reserved-word' # }
diff --git a/highlighters/main/test-data/arith-cmdsubst-mess.zsh b/highlighters/main/test-data/arith-cmdsubst-mess.zsh
new file mode 100644
index 0000000..82268ac
--- /dev/null
+++ b/highlighters/main/test-data/arith-cmdsubst-mess.zsh
@@ -0,0 +1,46 @@
+#!/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=$': $((ls); (ls))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 15 default' # $((ls); (ls))
+ '3 15 command-substitution-unquoted' # $((ls); (ls))
+ '3 4 command-substitution-delimiter-unquoted' # $(
+ '5 5 reserved-word' # (
+ '6 7 command' # ls
+ '8 8 reserved-word' # )
+ '9 9 commandseparator' # ;
+ '11 11 reserved-word' # (
+ '12 13 command' # ls
+ '14 14 reserved-word' # )
+ '15 15 command-substitution-delimiter-unquoted' # )
+)
diff --git a/highlighters/main/test-data/arith1.zsh b/highlighters/main/test-data/arith1.zsh
new file mode 100644
index 0000000..0462f73
--- /dev/null
+++ b/highlighters/main/test-data/arith1.zsh
@@ -0,0 +1,37 @@
+#!/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=$': $(( 6 * 9 ))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 14 default' # $(( 6 * 9 ))
+ '3 14 arithmetic-expansion' # $(( 6 * 9 ))
+)
diff --git a/highlighters/main/test-data/arith2.zsh b/highlighters/main/test-data/arith2.zsh
new file mode 100644
index 0000000..af981d7
--- /dev/null
+++ b/highlighters/main/test-data/arith2.zsh
@@ -0,0 +1,38 @@
+#!/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=$': "$(( 6 * 9 ))"'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 16 default' # "$(( 6 * 9 ))"
+ '3 16 double-quoted-argument' # "$(( 6 * 9 ))"
+ '4 15 arithmetic-expansion' # $(( 6 * 9 ))
+)
diff --git a/highlighters/main/test-data/arithmetic-command-substitution.zsh b/highlighters/main/test-data/arithmetic-command-substitution.zsh
new file mode 100644
index 0000000..07db0fb
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-command-substitution.zsh
@@ -0,0 +1,42 @@
+#!/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=$': $(( $(echo 2) + 2 ))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 22 default' # $(( $(echo 2) + 2 ))
+ '3 22 arithmetic-expansion' # $(( $(echo 2) + 2 ))
+ '7 15 command-substitution-quoted' # $(echo 2)
+ '7 8 command-substitution-delimiter-quoted' # $(
+ '9 12 builtin' # echo
+ '14 14 default' # 2
+ '15 15 command-substitution-delimiter' # )
+)
diff --git a/highlighters/main/test-data/arithmetic-doubled-parens.zsh b/highlighters/main/test-data/arithmetic-doubled-parens.zsh
new file mode 100644
index 0000000..d582d67
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-doubled-parens.zsh
@@ -0,0 +1,37 @@
+#!/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=$': $(( ((42)) ))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 15 default' # $(( ((42)) ))
+ '3 15 arithmetic-expansion' # $(( ((42)) ))
+)
diff --git a/highlighters/main/test-data/arithmetic-empty.zsh b/highlighters/main/test-data/arithmetic-empty.zsh
new file mode 100644
index 0000000..bd75996
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-empty.zsh
@@ -0,0 +1,39 @@
+#!/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=$': "foo"$(())"bar"'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 17 default' # "foo"$(())"bar"
+ '3 7 double-quoted-argument' # "foo"
+ '8 12 arithmetic-expansion' # $(())
+ '13 17 double-quoted-argument' # "bar"
+)
diff --git a/highlighters/main/test-data/arithmetic-hist-expn.zsh b/highlighters/main/test-data/arithmetic-hist-expn.zsh
new file mode 100644
index 0000000..79af723
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-hist-expn.zsh
@@ -0,0 +1,38 @@
+#!/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 builtin' # :
+ '3 11 default' # $(( !! ))
+ '3 11 arithmetic-expansion' # $(( !! ))
+ '7 8 history-expansion "issue #713"' # !!
+)
diff --git a/highlighters/main/test-data/arithmetic-invalid-chars.zsh b/highlighters/main/test-data/arithmetic-invalid-chars.zsh
new file mode 100644
index 0000000..9ace438
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-invalid-chars.zsh
@@ -0,0 +1,39 @@
+#!/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=$': $(( 0 * 1\'\'000 ))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 19 default' # $(( 0 * 1\'\'000 ))
+ '3 19 arithmetic-expansion' # $(( 0 * 1\'\'000 ))
+ '12 12 unknown-token' # \'
+ '13 13 unknown-token' # \'
+)
diff --git a/highlighters/main/test-data/arithmetic-multiplication.zsh b/highlighters/main/test-data/arithmetic-multiplication.zsh
new file mode 100644
index 0000000..65df0c9
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-multiplication.zsh
@@ -0,0 +1,39 @@
+#!/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=$': foo*$(( 42 * 1729 ))*bar'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 26 default' # foo*$(( 42 * 1729 ))*bar
+ '6 6 globbing' # *
+ '7 22 arithmetic-expansion' # $(( 42 * 1729 ))
+ '23 23 globbing' # *
+)
diff --git a/highlighters/main/test-data/arithmetic-nested.zsh b/highlighters/main/test-data/arithmetic-nested.zsh
new file mode 100644
index 0000000..d734cd3
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-nested.zsh
@@ -0,0 +1,38 @@
+#!/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=$': $(( $(( 1 + 2 )) * 3 ))'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 25 default' # $(( $(( 1 + 2 )) * 3 ))
+ '3 25 arithmetic-expansion' # $(( $(( 1 + 2 )) * 3 ))
+ '7 18 arithmetic-expansion' # $(( 1 + 2 ))
+)
diff --git a/highlighters/main/test-data/arithmetic-quoted.zsh b/highlighters/main/test-data/arithmetic-quoted.zsh
new file mode 100644
index 0000000..917ddf7
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-quoted.zsh
@@ -0,0 +1,38 @@
+#!/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=$': "$(( 1 + 1 ))"'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 16 default' # "$(( 1 + 1 ))"
+ '3 16 double-quoted-argument' # "$(( 1 + 1 ))"
+ '4 15 arithmetic-expansion' # $(( 1 + 1 ))
+)
diff --git a/highlighters/main/test-data/arithmetic-unclosed.zsh b/highlighters/main/test-data/arithmetic-unclosed.zsh
new file mode 100644
index 0000000..aa4eac7
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-unclosed.zsh
@@ -0,0 +1,37 @@
+#!/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=$': $(( 1'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 7 default' # $(( 1
+ '3 7 arithmetic-expansion' # $(( 1
+)
diff --git a/highlighters/main/test-data/arithmetic-unfinished.zsh b/highlighters/main/test-data/arithmetic-unfinished.zsh
new file mode 100644
index 0000000..916c3da
--- /dev/null
+++ b/highlighters/main/test-data/arithmetic-unfinished.zsh
@@ -0,0 +1,41 @@
+#!/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=$': $(( 1729 )'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 12 default' # $(( 1729 )
+ '3 12 arithmetic-expansion' # $(( 1729 )
+)
+
+if [[ ${(z):-'$('} == '$( ' ]]; then # ignore zsh 5.0.8 bug
+ expected_region_highlight[2]='3 13 default' # $(( 1729 )
+fi
diff --git a/highlighters/main/test-data/array-cmdsep1.zsh b/highlighters/main/test-data/array-cmdsep1.zsh
new file mode 100644
index 0000000..2fd55c0
--- /dev/null
+++ b/highlighters/main/test-data/array-cmdsep1.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'a=( foo | bar )'
+bar(){}
+
+expected_region_highlight=(
+ '1 3 assign' # a=(
+ '3 3 reserved-word' # (
+ '5 7 default' # foo
+ '9 9 unknown-token' # |
+ # zsh reports a parse error at this point. Nevertheless, we test how we
+ # highlight the remainder of $BUFFER. Currently we recover by treating the pipe
+ # as a command separator. That's not the only reasonable behaviour, though; if
+ # we change the behaviour, we should adjust the following expectations accordingly.
+ '11 13 function' # bar
+ '15 15 unknown-token' # )
+)
diff --git a/highlighters/main/test-data/array-cmdsep2.zsh b/highlighters/main/test-data/array-cmdsep2.zsh
new file mode 100644
index 0000000..0bda676
--- /dev/null
+++ b/highlighters/main/test-data/array-cmdsep2.zsh
@@ -0,0 +1,41 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'a=( foo ; bar )'
+
+expected_region_highlight=(
+ '1 3 assign' # a=(
+ '3 3 reserved-word' # (
+ '5 7 default' # foo
+ '9 9 unknown-token' # ; (not commandseparator; see highlighter source code)
+ '11 13 default' # bar
+ '15 15 assign' # )
+ '15 15 reserved-word' # )
+)
diff --git a/highlighters/main/test-data/array-cmdsep3.zsh b/highlighters/main/test-data/array-cmdsep3.zsh
new file mode 100644
index 0000000..b4b3687
--- /dev/null
+++ b/highlighters/main/test-data/array-cmdsep3.zsh
@@ -0,0 +1,41 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'a=( foo \n bar )'
+
+expected_region_highlight=(
+ '1 3 assign' # a=(
+ '3 3 reserved-word' # (
+ '5 7 default' # foo
+ '9 9 commandseparator' # \n
+ '11 13 default' # bar
+ '15 15 assign' # )
+ '15 15 reserved-word' # )
+)
diff --git a/highlighters/main/test-data/assign-append.zsh b/highlighters/main/test-data/assign-append.zsh
index eb9fbbd..feb68e5 100644
--- a/highlighters/main/test-data/assign-append.zsh
+++ b/highlighters/main/test-data/assign-append.zsh
@@ -31,7 +31,9 @@ BUFFER='a+=(lorem ipsum)'
expected_region_highlight=(
"1 4 assign" # a+=(
+ "4 4 reserved-word" # (
"5 9 default" # lorem
"11 15 default" # ipsum
"16 16 assign" # )
+ "16 16 reserved-word" # )
)
diff --git a/highlighters/main/test-data/assign-array.zsh b/highlighters/main/test-data/assign-array.zsh
index 0624f9b..ef0a666 100644
--- a/highlighters/main/test-data/assign-array.zsh
+++ b/highlighters/main/test-data/assign-array.zsh
@@ -32,8 +32,10 @@ BUFFER='(A=(hello world))'
expected_region_highlight=(
"1 1 reserved-word" # (
"2 4 assign" # A=(
+ "4 4 reserved-word" # (
"5 9 default" # hello
"11 15 default" # world
"16 16 assign" # )
+ "16 16 reserved-word" # )
"17 17 reserved-word" # )
)
diff --git a/highlighters/main/test-data/assign-array2.zsh b/highlighters/main/test-data/assign-array2.zsh
index cdc9e63..2d48721 100644
--- a/highlighters/main/test-data/assign-array2.zsh
+++ b/highlighters/main/test-data/assign-array2.zsh
@@ -31,8 +31,10 @@ BUFFER='A=(hello world) ls'
expected_region_highlight=(
"1 3 assign" # A=(
+ "3 3 reserved-word" # (
"4 8 default" # hello
"10 14 default" # world
"15 15 assign" # )
+ "15 15 reserved-word" # )
"17 18 command" # ls
)
diff --git a/highlighters/main/test-data/assign-array3.zsh b/highlighters/main/test-data/assign-array3.zsh
index 986d71f..5eb645e 100644
--- a/highlighters/main/test-data/assign-array3.zsh
+++ b/highlighters/main/test-data/assign-array3.zsh
@@ -31,9 +31,11 @@ BUFFER='A=(hello world) b=42'
expected_region_highlight=(
"1 3 assign" # A=(
+ "3 3 reserved-word" # (
"4 8 default" # hello
"10 14 default" # world
"15 15 assign" # )
+ "15 15 reserved-word" # )
"17 20 assign" # b=42
"19 20 default" # 42
)
diff --git a/highlighters/main/test-data/assign-invalid-command.zsh b/highlighters/main/test-data/assign-invalid-command.zsh
new file mode 100644
index 0000000..557327e
--- /dev/null
+++ b/highlighters/main/test-data/assign-invalid-command.zsh
@@ -0,0 +1,37 @@
+#!/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=$'x=y nosuchcommand'
+
+expected_region_highlight=(
+ '1 3 assign' # x=y
+ '3 3 default' # y
+ '5 17 unknown-token' # nosuchcommand
+)
diff --git a/highlighters/main/test-data/assign-quoted-cmdsubst.zsh b/highlighters/main/test-data/assign-quoted-cmdsubst.zsh
new file mode 100644
index 0000000..d4a62df
--- /dev/null
+++ b/highlighters/main/test-data/assign-quoted-cmdsubst.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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="$(ls x y z)"'
+
+expected_region_highlight=(
+ '1 15 assign' # x="$(ls x y z)"
+ '3 15 default' # "$(ls x y z)"
+ '3 3 double-quoted-argument' # "
+ '15 15 double-quoted-argument' # "
+ '4 14 command-substitution-quoted' # $(ls x y z)
+ '4 5 command-substitution-delimiter-quoted' # $(
+ '6 7 command' # ls
+ '9 9 default' # x
+ '11 11 default' # y
+ '13 13 default' # z
+ '14 14 command-substitution-delimiter-quoted' # )
+)
diff --git a/highlighters/main/test-data/assign-value-quote1.zsh b/highlighters/main/test-data/assign-value-quote1.zsh
new file mode 100644
index 0000000..b6d04fe
--- /dev/null
+++ b/highlighters/main/test-data/assign-value-quote1.zsh
@@ -0,0 +1,37 @@
+#!/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=$'s="foo\'bar"'
+
+expected_region_highlight=(
+ '1 11 assign' # s="foo'bar"
+ '3 11 default' # "foo'bar"
+ '3 11 double-quoted-argument' # "foo'bar"
+)
diff --git a/highlighters/main/test-data/assign-value-quote2.zsh b/highlighters/main/test-data/assign-value-quote2.zsh
new file mode 100644
index 0000000..3c5f93b
--- /dev/null
+++ b/highlighters/main/test-data/assign-value-quote2.zsh
@@ -0,0 +1,37 @@
+#!/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=$'s="foo \'\' bar"'
+
+expected_region_highlight=(
+ '1 14 assign' # s="foo '' bar"
+ '3 14 default' # "foo '' bar"
+ '3 14 double-quoted-argument' # "foo '' bar"
+)
diff --git a/highlighters/main/test-data/assign.zsh b/highlighters/main/test-data/assign.zsh
index 6e797ac..c6e8532 100644
--- a/highlighters/main/test-data/assign.zsh
+++ b/highlighters/main/test-data/assign.zsh
@@ -33,8 +33,10 @@ expected_region_highlight=(
"1 3 assign" # A=1
"3 3 default" # 1
"5 7 assign" # b=(
+ "7 7 reserved-word" # (
"8 12 default" # "foo"
"8 12 double-quoted-argument" # "foo"
"14 16 default" # bar
"17 17 assign" # )
+ "17 17 reserved-word" # )
)
diff --git a/highlighters/main/test-data/assignment-before-resword1.zsh b/highlighters/main/test-data/assignment-before-resword1.zsh
new file mode 100644
index 0000000..b271d4a
--- /dev/null
+++ b/highlighters/main/test-data/assignment-before-resword1.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env 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=$'foo=bar { :; }'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 9 unknown-token' # {
+ '11 11 builtin' # :
+ '12 12 commandseparator' # ;
+ '14 14 reserved-word' # }
+)
diff --git a/highlighters/main/test-data/assignment-before-resword2.zsh b/highlighters/main/test-data/assignment-before-resword2.zsh
new file mode 100644
index 0000000..247e41e
--- /dev/null
+++ b/highlighters/main/test-data/assignment-before-resword2.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env 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=$'foo=bar ( :; )'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 9 unknown-token' # (
+ '11 11 builtin' # :
+ '12 12 commandseparator' # ;
+ '14 14 unknown-token' # )
+)
diff --git a/highlighters/main/test-data/assignment-before-resword3.zsh b/highlighters/main/test-data/assignment-before-resword3.zsh
new file mode 100644
index 0000000..5204189
--- /dev/null
+++ b/highlighters/main/test-data/assignment-before-resword3.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env 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=$'foo=bar (( foo ))'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 17 unknown-token' # (( foo ))
+)
diff --git a/highlighters/main/test-data/assignment-before-resword4.zsh b/highlighters/main/test-data/assignment-before-resword4.zsh
new file mode 100644
index 0000000..cc3d523
--- /dev/null
+++ b/highlighters/main/test-data/assignment-before-resword4.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env 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=$'foo=bar [[ -n foo ]]'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 10 unknown-token' # [[
+ '12 13 single-hyphen-option' # -n
+ '15 17 default' # foo
+ '19 20 reserved-word' # ]]
+)
diff --git a/highlighters/main/test-data/assignment-before-resword5.zsh b/highlighters/main/test-data/assignment-before-resword5.zsh
new file mode 100644
index 0000000..33f1ed1
--- /dev/null
+++ b/highlighters/main/test-data/assignment-before-resword5.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env 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=$'foo=bar \! :'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 9 unknown-token' # \!
+ '11 11 builtin' # :
+)
diff --git a/highlighters/main/test-data/assignment-quoted.zsh b/highlighters/main/test-data/assignment-quoted.zsh
new file mode 100644
index 0000000..18638ad
--- /dev/null
+++ b/highlighters/main/test-data/assignment-quoted.zsh
@@ -0,0 +1,37 @@
+#!/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=$'1="foo"'
+
+expected_region_highlight=(
+ '1 7 assign' # 1="foo"
+ '3 7 default' # "foo"
+ '3 7 double-quoted-argument' # "foo"
+)
diff --git a/highlighters/main/test-data/backslash-continuation2.zsh b/highlighters/main/test-data/backslash-continuation2.zsh
new file mode 100644
index 0000000..9e2ca62
--- /dev/null
+++ b/highlighters/main/test-data/backslash-continuation2.zsh
@@ -0,0 +1,37 @@
+#!/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=$'echo foo\\\nbar"baz"'
+
+expected_region_highlight=(
+ '1 4 builtin' # echo
+ '6 18 default "issue #705"' # foo\\\nbar"baz"
+ '14 18 double-quoted-argument "issue #705"' # "baz"
+)
diff --git a/highlighters/main/test-data/backslash.zsh b/highlighters/main/test-data/backslash.zsh
new file mode 100644
index 0000000..ea0977f
--- /dev/null
+++ b/highlighters/main/test-data/backslash.zsh
@@ -0,0 +1,34 @@
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 unknown-token' # \\
+)
diff --git a/highlighters/main/test-data/bang-assign-array.zsh b/highlighters/main/test-data/bang-assign-array.zsh
new file mode 100644
index 0000000..a54cf2d
--- /dev/null
+++ b/highlighters/main/test-data/bang-assign-array.zsh
@@ -0,0 +1,42 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'foo=(bar abaz) \! ls'
+
+expected_region_highlight=(
+ '1 5 assign' # foo=(
+ '5 5 reserved-word' # (
+ '6 8 default' # bar
+ '10 13 default' # abaz
+ '14 14 assign' # )
+ '14 14 reserved-word' # )
+ '16 16 unknown-token' # \!
+ '18 19 command' # ls
+)
diff --git a/highlighters/main/test-data/bang-assign-scalar.zsh b/highlighters/main/test-data/bang-assign-scalar.zsh
new file mode 100644
index 0000000..e919050
--- /dev/null
+++ b/highlighters/main/test-data/bang-assign-scalar.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'foo=bar \! ls'
+
+expected_region_highlight=(
+ '1 7 assign' # foo=bar
+ '5 7 default' # bar
+ '9 9 unknown-token' # \!
+ '11 12 command' # ls
+)
diff --git a/highlighters/main/test-data/bang-pipeline.zsh b/highlighters/main/test-data/bang-pipeline.zsh
new file mode 100644
index 0000000..fef25f1
--- /dev/null
+++ b/highlighters/main/test-data/bang-pipeline.zsh
@@ -0,0 +1,39 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'\! ls | \! ls'
+
+expected_region_highlight=(
+ '1 1 reserved-word' # \!
+ '3 4 command' # ls
+ '6 6 commandseparator' # |
+ '8 8 unknown-token' # \!
+ '10 11 command' # ls
+)
diff --git a/highlighters/main/test-data/brackets-matching1.zsh b/highlighters/main/test-data/brackets-matching1.zsh
new file mode 100644
index 0000000..7cc6de5
--- /dev/null
+++ b/highlighters/main/test-data/brackets-matching1.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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='[[ -n foo ]]'
+
+expected_region_highlight=(
+ '1 2 reserved-word' # [[
+ '4 5 single-hyphen-option' # -n
+ '7 9 default' # foo
+ '11 12 reserved-word' # ]]
+)
diff --git a/highlighters/main/test-data/brackets-matching2.zsh b/highlighters/main/test-data/brackets-matching2.zsh
new file mode 100644
index 0000000..19c7f0d
--- /dev/null
+++ b/highlighters/main/test-data/brackets-matching2.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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='[ -n foo ]'
+
+expected_region_highlight=(
+ '1 1 builtin' # [
+ '3 4 single-hyphen-option' # -n
+ '6 8 default' # foo
+ '10 10 builtin' # ]
+)
diff --git a/highlighters/main/test-data/brackets-premature-termination.zsh b/highlighters/main/test-data/brackets-premature-termination.zsh
new file mode 100644
index 0000000..fa813da
--- /dev/null
+++ b/highlighters/main/test-data/brackets-premature-termination.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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='[[ -n foo; echo ]]'
+
+expected_region_highlight=(
+ '1 2 reserved-word' # [[
+ '4 5 single-hyphen-option' # -n
+ '7 9 default' # foo
+ '10 10 unknown-token' # ;
+ '12 15 builtin' # echo
+ '17 18 default' # ]]
+)
diff --git a/highlighters/main/test-data/cdpath-abspath.zsh b/highlighters/main/test-data/cdpath-abspath.zsh
new file mode 100644
index 0000000..64707b2
--- /dev/null
+++ b/highlighters/main/test-data/cdpath-abspath.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+cdpath=( $PWD )
+mkdir foo foo/bar
+
+BUFFER="/foo"
+
+expected_region_highlight=(
+ '1 4 unknown-token' # x (/)
+)
diff --git a/highlighters/main/test-data/cmdpos-elision-partial.zsh b/highlighters/main/test-data/cmdpos-elision-partial.zsh
new file mode 100644
index 0000000..6eda0d7
--- /dev/null
+++ b/highlighters/main/test-data/cmdpos-elision-partial.zsh
@@ -0,0 +1,44 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# Test elision of some, but not all of the words
+# See issue #667 for the case of eliding all words
+local -a x; x=(sudo "")
+
+sudo(){}
+BUFFER=$'$x -u phy1729 ls'
+
+expected_region_highlight=(
+ '1 2 precommand' # $x
+ # The "" is elided. If it weren't elided, the «ls» would be highlighted as an ordinary argument.
+ '4 5 single-hyphen-option' # -u
+ '7 13 default' # phy1729
+ '15 16 command' # ls
+)
diff --git a/highlighters/main/test-data/command-substitution-adjacent.zsh b/highlighters/main/test-data/command-substitution-adjacent.zsh
new file mode 100644
index 0000000..3d5c0b9
--- /dev/null
+++ b/highlighters/main/test-data/command-substitution-adjacent.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER='echo "$(echo)$(echo)'
+
+expected_region_highlight=(
+ '1 4 builtin' # echo
+ '6 20 default' # "$(echo)$(echo)
+ '6 6 double-quoted-argument-unclosed' # "
+ '7 13 command-substitution-quoted' # $(echo)
+ '7 8 command-substitution-delimiter-quoted' # $(
+ '9 12 builtin' # echo
+ '13 13 command-substitution-delimiter-quoted' # )
+ '14 20 command-substitution-quoted' # $(echo)
+ '14 15 command-substitution-delimiter-quoted' # $(
+ '16 19 builtin' # echo
+ '20 20 command-substitution-delimiter-quoted' # )
+)
diff --git a/highlighters/main/test-data/command-substitution-in-assignment.zsh b/highlighters/main/test-data/command-substitution-in-assignment.zsh
index 010df7f..fafda49 100644
--- a/highlighters/main/test-data/command-substitution-in-assignment.zsh
+++ b/highlighters/main/test-data/command-substitution-in-assignment.zsh
@@ -33,10 +33,10 @@ BUFFER=$'foo=$(echo bar) :'
expected_region_highlight=(
'1 15 assign' # foo=$(echo bar)
'5 15 default' # $(echo bar)
- '5 15 command-substitution' # $(echo bar)
- '5 6 command-substitution-delimiter' # $(
+ '5 15 command-substitution-unquoted' # $(echo bar)
+ '5 6 command-substitution-delimiter-unquoted' # $(
'7 10 builtin' # echo
'12 14 default' # bar
- '15 15 command-substitution-delimiter' # )
+ '15 15 command-substitution-delimiter-unquoted' # )
'17 17 builtin' # :
)
diff --git a/highlighters/main/test-data/command-substitution-unclosed.zsh b/highlighters/main/test-data/command-substitution-unclosed.zsh
index 570471b..3229dfc 100644
--- a/highlighters/main/test-data/command-substitution-unclosed.zsh
+++ b/highlighters/main/test-data/command-substitution-unclosed.zsh
@@ -33,12 +33,13 @@ BUFFER=$': foo$(echo bar'
expected_region_highlight=(
'1 1 builtin' # :
'3 15 default' # foo$(echo bar
- '6 15 command-substitution' # $(echo bar
- '6 7 command-substitution-delimiter' # $(
+ '6 15 command-substitution-unquoted' # $(echo bar
+ '6 7 command-substitution-delimiter-unquoted' # $(
'8 11 builtin' # echo
'13 15 default' # bar
)
if [[ ${(z):-'$('} == '$( ' ]]; then # ignore zsh 5.0.8 bug
expected_region_highlight[2]='3 16 default' # foo$(echo bar
+ expected_region_highlight[3]='6 16 command-substitution-unquoted' # $(echo bar
fi
diff --git a/highlighters/main/test-data/comment-followed.zsh b/highlighters/main/test-data/comment-followed.zsh
index 8c7e42c..044f283 100644
--- a/highlighters/main/test-data/comment-followed.zsh
+++ b/highlighters/main/test-data/comment-followed.zsh
@@ -28,11 +28,12 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
+# see alias-comment1.zsh
setopt interactivecomments
BUFFER=$'# foo\ntrue'
expected_region_highlight=(
'1 5 comment' # # foo
- '6 6 commandseparator "issue #501"' # \n
+ '6 6 commandseparator' # \n
'7 10 builtin' # true
)
diff --git a/highlighters/main/test-data/cthulhu.zsh b/highlighters/main/test-data/cthulhu.zsh
index 7a1b7f1..c8119a8 100644
--- a/highlighters/main/test-data/cthulhu.zsh
+++ b/highlighters/main/test-data/cthulhu.zsh
@@ -53,8 +53,8 @@ expected_region_highlight=(
'55 58 double-quoted-argument-unclosed' # "lhu
'59 62 back-quoted-argument-delimiter' # \\\`
'64 112 default' # R\\'ly$(echo eh wag\\\`echo h\'nag\\\`'l' fht)agn
- '70 109 command-substitution' # $(echo eh wag\\\`echo h\'nag\\\`'l' fht)
- '70 71 command-substitution-delimiter' # $(
+ '70 109 command-substitution-unquoted' # $(echo eh wag\\\`echo h\'nag\\\`'l' fht)
+ '70 71 command-substitution-delimiter-unquoted' # $(
'72 75 builtin' # echo
'77 78 default' # eh
'80 104 default' # wag\\\`echo h\'nag\\\`'l'
@@ -65,6 +65,6 @@ expected_region_highlight=(
'98 101 back-quoted-argument-delimiter' # \\\`
'102 104 single-quoted-argument' # 'l'
'106 108 default' # fht
- '109 109 command-substitution-delimiter' # )
+ '109 109 command-substitution-delimiter-unquoted' # )
'113 113 unknown-token' # `
)
diff --git a/highlighters/main/test-data/dinbrack1.zsh b/highlighters/main/test-data/dinbrack1.zsh
new file mode 100644
index 0000000..e2279d6
--- /dev/null
+++ b/highlighters/main/test-data/dinbrack1.zsh
@@ -0,0 +1,41 @@
+#!/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=$'[[ foo && bar || baz ]]'
+
+expected_region_highlight=(
+ '1 2 reserved-word' # [[
+ '4 6 default' # foo
+ '8 9 default' # &&
+ '11 13 default' # bar
+ '15 16 default' # ||
+ '18 20 default' # baz
+ '22 23 reserved-word' # ]]
+)
diff --git a/highlighters/main/test-data/dirs_blacklist.zsh b/highlighters/main/test-data/dirs_blacklist.zsh
index 8cf04be..2d0222f 100644
--- a/highlighters/main/test-data/dirs_blacklist.zsh
+++ b/highlighters/main/test-data/dirs_blacklist.zsh
@@ -30,7 +30,7 @@
mkdir foo
touch foo/bar
BUFFER=": foo/bar $PWD/foo foo/b"
-X_ZSH_HIGHLIGHT_DIRS_BLACKLIST=($PWD/foo $PWD/bar)
+ZSH_HIGHLIGHT_DIRS_BLACKLIST=($PWD/foo $PWD/bar)
expected_region_highlight=(
'1 1 builtin' # :
diff --git a/highlighters/main/test-data/dollar-paren.zsh b/highlighters/main/test-data/dollar-paren.zsh
index f051e4a..2bbcef1 100644
--- a/highlighters/main/test-data/dollar-paren.zsh
+++ b/highlighters/main/test-data/dollar-paren.zsh
@@ -28,14 +28,22 @@
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
-BUFFER=': "$(:)"'
+BUFFER=': "$(:)" "foo$(:)bar'
expected_region_highlight=(
'1 1 builtin' # :
'3 8 default' # "$(:)"
- '3 8 double-quoted-argument' # "$(:)"
- '4 7 command-substitution' # $(:)
- '4 5 command-substitution-delimiter' # $(
+ '3 3 double-quoted-argument' # "$(:)"
+ '8 8 double-quoted-argument' # "$(:)"
+ '4 7 command-substitution-quoted' # $(:)
+ '4 5 command-substitution-delimiter-quoted' # $(
'6 6 builtin' # :
- '7 7 command-substitution-delimiter' # )
+ '7 7 command-substitution-delimiter-quoted' # )
+ '10 20 default' # "foo$(:)bar
+ '10 13 double-quoted-argument-unclosed' # "foo
+ '18 20 double-quoted-argument-unclosed' # bar
+ '14 17 command-substitution-quoted' # $(:)
+ '14 15 command-substitution-delimiter-quoted' # $(
+ '16 16 builtin' # :
+ '17 17 command-substitution-delimiter-quoted' # )
)
diff --git a/highlighters/main/test-data/empty-command-newline.zsh b/highlighters/main/test-data/empty-command-newline.zsh
new file mode 100644
index 0000000..4b7b35c
--- /dev/null
+++ b/highlighters/main/test-data/empty-command-newline.zsh
@@ -0,0 +1,39 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# Newline after semicolon isn't unknown-token
+BUFFER=$':;\n:'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '2 2 commandseparator' # ;
+ '3 3 commandseparator' # \n
+ '4 4 builtin' # :
+)
diff --git a/highlighters/main/test-data/empty-line.zsh b/highlighters/main/test-data/empty-line.zsh
new file mode 100644
index 0000000..a4d6685
--- /dev/null
+++ b/highlighters/main/test-data/empty-line.zsh
@@ -0,0 +1,36 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'\\\n; ls'
+
+expected_region_highlight=(
+ '3 3 unknown-token' # ;
+ '5 6 command' # ls
+)
diff --git a/highlighters/main/test-data/equals1.zsh b/highlighters/main/test-data/equals1.zsh
new file mode 100644
index 0000000..77f46e8
--- /dev/null
+++ b/highlighters/main/test-data/equals1.zsh
@@ -0,0 +1,36 @@
+#!/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=$': =ls'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 5 path' # =ls
+)
diff --git a/highlighters/main/test-data/equals2.zsh b/highlighters/main/test-data/equals2.zsh
new file mode 100644
index 0000000..bd59ff7
--- /dev/null
+++ b/highlighters/main/test-data/equals2.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+unsetopt equals
+
+BUFFER=$': =nosuchcommand'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 16 default' # =nosuchcommand
+)
diff --git a/highlighters/main/test-data/equals3.zsh b/highlighters/main/test-data/equals3.zsh
new file mode 100644
index 0000000..8c10789
--- /dev/null
+++ b/highlighters/main/test-data/equals3.zsh
@@ -0,0 +1,36 @@
+#!/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=$': =nosuchcommand'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 16 unknown-token' # =nosuchcommand
+)
diff --git a/highlighters/main/test-data/equals4.zsh b/highlighters/main/test-data/equals4.zsh
new file mode 100644
index 0000000..28bc214
--- /dev/null
+++ b/highlighters/main/test-data/equals4.zsh
@@ -0,0 +1,36 @@
+#!/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 builtin' # :
+ '3 3 default' # =
+)
diff --git a/highlighters/main/test-data/exec-redirection1.zsh b/highlighters/main/test-data/exec-redirection1.zsh
index caec2f1..78a0c62 100644
--- a/highlighters/main/test-data/exec-redirection1.zsh
+++ b/highlighters/main/test-data/exec-redirection1.zsh
@@ -31,8 +31,8 @@ BUFFER='exec {foo}>&/tmp ls'
expected_region_highlight=(
"1 4 precommand" # exec
- "6 10 redirection 'issue #238'" # {foo}
+ "6 10 named-fd" # {foo}
"11 12 redirection" # >&
"13 16 path" # /tmp
- "18 19 command 'issue #238'" # ls
+ "18 19 command" # ls
)
diff --git a/highlighters/main/test-data/fd-target-not-filename.zsh b/highlighters/main/test-data/fd-target-not-filename.zsh
new file mode 100644
index 0000000..5c3cd08
--- /dev/null
+++ b/highlighters/main/test-data/fd-target-not-filename.zsh
@@ -0,0 +1,40 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+touch 2
+
+BUFFER=$'echo foo>&2'
+
+expected_region_highlight=(
+ '1 4 builtin' # echo
+ '6 8 default' # foo
+ '9 10 redirection' # >&
+ '11 11 numeric-fd' # 2 (not path)
+)
diff --git a/highlighters/main/test-data/function-altsyntax.zsh b/highlighters/main/test-data/function-altsyntax.zsh
new file mode 100644
index 0000000..0f9a833
--- /dev/null
+++ b/highlighters/main/test-data/function-altsyntax.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 named and anonymous function using the alternative syntax
+BUFFER=$'function f { pwd }; function { pwd }'
+
+expected_region_highlight=(
+ '1 8 reserved-word' # function
+ '10 10 default' # f
+ '12 12 reserved-word "issue #237"' # {
+ '14 16 command "issue #237"' # pwd
+ '18 18 reserved-word "issue #237"' # }
+ '19 19 commandseparator' # ;
+ '21 28 reserved-word' # function
+ '30 30 reserved-word "issue #237"' # {
+ '32 34 command "issue #237"' # pwd
+ '36 36 reserved-word "issue #237"' # }
+)
diff --git a/highlighters/main/test-data/global-alias1.zsh b/highlighters/main/test-data/global-alias1.zsh
new file mode 100644
index 0000000..0022de3
--- /dev/null
+++ b/highlighters/main/test-data/global-alias1.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+alias -g foo=bar
+
+BUFFER=$'foo foo'
+
+expected_region_highlight=(
+ '1 3 global-alias' # foo
+ '5 7 global-alias' # foo
+)
diff --git a/highlighters/main/test-data/history-double-quoted-followed.zsh b/highlighters/main/test-data/history-double-quoted-followed.zsh
new file mode 100644
index 0000000..6421ced
--- /dev/null
+++ b/highlighters/main/test-data/history-double-quoted-followed.zsh
@@ -0,0 +1,39 @@
+#!/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 builtin' # :
+ '3 4 history-expansion "issue #713"' # !!
+ '7 11 default' # "!!="
+ '7 11 double-quoted-argument' # "!!="
+ '8 9 history-expansion "issue #713' # !!
+)
diff --git a/highlighters/main/test-data/jobsubst-isnt-glob.zsh b/highlighters/main/test-data/jobsubst-isnt-glob.zsh
new file mode 100644
index 0000000..3a7e325
--- /dev/null
+++ b/highlighters/main/test-data/jobsubst-isnt-glob.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018.9958 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=$': %? %?foo'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 4 default' # %?
+ '6 10 default' # %?foo
+)
diff --git a/highlighters/main/test-data/jobsubst-isnt-glob2.zsh b/highlighters/main/test-data/jobsubst-isnt-glob2.zsh
new file mode 100644
index 0000000..51930bf
--- /dev/null
+++ b/highlighters/main/test-data/jobsubst-isnt-glob2.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$': foo%?bar'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 10 default' # foo%?bar
+ '7 7 globbing' # ?
+)
diff --git a/highlighters/main/test-data/loop-newline.zsh b/highlighters/main/test-data/loop-newline.zsh
new file mode 100644
index 0000000..d39ee11
--- /dev/null
+++ b/highlighters/main/test-data/loop-newline.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'for i in \\\n; do done'
+
+expected_region_highlight=(
+ '1 3 reserved-word' # for
+ '5 5 default' # i
+ '7 8 default' # in
+ '12 12 commandseparator' # ;
+ '14 15 reserved-word' # do
+ '17 20 reserved-word' # done
+)
diff --git a/highlighters/main/test-data/meta-no-eval1.zsh b/highlighters/main/test-data/meta-no-eval1.zsh
new file mode 100644
index 0000000..bb04077
--- /dev/null
+++ b/highlighters/main/test-data/meta-no-eval1.zsh
@@ -0,0 +1,49 @@
+#!/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=$': $(kill -9 $$) ${:-$(kill -9 $$)}'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 15 default' # $(kill -9 $$)
+ '3 15 command-substitution-unquoted' # $(kill -9 $$)
+ '3 4 command-substitution-delimiter-unquoted' # $(
+ '5 8 builtin' # kill
+ '10 11 single-hyphen-option' # -9
+ '13 14 default' # $$
+ '15 15 command-substitution-delimiter-unquoted' # )
+ '17 34 default' # ${:-$(kill -9 $$)}
+ '21 33 command-substitution-unquoted' # $(kill -9 $$)
+ '21 22 command-substitution-delimiter-unquoted' # $(
+ '23 26 builtin' # kill
+ '28 29 single-hyphen-option' # -9
+ '31 32 default' # $$
+ '33 33 command-substitution-delimiter-unquoted' # )
+)
diff --git a/highlighters/main/test-data/meta-no-eval2.zsh b/highlighters/main/test-data/meta-no-eval2.zsh
new file mode 100644
index 0000000..61ef089
--- /dev/null
+++ b/highlighters/main/test-data/meta-no-eval2.zsh
@@ -0,0 +1,40 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# We aren't testing how this is highlighted; we're testing that it's not
+# evaluated. If it gets evaluated, the test suite will die.
+BUFFER=$': /(e*exit 42*)'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 15 default' # /(e*exit 42*)
+ '6 6 globbing' # *
+ '14 14 globbing' # *
+)
diff --git a/highlighters/main/test-data/multiline-array-assignment1.zsh b/highlighters/main/test-data/multiline-array-assignment1.zsh
index 3734c7a..8906cfd 100644
--- a/highlighters/main/test-data/multiline-array-assignment1.zsh
+++ b/highlighters/main/test-data/multiline-array-assignment1.zsh
@@ -32,8 +32,10 @@ BUFFER=$'foo=(\nbar) env'
expected_region_highlight=(
'1 5 assign' # foo=(
+ '5 5 reserved-word' # (
'6 6 commandseparator' # \n
'7 9 default' # bar
'10 10 assign' # )
- '12 14 command' # env
+ '10 10 reserved-word' # )
+ '12 14 precommand' # env
)
diff --git a/highlighters/main/test-data/multios-negates-globbing.zsh b/highlighters/main/test-data/multios-negates-globbing.zsh
new file mode 100644
index 0000000..7ece670
--- /dev/null
+++ b/highlighters/main/test-data/multios-negates-globbing.zsh
@@ -0,0 +1,39 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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
+# -------------------------------------------------------------------------------------------------
+
+unsetopt multios
+
+BUFFER=$'cat < *'
+
+expected_region_highlight=(
+ '1 3 command' # cat
+ '5 5 redirection' # <
+ '7 7 default' # * - not globbing
+)
diff --git a/highlighters/main/test-data/multios-negates-globbing2.zsh b/highlighters/main/test-data/multios-negates-globbing2.zsh
new file mode 100644
index 0000000..b6db983
--- /dev/null
+++ b/highlighters/main/test-data/multios-negates-globbing2.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'cat < *'
+
+expected_region_highlight=(
+ '1 3 command' # cat
+ '5 5 redirection' # <
+ '7 7 default' # *
+ '7 7 globbing' # *
+)
diff --git a/highlighters/main/test-data/noglob-always.zsh b/highlighters/main/test-data/noglob-always.zsh
new file mode 100644
index 0000000..6d55048
--- /dev/null
+++ b/highlighters/main/test-data/noglob-always.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'{ noglob echo * } always { echo * }'
+
+expected_region_highlight=(
+ '1 1 reserved-word' # {
+ '3 8 precommand' # noglob
+ '10 13 builtin' # echo
+ '15 15 default' # *
+ '17 17 reserved-word' # }
+ '19 24 reserved-word' # always
+ '26 26 reserved-word' # {
+ '28 31 builtin' # echo
+ '33 33 default' # *
+ '33 33 globbing' # *
+ '35 35 reserved-word' # }
+)
diff --git a/highlighters/main/test-data/noglob4.zsh b/highlighters/main/test-data/noglob4.zsh
new file mode 100644
index 0000000..cc7065f
--- /dev/null
+++ b/highlighters/main/test-data/noglob4.zsh
@@ -0,0 +1,45 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$'noglob cat <(print -r -- *)'
+
+expected_region_highlight=(
+ '1 6 precommand' # noglob
+ '8 10 command' # cat
+ '12 27 default' # <(print -r -- *)
+ '12 27 process-substitution' # <(print -r -- *)
+ '12 13 process-substitution-delimiter' # <(
+ '14 18 builtin' # print
+ '20 21 single-hyphen-option' # -r
+ '23 24 double-hyphen-option' # --
+ '26 26 default' # *
+ '26 26 globbing' # *
+ '27 27 process-substitution-delimiter' # )
+)
diff --git a/highlighters/main/test-data/null-exec.zsh b/highlighters/main/test-data/null-exec.zsh
new file mode 100644
index 0000000..be1e306
--- /dev/null
+++ b/highlighters/main/test-data/null-exec.zsh
@@ -0,0 +1,38 @@
+#!/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=$'exec >/dev/null;'
+
+expected_region_highlight=(
+ '1 4 precommand' # exec
+ '6 6 redirection' # >
+ '7 15 path' # /dev/null
+ '16 16 commandseparator' # ;
+)
diff --git a/highlighters/main/test-data/off-by-one.zsh b/highlighters/main/test-data/off-by-one.zsh
index 3870e20..872143a 100644
--- a/highlighters/main/test-data/off-by-one.zsh
+++ b/highlighters/main/test-data/off-by-one.zsh
@@ -33,8 +33,8 @@ f() {}
BUFFER='a;f;'
expected_region_highlight=(
- "1 1 alias" # f
+ "1 1 alias" # a
"2 2 commandseparator" # ;
- "3 3 function" # g
+ "3 3 function" # f
"4 4 commandseparator" # ;
)
diff --git a/highlighters/main/test-data/opt-shwordsplit1.zsh b/highlighters/main/test-data/opt-shwordsplit1.zsh
new file mode 100644
index 0000000..7455785
--- /dev/null
+++ b/highlighters/main/test-data/opt-shwordsplit1.zsh
@@ -0,0 +1,40 @@
+#!/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 shwordsplit
+local EDITOR='ed -s'
+
+ed() { command ed "$@" }
+
+BUFFER=$'$EDITOR'
+
+expected_region_highlight=(
+ '1 7 function "issue #687"' # $EDITOR
+)
diff --git a/highlighters/main/test-data/optimized-cmdsubst-input.zsh b/highlighters/main/test-data/optimized-cmdsubst-input.zsh
new file mode 100644
index 0000000..ca55ef8
--- /dev/null
+++ b/highlighters/main/test-data/optimized-cmdsubst-input.zsh
@@ -0,0 +1,43 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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 getoutput() and getoutputfile() in zsh's C source code.
+
+BUFFER=$': $(<*)'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 7 default' # $(<*)
+ '3 7 command-substitution-unquoted' # $(<*)
+ '3 4 command-substitution-delimiter-unquoted' # $(
+ '5 5 redirection' # <
+ '6 6 default' # * - not globbing!
+ '7 7 command-substitution-delimiter-unquoted' # )
+)
diff --git a/highlighters/main/test-data/option-dollar-quote-isnt-filename.zsh b/highlighters/main/test-data/option-dollar-quote-isnt-filename.zsh
new file mode 100644
index 0000000..897a02e
--- /dev/null
+++ b/highlighters/main/test-data/option-dollar-quote-isnt-filename.zsh
@@ -0,0 +1,39 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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=$': -$\'n\''
+
+touch ./-n
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 7 single-hyphen-option' # -$'n'
+ '4 7 dollar-quoted-argument' # $'n'
+)
diff --git a/highlighters/main/test-data/param-positional-in-array-append.zsh b/highlighters/main/test-data/param-positional-in-array-append.zsh
new file mode 100644
index 0000000..bd39e02
--- /dev/null
+++ b/highlighters/main/test-data/param-positional-in-array-append.zsh
@@ -0,0 +1,39 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# This used to be an infinite loop.
+
+BUFFER=$'l+=( $1'
+
+expected_region_highlight=(
+ '1 4 assign' # l+=(
+ '4 4 reserved-word' # (
+ '6 7 default' # $1
+)
diff --git a/highlighters/main/test-data/param-precommand-option-argument1.zsh b/highlighters/main/test-data/param-precommand-option-argument1.zsh
new file mode 100644
index 0000000..84cf03a
--- /dev/null
+++ b/highlighters/main/test-data/param-precommand-option-argument1.zsh
@@ -0,0 +1,42 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# See also alias-precommand-option-argument1.zsh
+local -a sudo_u; sudo_u=(sudo -u)
+sudo(){}
+
+BUFFER='$sudo_u phy1729 echo foo'
+
+expected_region_highlight=(
+ '1 7 precommand' # $sudo_u
+ '9 15 default' # phy1729
+ '18 20 command "issue #540"' # echo (not builtin)
+ '22 24 default' # foo
+)
diff --git a/highlighters/main/test-data/param-precommand-option-argument3.zsh b/highlighters/main/test-data/param-precommand-option-argument3.zsh
new file mode 100644
index 0000000..9a8dde2
--- /dev/null
+++ b/highlighters/main/test-data/param-precommand-option-argument3.zsh
@@ -0,0 +1,42 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# See also alias-precommand-option-argument3.zsh
+local -a sudo_u; sudo_u=(sudo -u)
+sudo(){}
+
+BUFFER='$sudo_u phy1729 ls foo'
+
+expected_region_highlight=(
+ '1 7 precommand' # sudo_u
+ '9 15 default' # phy1729
+ '17 18 command' # ls
+ '20 22 default' # foo
+)
diff --git a/highlighters/main/test-data/parameter-elision-command-word.zsh b/highlighters/main/test-data/parameter-elision-command-word.zsh
new file mode 100644
index 0000000..25f649a
--- /dev/null
+++ b/highlighters/main/test-data/parameter-elision-command-word.zsh
@@ -0,0 +1,36 @@
+#!/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='$x ls'
+
+expected_region_highlight=(
+ '1 2 comment' # $x
+ '4 5 command' # ls
+)
diff --git a/highlighters/main/test-data/parameter-expansion-untokenized1.zsh b/highlighters/main/test-data/parameter-expansion-untokenized1.zsh
new file mode 100644
index 0000000..8b8b5e4
--- /dev/null
+++ b/highlighters/main/test-data/parameter-expansion-untokenized1.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+local x="()"
+
+BUFFER=$'$x ls'
+
+expected_region_highlight=(
+ '1 2 unknown-token' # $x
+ '4 5 command' # ls
+)
diff --git a/highlighters/main/test-data/parameter-expansion-untokenized2.zsh b/highlighters/main/test-data/parameter-expansion-untokenized2.zsh
new file mode 100644
index 0000000..d23a1f2
--- /dev/null
+++ b/highlighters/main/test-data/parameter-expansion-untokenized2.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+local x="^foo^bar"
+
+BUFFER=$'$x ls'
+
+expected_region_highlight=(
+ '1 2 unknown-token' # $x
+ '4 5 default' # ls
+)
diff --git a/highlighters/main/test-data/parameter-to-global-alias.zsh b/highlighters/main/test-data/parameter-to-global-alias.zsh
new file mode 100644
index 0000000..2c4b9bb
--- /dev/null
+++ b/highlighters/main/test-data/parameter-to-global-alias.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+alias -g x=y
+local s=x
+
+BUFFER=$'$s'
+
+expected_region_highlight=(
+ '1 2 unknown-token' # $s
+)
diff --git a/highlighters/main/test-data/parameter-value-contains-command-position1.zsh b/highlighters/main/test-data/parameter-value-contains-command-position1.zsh
new file mode 100644
index 0000000..05ea1bf
--- /dev/null
+++ b/highlighters/main/test-data/parameter-value-contains-command-position1.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+local foobar='x=$(ls)'
+
+BUFFER=$'$foobar'
+
+expected_region_highlight=(
+ # Used to highlight the "ba" as 'command' because the 'ls' showed through; issues #670 and #674
+ '1 7 unknown-token' # $foobar (not an assignment)
+)
diff --git a/highlighters/main/test-data/parameter-value-contains-command-position2.zsh b/highlighters/main/test-data/parameter-value-contains-command-position2.zsh
new file mode 100644
index 0000000..5042e89
--- /dev/null
+++ b/highlighters/main/test-data/parameter-value-contains-command-position2.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+local y='x=$(ls)'
+
+BUFFER=$'$y'
+
+expected_region_highlight=(
+ # Used to trigger a "BUG" message on stderr - issues #670 and #674
+ '1 2 unknown-token' # $y (not an assignment)
+)
diff --git a/highlighters/main/test-data/pasted-quotes.zsh b/highlighters/main/test-data/pasted-quotes.zsh
new file mode 100644
index 0000000..f37f21b
--- /dev/null
+++ b/highlighters/main/test-data/pasted-quotes.zsh
@@ -0,0 +1,38 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2013 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=$': \'foo\'bar"baz"'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 15 default' # \'foo\'bar"baz"
+ '3 7 single-quoted-argument' # \'foo\'
+ '11 15 double-quoted-argument' # "baz"
+)
diff --git a/highlighters/main/test-data/path-dollared-word3.zsh b/highlighters/main/test-data/path-dollared-word3.zsh
index 6921cba..ec981b1 100644
--- a/highlighters/main/test-data/path-dollared-word3.zsh
+++ b/highlighters/main/test-data/path-dollared-word3.zsh
@@ -34,7 +34,7 @@
BUFFER='$PWD; ${PWD}'
expected_region_highlight=(
- "1 4 path" # $PWD
+ "1 4 unknown-token" # $PWD (without AUTO_CD)
"5 5 commandseparator" # ;
- "7 12 path" # ${PWD}
+ "7 12 path_prefix" # ${PWD}
)
diff --git a/highlighters/main/test-data/path-dollared-word3b.zsh b/highlighters/main/test-data/path-dollared-word3b.zsh
new file mode 100644
index 0000000..72a2f7c
--- /dev/null
+++ b/highlighters/main/test-data/path-dollared-word3b.zsh
@@ -0,0 +1,38 @@
+#!/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=$'$PWD; ${PWD}'
+
+expected_region_highlight=(
+ '1 4 autodirectory' # $PWD
+ '5 5 commandseparator' # ;
+ '7 12 autodirectory' # ${PWD}
+)
diff --git a/highlighters/main/test-data/path-mixed-quoting.zsh b/highlighters/main/test-data/path-mixed-quoting.zsh
new file mode 100644
index 0000000..cbd0b38
--- /dev/null
+++ b/highlighters/main/test-data/path-mixed-quoting.zsh
@@ -0,0 +1,39 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+touch foo
+
+BUFFER=$': \'f\'oo'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 7 path' # \'f\'oo
+ '3 5 single-quoted-argument' # \'f\'
+)
diff --git a/highlighters/main/test-data/path_prefix3.zsh b/highlighters/main/test-data/path_prefix3.zsh
index f4a0189..9f34f94 100644
--- a/highlighters/main/test-data/path_prefix3.zsh
+++ b/highlighters/main/test-data/path_prefix3.zsh
@@ -30,7 +30,7 @@
# Assumes that '/bin/sh' exists and '/bin/s' does not exist.
# Related to path_prefix.zsh
-PREBUFFER='ls \'
+PREBUFFER=$'ls \\\n'
BUFFER='/bin/s'
expected_region_highlight=(
diff --git a/highlighters/main/test-data/plain-file-in-command-position.zsh b/highlighters/main/test-data/plain-file-in-command-position.zsh
new file mode 100644
index 0000000..141ffac
--- /dev/null
+++ b/highlighters/main/test-data/plain-file-in-command-position.zsh
@@ -0,0 +1,39 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+touch foo
+chmod -x foo
+BUFFER=$'./foo; ./foo'
+
+expected_region_highlight=(
+ '1 5 unknown-token' # ./foo (in middle)
+ '6 6 commandseparator' # ;
+ '8 12 unknown-token' # ./foo (at end)
+)
diff --git a/highlighters/main/test-data/precommand-killing1.zsh b/highlighters/main/test-data/precommand-killing1.zsh
new file mode 100644
index 0000000..80d279b
--- /dev/null
+++ b/highlighters/main/test-data/precommand-killing1.zsh
@@ -0,0 +1,39 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+hash sudo=false
+
+BUFFER='sudo -e /etc/passwd'
+
+expected_region_highlight=(
+ '1 4 precommand' # sudo
+ '6 7 single-hyphen-option' # -e
+ '9 19 path' # /etc/passwd
+)
diff --git a/highlighters/main/test-data/precommand-killing2.zsh b/highlighters/main/test-data/precommand-killing2.zsh
new file mode 100644
index 0000000..bc6fc86
--- /dev/null
+++ b/highlighters/main/test-data/precommand-killing2.zsh
@@ -0,0 +1,39 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+hash sudo=false
+
+BUFFER='sudo -e /does/not/exist'
+
+expected_region_highlight=(
+ '1 4 precommand' # sudo
+ '6 7 single-hyphen-option' # -e
+ '9 23 default' # /does/not/exist
+)
diff --git a/highlighters/main/test-data/precommand-then-assignment.zsh b/highlighters/main/test-data/precommand-then-assignment.zsh
new file mode 100644
index 0000000..f0bb75f
--- /dev/null
+++ b/highlighters/main/test-data/precommand-then-assignment.zsh
@@ -0,0 +1,37 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'nice x=y ls'
+
+expected_region_highlight=(
+ '1 4 precommand' # nice
+ '6 8 unknown-token "issue #641.5"' # x=y
+ '10 11 default "issue #641.5 (fallout)"' # ls
+)
diff --git a/highlighters/main/test-data/precommand-type1.zsh b/highlighters/main/test-data/precommand-type1.zsh
new file mode 100644
index 0000000..4ce817c
--- /dev/null
+++ b/highlighters/main/test-data/precommand-type1.zsh
@@ -0,0 +1,61 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# Test the behaviour of a builtin that exists as a command as well.
+# The spaces in $BUFFER are to align precommand-type*.zsh test files.
+BUFFER=$'test ; builtin test ; builtin command test ; nice test '
+
+# Our expectations assumes that a 'test' external command exists (in addition
+# to the 'test' builtin). Let's verify that, using the EQUALS option (which
+# is on by default). If there's no 'test' command, the expansion will fail,
+# diagnose a message on stdout, and the harness will detect a failure.
+#
+# This seems to work on all platforms, insofar as no one ever reported a bug
+# about their system not having a 'test' binary in PATH. That said, if someone
+# ever does see this test fail for this reason, we should explicitly create
+# a 'test' executable in cwd and 'rehash'.
+: =test
+
+expected_region_highlight=(
+ '1 4 builtin' # test
+ '7 7 commandseparator' # ;
+
+ '9 15 precommand' # builtin
+ '17 20 builtin' # test
+ '23 23 commandseparator' # ;
+
+ '25 31 precommand' # builtin
+ '33 39 precommand' # command
+ '41 44 command "issue #608"' # test
+ '47 47 commandseparator' # ;
+
+ '49 52 precommand' # nice
+ '54 57 command "issue #608"' # test
+)
diff --git a/highlighters/main/test-data/precommand-type2.zsh b/highlighters/main/test-data/precommand-type2.zsh
new file mode 100644
index 0000000..bf75f4b
--- /dev/null
+++ b/highlighters/main/test-data/precommand-type2.zsh
@@ -0,0 +1,55 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# Test the behaviour of a builtin that does not exist as a command.
+# The spaces in $BUFFER are to align precommand-type*.zsh test files.
+BUFFER=$'zstyle; builtin zstyle; builtin command zstyle; nice zstyle'
+
+# Verify that no $^path/zstyle(N) binary exists.
+if (disable zstyle; type zstyle >/dev/null); then
+ echo >&2 "precommand-type2: error: 'zstyle' exists not only as a builtin"
+fi
+
+expected_region_highlight=(
+ '1 6 builtin' # zstyle
+ '7 7 commandseparator' # ;
+
+ '9 15 precommand' # builtin
+ '17 22 builtin' # zstyle
+ '23 23 commandseparator' # ;
+
+ '25 31 precommand' # builtin
+ '33 39 precommand' # command
+ '41 46 unknown-token "issue #608"' # zstyle
+ '47 47 commandseparator' # ;
+
+ '49 52 precommand' # nice
+ '54 59 unknown-token "issue #608"' # zstyle
+)
diff --git a/highlighters/main/test-data/precommand-type3.zsh b/highlighters/main/test-data/precommand-type3.zsh
new file mode 100644
index 0000000..7fc7e4c
--- /dev/null
+++ b/highlighters/main/test-data/precommand-type3.zsh
@@ -0,0 +1,55 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# Test an external command that does not exist as a builtin.
+# The spaces in $BUFFER are to align precommand-type*.zsh test files.
+BUFFER=$'ls ; builtin ls ; builtin command ls ; nice ls '
+
+# Verify that the 'ls' command isn't shadowed.
+if [[ $(type -w ls) != "ls: command" ]]; then
+ echo >&2 "precommand-type3: error: the 'ls' command is shadowed (or possibly missing altogether)"
+fi
+
+expected_region_highlight=(
+ '1 2 command' # ls
+ '7 7 commandseparator' # ;
+
+ '9 15 precommand' # builtin
+ '17 18 unknown-token "issue #608"' # ls
+ '23 23 commandseparator' # ;
+
+ '25 31 precommand' # builtin
+ '33 39 precommand' # command
+ '41 42 command' # ls
+ '47 47 commandseparator' # ;
+
+ '49 52 precommand' # nice
+ '54 55 command' # ls
+)
diff --git a/highlighters/main/test-data/precommand-uninstalled.zsh b/highlighters/main/test-data/precommand-uninstalled.zsh
new file mode 100644
index 0000000..03c8a75
--- /dev/null
+++ b/highlighters/main/test-data/precommand-uninstalled.zsh
@@ -0,0 +1,44 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+# Simulate sudo not being installed.
+#
+# The 'hash' step is because, if sudo _really_ isn't installed, 'unhash sudo'
+# would error out and break the test.
+hash sudo=/usr/bin/env && unhash sudo
+
+local PATH
+
+BUFFER=$'sudo ls'
+
+expected_region_highlight=(
+ '1 4 unknown-token' # sudo
+ '6 7 default' # ls - not 'command', since sudo isn't installed
+)
diff --git a/highlighters/main/test-data/precommand-unknown-option.zsh b/highlighters/main/test-data/precommand-unknown-option.zsh
index 1fba1b9..6baf9ff 100644
--- a/highlighters/main/test-data/precommand-unknown-option.zsh
+++ b/highlighters/main/test-data/precommand-unknown-option.zsh
@@ -38,6 +38,6 @@ expected_region_highlight=(
'10 11 command' # ls
'12 12 commandseparator' # ;
'14 17 precommand' # sudo
- '19 20 unknown-token' # -x
+ '19 20 single-hyphen-option' # -x
'22 23 command' # ls
)
diff --git a/highlighters/main/test-data/process-substitution-after-redirection.zsh b/highlighters/main/test-data/process-substitution-after-redirection.zsh
new file mode 100644
index 0000000..2d58016
--- /dev/null
+++ b/highlighters/main/test-data/process-substitution-after-redirection.zsh
@@ -0,0 +1,46 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2017, 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=$'< <(pwd) > >(nl)'
+
+expected_region_highlight=(
+ '1 1 redirection' # <
+ '3 8 default' # <(pwd)
+ '3 8 process-substitution' # <(pwd)
+ '3 4 process-substitution-delimiter' # <(
+ '5 7 builtin' # pwd
+ '8 8 process-substitution-delimiter' # )
+ '10 10 redirection' # >
+ '12 16 default' # >(nl)
+ '12 16 process-substitution' # >(nl)
+ '12 13 process-substitution-delimiter' # >(
+ '14 15 command' # nl
+ '16 16 process-substitution-delimiter' # )
+)
diff --git a/highlighters/main/test-data/process-substitution2.zsh b/highlighters/main/test-data/process-substitution2.zsh
index c8c9ffe..cc55090 100644
--- a/highlighters/main/test-data/process-substitution2.zsh
+++ b/highlighters/main/test-data/process-substitution2.zsh
@@ -47,4 +47,5 @@ expected_region_highlight=(
if [[ ${(z):-'$('} == '$( ' ]]; then # ignore zsh 5.0.8 bug
expected_region_highlight[8]='17 27 default' # =(echo foo
+ expected_region_highlight[9]='17 27 process-substitution' # =(echo foo
fi
diff --git a/highlighters/main/test-data/quoted-command-substitution-empty.zsh b/highlighters/main/test-data/quoted-command-substitution-empty.zsh
new file mode 100644
index 0000000..daf3738
--- /dev/null
+++ b/highlighters/main/test-data/quoted-command-substitution-empty.zsh
@@ -0,0 +1,44 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2018 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$( '
+
+expected_region_highlight=(
+ '1 4 builtin' # echo
+ '6 12 default' # "foo$(
+ '6 9 double-quoted-argument-unclosed' # "foo
+ '10 12 command-substitution-quoted' # $(
+ '10 11 command-substitution-delimiter-quoted' # $(
+)
+
+if [[ ${(z):-'$('} == '$( ' ]]; then # ignore zsh 5.0.8 bug
+ expected_region_highlight[2]='6 13 default' # "foo$(
+ expected_region_highlight[4]='10 13 command-substitution-quoted' # $(
+fi
diff --git a/highlighters/main/test-data/quoted-redirection-in-command-word.zsh b/highlighters/main/test-data/quoted-redirection-in-command-word.zsh
new file mode 100644
index 0000000..b1a79e1
--- /dev/null
+++ b/highlighters/main/test-data/quoted-redirection-in-command-word.zsh
@@ -0,0 +1,37 @@
+#!/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=$'">" foo ls'
+
+expected_region_highlight=(
+ '1 3 unknown-token' # ">" - not "redirection"
+ '5 7 default' # foo
+ '9 10 default' # ls - not "command"
+)
diff --git a/highlighters/main/test-data/redirection-from-param.zsh b/highlighters/main/test-data/redirection-from-param.zsh
new file mode 100644
index 0000000..42ae638
--- /dev/null
+++ b/highlighters/main/test-data/redirection-from-param.zsh
@@ -0,0 +1,40 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+touch file
+local fn=$PWD/file
+
+BUFFER=$'<$fn cat'
+
+expected_region_highlight=(
+ '1 1 redirection' # <
+ '2 4 path' # $fn
+ '6 8 command' # cat
+)
diff --git a/highlighters/main/test-data/redirection-in-cmdsubst.zsh b/highlighters/main/test-data/redirection-in-cmdsubst.zsh
index 65c7fbf..ed5eaef 100644
--- a/highlighters/main/test-data/redirection-in-cmdsubst.zsh
+++ b/highlighters/main/test-data/redirection-in-cmdsubst.zsh
@@ -33,9 +33,9 @@ BUFFER=$': $( -x >> --yy'
+
+expected_region_highlight=(
+ '1 1 builtin' # :
+ '3 3 redirection' # >
+ '5 6 default' # -x
+ '8 9 redirection' # >>
+ '11 14 default' # --yy
+)
diff --git a/highlighters/main/test-data/redirection-special-cases.zsh b/highlighters/main/test-data/redirection-special-cases.zsh
new file mode 100644
index 0000000..733cf6b
--- /dev/null
+++ b/highlighters/main/test-data/redirection-special-cases.zsh
@@ -0,0 +1,44 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+# See xpandredir() in the zsh source.
+
+BUFFER=$'cat <&p; exec {myfd}>&-'
+
+expected_region_highlight=(
+ '1 3 command' # cat
+ '5 6 redirection' # <&
+ '7 7 redirection' # p
+ '8 8 commandseparator' # ;
+ '10 13 precommand' # exec
+ '15 20 named-fd' # {myfd}
+ '21 22 redirection' # >&
+ '23 23 redirection' # -
+)
diff --git a/highlighters/main/test-data/sudo-longopt.zsh b/highlighters/main/test-data/sudo-longopt.zsh
new file mode 100644
index 0000000..ef768bf
--- /dev/null
+++ b/highlighters/main/test-data/sudo-longopt.zsh
@@ -0,0 +1,38 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+hash sudo='false'
+BUFFER='sudo --askpass ls'
+
+expected_region_highlight=(
+ '1 4 precommand' # sudo
+ '6 14 double-hyphen-option' # --askpass
+ '16 17 command' # ls (we don't know whether --askpass takes an argument)
+)
diff --git a/highlighters/main/test-data/time-and-nocorrect1.zsh b/highlighters/main/test-data/time-and-nocorrect1.zsh
new file mode 100644
index 0000000..fb398ed
--- /dev/null
+++ b/highlighters/main/test-data/time-and-nocorrect1.zsh
@@ -0,0 +1,39 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'time ls; nocorrect ls'
+
+expected_region_highlight=(
+ '1 4 reserved-word' # time
+ '6 7 command' # ls
+ '8 8 commandseparator' # ;
+ '10 18 reserved-word' # nocorrect
+ '20 21 command' # ls
+)
diff --git a/highlighters/main/test-data/time-and-nocorrect2.zsh b/highlighters/main/test-data/time-and-nocorrect2.zsh
new file mode 100644
index 0000000..5549ee9
--- /dev/null
+++ b/highlighters/main/test-data/time-and-nocorrect2.zsh
@@ -0,0 +1,40 @@
+#!/usr/bin/env 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
+# -------------------------------------------------------------------------------------------------
+
+BUFFER=$'time ls; nocorrect ls'
+alias time=':' nocorrect=':'
+
+expected_region_highlight=(
+ '1 4 alias' # time
+ '6 7 default' # ls
+ '8 8 commandseparator' # ;
+ '10 18 alias' # nocorrect
+ '20 21 default' # ls
+)
diff --git a/highlighters/pattern/pattern-highlighter.zsh b/highlighters/pattern/pattern-highlighter.zsh
index 054eff7..e0422d0 100644
--- a/highlighters/pattern/pattern-highlighter.zsh
+++ b/highlighters/pattern/pattern-highlighter.zsh
@@ -54,7 +54,7 @@ _zsh_highlight_pattern_highlighter_loop()
local -a match mbegin mend
local MATCH; integer MBEGIN MEND
if [[ "$buf" == (#b)(*)(${~pat})* ]]; then
- region_highlight+=("$((mbegin[2] - 1)) $mend[2] $ZSH_HIGHLIGHT_PATTERNS[$pat]")
+ region_highlight+=("$((mbegin[2] - 1)) $mend[2] $ZSH_HIGHLIGHT_PATTERNS[$pat], memo=zsh-syntax-highlighting")
"$0" "$match[1]" "$pat"; return $?
fi
}
diff --git a/highlighters/regexp/regexp-highlighter.zsh b/highlighters/regexp/regexp-highlighter.zsh
index 26f9da3..0d43aac 100644
--- a/highlighters/regexp/regexp-highlighter.zsh
+++ b/highlighters/regexp/regexp-highlighter.zsh
@@ -55,7 +55,7 @@ _zsh_highlight_regexp_highlighter_loop()
local -a match mbegin mend
while true; do
[[ "$buf" =~ "$pat" ]] || return;
- region_highlight+=("$((MBEGIN - 1 + OFFSET)) $((MEND + OFFSET)) $ZSH_HIGHLIGHT_REGEXP[$pat]")
+ region_highlight+=("$((MBEGIN - 1 + OFFSET)) $((MEND + OFFSET)) $ZSH_HIGHLIGHT_REGEXP[$pat], memo=zsh-syntax-highlighting")
buf="$buf[$(($MEND+1)),-1]"
OFFSET=$((MEND+OFFSET));
done
diff --git a/images/after4-smaller.png b/images/after4-smaller.png
new file mode 100644
index 0000000..fc946cf
Binary files /dev/null and b/images/after4-smaller.png differ
diff --git a/images/before4-smaller.png b/images/before4-smaller.png
new file mode 100644
index 0000000..2dbd058
Binary files /dev/null and b/images/before4-smaller.png differ
diff --git a/release.md b/release.md
index 55a70f5..8df4b9c 100644
--- a/release.md
+++ b/release.md
@@ -5,11 +5,13 @@
- Check open issues and outstanding pull requests
- Confirm `make test` passes
- check with multiple zsh versions
+ (easiest to check travis: https://travis-ci.org/zsh-users/zsh-syntax-highlighting/)
- Update changelog.md
`tig --abbrev=12 --abbrev-commit 0.4.1..upstream/master`
-- Remove `-dev` suffix from `./.version`;
+- Make sure there are no local commits and that `git status` is clean;
+ Remove `-dev` suffix from `./.version`;
Commit that using `git commit -m "Tag version $(<.version)." .version`;
- Tag it using `git tag -m "Tag version $(<.version)"`;
+ Tag it using `git tag -s -m "Tag version $(<.version)" $(<.version)`;
Increment `./.version` and restore the `-dev` suffix;
Commit that using `git commit -C b5c30ae52638e81a38fe5329081c5613d7bd6ca5 .version`.
- Push with `git push && git push --tags`
diff --git a/tests/README.md b/tests/README.md
index 8487b3c..cb3d943 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -7,6 +7,9 @@ The tests harness expects the highlighter directory to contain a `test-data`
directory with test data files.
See the [main highlighter](../highlighters/main/test-data) for examples.
+Tests should set the following variables:
+
+1.
Each test should define the string `$BUFFER` that is to be highlighted and the
array parameter `$expected_region_highlight`.
The value of that parameter is a list of strings of the form `"$i $j $style"`.
@@ -16,11 +19,27 @@ that is, `$i` and `$j` specify a range, 1-indexed, inclusive of both endpoints.
`$style` is a key of `$ZSH_HIGHLIGHT_STYLES`.
If `$todo` exists, the test point is marked as TODO (the failure of that test
point will not fail the test), and `$todo` is used as the explanation.
+
+2.
If a test sets `$skip_test` to a non-empty string, the test will be skipped
with the provided string as the reason.
+
+3.
+If a test sets `$fail_test` to a non-empty string, the test will be skipped
+with the provided string as the reason.
+
+4.
If a test sets `unsorted=1` the order of highlights in `$expected_region_highlight`
need not match the order in `$region_highlight`.
+5.
+Normally, tests fail if `$expected_region_highlight` and `$region_highlight`
+have different numbers of elements. To mark this check as expected to fail,
+tests may set `$expected_mismatch` to an explanation string (like `$todo`);
+this is useful when the only difference between actual and expected is that actual
+has some additional, superfluous elements. This check is skipped if the
+`$todo` component is present in any regular test point.
+
**Note**: `$region_highlight` uses the same `"$i $j $style"` syntax but
interprets the indexes differently.
@@ -33,17 +52,19 @@ computes `$region_highlight`), but will not affect subsequent tests. The
current working directory of tests is set to a newly-created empty directory,
which is automatically cleaned up after the test exits. For example:
- setopt PATH_DIRS
- mkdir -p foo/bar
- touch foo/bar/testing-issue-228
- chmod +x foo/bar/testing-issue-228
- path+=( "$PWD"/foo )
+```zsh
+setopt PATH_DIRS
+mkdir -p foo/bar
+touch foo/bar/testing-issue-228
+chmod +x foo/bar/testing-issue-228
+path+=( "$PWD"/foo )
- BUFFER='bar/testing-issue-228'
+BUFFER='bar/testing-issue-228'
- expected_region_highlight=(
- "1 21 command" # bar/testing-issue-228
- )
+expected_region_highlight=(
+ "1 21 command" # bar/testing-issue-228
+)
+```
Writing new tests
@@ -51,7 +72,9 @@ Writing new tests
An experimental tool is available to generate test files:
- zsh -f tests/generate.zsh 'ls -x' acme newfile
+```zsh
+zsh -f tests/generate.zsh 'ls -x' acme newfile
+```
This generates a `highlighters/acme/test-data/newfile.zsh` test file based on
the current highlighting of the given `$BUFFER` (in this case, `ls -x`).
@@ -66,11 +89,15 @@ Highlighting test
[`test-highlighting.zsh`](tests/test-highlighting.zsh) tests the correctness of
the highlighting. Usage:
- zsh test-highlighting.zsh
+```zsh
+zsh test-highlighting.zsh
+```
All tests may be run with
- make test
+```zsh
+make test
+```
which will run all highlighting tests and report results in [TAP format][TAP].
By default, the results of all tests will be printed; to show only "interesting"
@@ -86,8 +113,12 @@ Performance test
[`test-perfs.zsh`](tests/test-perfs.zsh) measures the time spent doing the
highlighting. Usage:
- zsh test-perfs.zsh
+```zsh
+zsh test-perfs.zsh
+```
All tests may be run with
- make perf
+```zsh
+make perf
+```
diff --git a/tests/edit-failed-tests b/tests/edit-failed-tests
new file mode 100755
index 0000000..e3a7668
--- /dev/null
+++ b/tests/edit-failed-tests
@@ -0,0 +1,40 @@
+#!/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
+# -------------------------------------------------------------------------------------------------
+
+type perl sponge >/dev/null || { print -ru2 -- "$0: This script requires perl(1) and sponge(1) [from moreutils]"; exit 1; }
+
+local editor=( "${(@Q)${(z)${VISUAL:-${EDITOR:-vi}}}}" )
+() {
+ > "$2" perl -nE '$highlighter = $1 if /^Running test (\S*)/; say "highlighters/${highlighter}/test-data/$1.zsh" if /^## (\S*)/' "$1"
+ >>"$2" echo ""
+ >>"$2" cat <"$1"
+ "${editor[@]}" -- "$2"
+} =(${MAKE:-make} quiet-test) =(:)
+# TODO: tee(1) the quiet-test output to /dev/tty as it's happening, with colors.
diff --git a/tests/generate.zsh b/tests/generate.zsh
index ef89f94..5696020 100755
--- a/tests/generate.zsh
+++ b/tests/generate.zsh
@@ -35,16 +35,17 @@ setopt localoptions extendedglob
zmodload zsh/zle
# Argument parsing.
-if (( $# != 3 )) || [[ $1 == -* ]]; then
- print -r -- >&2 "$0: usage: $0 BUFFER HIGHLIGHTER BASENAME"
+if (( $# * $# - 7 * $# + 12 )) || [[ $1 == -* ]]; then
+ print -r -- >&2 "$0: usage: $0 BUFFER HIGHLIGHTER BASENAME [PREAMBLE]"
print -r -- >&2 ""
print -r -- >&2 "Generate highlighters/HIGHLIGHTER/test-data/BASENAME.zsh based on the"
- print -r -- >&2 "current highlighting of BUFFER."
+ print -r -- >&2 "current highlighting of BUFFER, using the setup code PREAMBLE."
exit 1
fi
buffer=$1
ZSH_HIGHLIGHT_HIGHLIGHTERS=( $2 )
fname=${0:A:h:h}/highlighters/$2/test-data/${3%.zsh}.zsh
+preamble=${4:-""}
# Load the main script.
. ${0:A:h:h}/zsh-syntax-highlighting.zsh
@@ -58,13 +59,18 @@ _zsh_highlight_add_highlight()
# Copyright block
year="`LC_ALL=C date +%Y`"
-if ! read -q "?Set copyright year to $year? "; then
+if ! { read -q "?Set copyright year to $year? " } always { echo "" }; then
year="YYYY"
fi
-exec >$fname
-<$0 sed -n -e '1,/^$/p' | sed -e "s/2[0-9][0-9][0-9]/${year}/"
+<$0 sed -n -e '1,/^$/p' | sed -e "s/2[0-9][0-9][0-9]/${year}/" > $fname
# Assumes stdout is line-buffered
git add -- $fname
+exec > >(tee -a $fname)
+
+# Preamble
+if [[ -n $preamble ]]; then
+ print -rl -- "$preamble" ""
+fi
# Buffer
print -n 'BUFFER='
@@ -85,8 +91,17 @@ print 'expected_region_highlight=('
PREBUFFER=""
BUFFER="$buffer"
region_highlight=()
- # TODO: use run_test() from tests/test-highlighting.zsh (to get a tempdir)
- _zsh_highlight
+ eval $(
+ exec 3>&1 >/dev/null
+ typeset -r __tests_tmpdir="$(mktemp -d)"
+ {
+ # Use a subshell to ensure $__tests_tmpdir, which is to be rm -rf'd, won't be modified.
+ (cd -- "$__tests_tmpdir" && eval $preamble && _zsh_highlight && typeset -p region_highlight >&3)
+ : # workaround zsh bug workers/45305 with respect to the $(…) subshell we're in
+ } always {
+ rm -rf -- ${__tests_tmpdir}
+ }
+ )
for ((i=1; i<=${#region_highlight}; i++)); do
local -a highlight_zone; highlight_zone=( ${(z)region_highlight[$i]} )
diff --git a/tests/tap-filter b/tests/tap-filter
index 6587808..f9aa604 100755
--- a/tests/tap-filter
+++ b/tests/tap-filter
@@ -40,6 +40,8 @@ use strict;
undef $/; # slurp mode
print for
- grep { /^ok.*# TODO/m or /^not ok(?!.*# TODO)/m }
- split /^(?=#)/m,
+ grep { /^ok.*# TODO/m or /^not ok(?!.*# TODO)/m or /^Bail out!/m }
+ # Split on plan lines and remove them from the output. (To keep them,
+ # use the lookahead syntax, «(?=…)», to make the match zero-length.)
+ split /^\d+\.\.\d+$/m,
;
diff --git a/tests/test-highlighting.zsh b/tests/test-highlighting.zsh
index e5c85a1..8b564a8 100755
--- a/tests/test-highlighting.zsh
+++ b/tests/test-highlighting.zsh
@@ -34,6 +34,11 @@ setopt NO_UNSET WARN_CREATE_GLOBAL
# Required for add-zle-hook-widget.
zmodload zsh/zle
+local -r root=${0:h:h}
+local -a anon_argv; anon_argv=("$@")
+
+(){
+set -- "${(@)anon_argv}"
# Check an highlighter was given as argument.
[[ -n "$1" ]] || {
echo >&2 "Bail out! You must provide the name of a valid highlighter as argument."
@@ -41,13 +46,13 @@ zmodload zsh/zle
}
# Check the highlighter is valid.
-[[ -f ${0:h:h}/highlighters/$1/$1-highlighter.zsh ]] || {
+[[ -f $root/highlighters/$1/$1-highlighter.zsh ]] || {
echo >&2 "Bail out! Could not find highlighter ${(qq)1}."
exit 2
}
# Check the highlighter has test data.
-[[ -d ${0:h:h}/highlighters/$1/test-data ]] || {
+[[ -d $root/highlighters/$1/test-data ]] || {
echo >&2 "Bail out! Highlighter ${(qq)1} has no test data."
exit 2
}
@@ -56,7 +61,7 @@ zmodload zsh/zle
local results_filter
if [[ ${QUIET-} == y ]]; then
if type -w perl >/dev/null; then
- results_filter=${0:A:h}/tap-filter
+ results_filter=$root/tests/tap-filter
else
echo >&2 "Bail out! quiet mode not supported: perl not found"; exit 2
fi
@@ -67,18 +72,18 @@ fi
# Load the main script.
# While here, test that it doesn't eat aliases.
-print > >($results_filter | ${0:A:h}/tap-colorizer.zsh) -r -- "# global (driver) tests"
-print > >($results_filter | ${0:A:h}/tap-colorizer.zsh) -r -- "1..1"
+print > >($results_filter | $root/tests/tap-colorizer.zsh) -r -- "# global (driver) tests"
+print > >($results_filter | $root/tests/tap-colorizer.zsh) -r -- "1..1"
alias -- +plus=plus
alias -- _other=other
-original_alias_dash_L_output="$(alias -L)"
-. ${0:h:h}/zsh-syntax-highlighting.zsh
+local original_alias_dash_L_output="$(alias -L)"
+. $root/zsh-syntax-highlighting.zsh
if [[ $original_alias_dash_L_output == $(alias -L) ]]; then
print -r -- "ok 1 # 'alias -- +foo=bar' is preserved"
else
print -r -- "not ok 1 # 'alias -- +foo=bar' is preserved"
exit 1
-fi > >($results_filter | ${0:A:h}/tap-colorizer.zsh)
+fi > >($results_filter | $root/tests/tap-colorizer.zsh)
# Overwrite _zsh_highlight_add_highlight so we get the key itself instead of the style
_zsh_highlight_add_highlight()
@@ -89,6 +94,24 @@ _zsh_highlight_add_highlight()
# Activate the highlighter.
ZSH_HIGHLIGHT_HIGHLIGHTERS=($1)
+# In zsh<5.3, 'typeset -p arrayvar' emits two lines, so we use this wrapper instead.
+typeset_p() {
+ for 1 ; do
+ if [[ ${(tP)1} == *array* ]]; then
+ print -r -- "$1=( ${(@qqqqP)1} )"
+ else
+ print -r -- "$1=${(qqqqP)1}"
+ fi
+ done
+}
+
+# Escape # as ♯ and newline as ↵ they are illegal in the 'description' part of TAP output
+# The string to escape is «"$@"»; the result is returned in $REPLY.
+tap_escape() {
+ local s="${(j. .)@}"
+ REPLY="${${s//'#'/♯}//$'\n'/↵}"
+}
+
# Runs a highlighting test
# $1: data file
run_test_internal() {
@@ -97,52 +120,83 @@ run_test_internal() {
local srcdir="$PWD"
builtin cd -q -- "$tests_tempdir" || { echo >&2 "Bail out! On ${(qq)1}: cd failed: $?"; return 1 }
- echo "# ${1:t:r}"
-
# Load the data and prepare checking it.
- local BUFFER CURSOR MARK PENDING PREBUFFER REGION_ACTIVE WIDGET skip_test unsorted=0
+ local BUFFER CURSOR MARK PENDING PREBUFFER REGION_ACTIVE WIDGET REPLY skip_test fail_test unsorted=0
+ local expected_mismatch
+ local skip_mismatch
local -a expected_region_highlight region_highlight
- . "$srcdir"/"$1"
- (( $#skip_test )) && { print -r -- "1..0 # SKIP $skip_test"; return; }
+ local ARG="$1"
+ local RETURN=""
+ () {
+ setopt localoptions
- # Check the data declares $PREBUFFER or $BUFFER.
- [[ -z $PREBUFFER && -z $BUFFER ]] && { echo >&2 "Bail out! On ${(qq)1}: Either 'PREBUFFER' or 'BUFFER' must be declared and non-blank"; return 1; }
- # Check the data declares $expected_region_highlight.
- (( $+expected_region_highlight == 0 )) && { echo >&2 "Bail out! On ${(qq)1}: 'expected_region_highlight' is not declared."; return 1; }
+ # WARNING: The remainder of this anonymous function will run with the test's options in effect
+ if { ! . "$srcdir"/"$ARG" } || (( $#fail_test )); then
+ print -r -- "1..1"
+ print -r -- "## ${ARG:t:r}"
+ tap_escape $fail_test; fail_test=$REPLY
+ print -r -- "not ok 1 - failed setup: $fail_test"
+ return ${RETURN:=0}
+ fi
- # Set sane defaults for ZLE variables
- : ${CURSOR=$#BUFFER} ${PENDING=0} ${WIDGET=z-sy-h-test-harness-test-widget}
+ (( $#skip_test )) && {
+ print -r -- "1..0 # SKIP $skip_test"
+ print -r -- "## ${ARG:t:r}"
+ return ${RETURN:=0}
+ }
- # Process the data.
- _zsh_highlight
+ # Check the data declares $PREBUFFER or $BUFFER.
+ [[ -z $PREBUFFER && -z $BUFFER ]] && { echo >&2 "Bail out! On ${(qq)ARG}: Either 'PREBUFFER' or 'BUFFER' must be declared and non-blank"; return ${RETURN:=1}; }
+ [[ $PREBUFFER == (''|*$'\n') ]] || { echo >&2 "Bail out! On ${(qq)ARG}: PREBUFFER=${(qqqq)PREBUFFER} doesn't end with a newline"; return ${RETURN:=1}; }
+
+ # Set sane defaults for ZLE variables
+ : ${CURSOR=$#BUFFER} ${PENDING=0} ${WIDGET=z-sy-h-test-harness-test-widget}
+
+ # Process the data.
+ _zsh_highlight
+ }; [[ -z $RETURN ]] || return $RETURN
+ unset ARG
+
+ integer print_expected_and_actual=0
if (( unsorted )); then
region_highlight=("${(@n)region_highlight}")
expected_region_highlight=("${(@n)expected_region_highlight}")
fi
+ # Print the plan line, and some comments for human readers
echo "1..$(( $#expected_region_highlight + 1))"
+ echo "## ${1:t:r}" # note: tests/edit-failed-tests looks for the "##" emitted by this line
+ [[ -n $PREBUFFER ]] && printf '# %s\n' "$(typeset_p PREBUFFER)"
+ [[ -n $BUFFER ]] && printf '# %s\n' "$(typeset_p BUFFER)"
+
local i
for ((i=1; i<=$#expected_region_highlight; i++)); do
local -a expected_highlight_zone; expected_highlight_zone=( ${(z)expected_region_highlight[i]} )
integer exp_start=$expected_highlight_zone[1] exp_end=$expected_highlight_zone[2]
local todo=
- (( $+expected_highlight_zone[4] )) && todo="# TODO $expected_highlight_zone[4]"
+ if (( $+expected_highlight_zone[4] )); then
+ todo="# TODO $expected_highlight_zone[4]"
+ skip_mismatch="cardinality check disabled whilst regular test points are expected to fail"
+ fi
if ! (( $+region_highlight[i] )); then
- print -r -- "not ok $i - unmatched expectation ($exp_start $exp_end $expected_highlight_zone[3])"
+ print -r -- "not ok $i - unmatched expectation ($exp_start $exp_end $expected_highlight_zone[3])" \
+ "${skip_mismatch:+"# TODO ${(qqq)skip_mismatch}"}"
+ if [[ -z $skip_mismatch ]]; then (( ++print_expected_and_actual )); fi
continue
fi
local -a highlight_zone; highlight_zone=( ${(z)region_highlight[i]} )
integer start=$(( highlight_zone[1] + 1 )) end=$highlight_zone[2]
- # Escape # as ♯ and newline as ↵ they are illegal in the 'description' part of TAP output
- local desc="[$start,$end] «${${BUFFER[$start,$end]//'#'/♯}//$'\n'/↵}»"
+ local desc="[$start,$end] «${BUFFER[$start,$end]}»"
+ tap_escape $desc; desc=$REPLY
if
[[ $start != $exp_start ]] ||
[[ $end != $exp_end ]] ||
- [[ $highlight_zone[3] != $expected_highlight_zone[3] ]]
+ [[ ${highlight_zone[3]%,} != ${expected_highlight_zone[3]} ]] # remove the comma that's before the memo field
then
print -r -- "not ok $i - $desc - expected ($exp_start $exp_end ${(qqq)expected_highlight_zone[3]}), observed ($start $end ${(qqq)highlight_zone[3]}). $todo"
+ if [[ -z $todo ]]; then (( ++print_expected_and_actual )); fi
else
print -r -- "ok $i - $desc${todo:+ - }$todo"
fi
@@ -154,10 +208,43 @@ run_test_internal() {
unset desc
done
- if (( $#expected_region_highlight == $#region_highlight )); then
- print -r -- "ok $i - cardinality check"
+ # If both $skip_mismatch and $expected_mismatch are set, that means the test
+ # has some XFail test points, _and_ explicitly sets $expected_mismatch as
+ # well. Explicit settings should have priority, so we ignore $skip_mismatch
+ # if $expected_mismatch is set.
+ if [[ -n $skip_mismatch && -z $expected_mismatch ]]; then
+ tap_escape $skip_mismatch; skip_mismatch=$REPLY
+ print "ok $i - cardinality check" "# SKIP $skip_mismatch"
else
- print -r -- "not ok $i - have $#expected_region_highlight expectations and $#region_highlight region_highlight entries"
+ local todo
+ if [[ -n $expected_mismatch ]]; then
+ tap_escape $expected_mismatch; expected_mismatch=$REPLY
+ todo="# TODO $expected_mismatch"
+ fi
+ if (( $#expected_region_highlight == $#region_highlight )); then
+ print -r -- "ok $i - cardinality check${todo:+ - }$todo"
+ else
+ local details
+ details+="have $#expected_region_highlight expectations and $#region_highlight region_highlight entries: "
+ details+="«$(typeset_p expected_region_highlight)» «$(typeset_p region_highlight)»"
+ tap_escape $details; details=$REPLY
+ print -r -- "not ok $i - cardinality check - $details${todo:+ - }$todo"
+ if [[ -z $todo ]]; then (( ++print_expected_and_actual )); fi
+ fi
+ fi
+ if (( print_expected_and_actual )); then
+ () {
+ local -a left_column right_column
+ left_column=( "expected_region_highlight" "${(qq)expected_region_highlight[@]}" )
+ right_column=( "region_highlight" "${(qq)region_highlight[@]}" )
+ integer difference=$(( $#right_column - $#left_column ))
+ repeat $difference do left_column+=(.); done
+ paste \
+ =(print -rC1 -- $left_column) \
+ =(print -rC1 -- $right_column) \
+ | if type column >/dev/null; then column -t -s $'\t'; else cat; fi \
+ | sed 's/^/# /'
+ }
fi
}
@@ -181,7 +268,7 @@ run_test() {
local ret=$pipestatus[1] stderr=$pipestatus[2]
if (( ! stderr )); then
# stdout will become stderr
- echo "Bail out! On ${(qq)1}: output on stderr"; return 1
+ echo "Bail out! On ${(qq)1}: output on stderr"; return 1
else
return $ret
fi
@@ -194,9 +281,11 @@ run_test() {
# Process each test data file in test data directory.
integer something_failed=0
ZSH_HIGHLIGHT_STYLES=()
-for data_file in ${0:h:h}/highlighters/$1/test-data/*.zsh; do
- run_test "$data_file" | tee >($results_filter | ${0:A:h}/tap-colorizer.zsh) | grep -v '^not ok.*# TODO' | grep -Eq '^not ok|^ok.*# TODO' && (( something_failed=1 ))
+local data_file
+for data_file in $root/highlighters/$1/test-data/*.zsh; do
+ run_test "$data_file" | tee >($results_filter | $root/tests/tap-colorizer.zsh) | grep -v '^not ok.*# TODO' | grep -Eq '^not ok|^ok.*# TODO' && (( something_failed=1 ))
(( $pipestatus[1] )) && exit 2
done
exit $something_failed
+}
diff --git a/tests/test-perfs.zsh b/tests/test-perfs.zsh
index 49d95c7..aa139aa 100755
--- a/tests/test-perfs.zsh
+++ b/tests/test-perfs.zsh
@@ -51,6 +51,7 @@ zmodload zsh/zle
}
# Load the main script.
+typeset -a region_highlight
. ${0:h:h}/zsh-syntax-highlighting.zsh
# Activate the highlighter.
@@ -65,8 +66,6 @@ run_test_internal() {
local srcdir="$PWD"
builtin cd -q -- "$tests_tempdir" || { echo >&2 "Bail out! cd failed: $?"; return 1 }
- echo -n "# ${1:t:r}: "
-
# Load the data and prepare checking it.
PREBUFFER= BUFFER= ;
. "$srcdir"/"$1"
@@ -74,9 +73,8 @@ run_test_internal() {
# Check the data declares $PREBUFFER or $BUFFER.
[[ -z $PREBUFFER && -z $BUFFER ]] && { echo >&2 "Bail out! Either 'PREBUFFER' or 'BUFFER' must be declared and non-blank"; return 1; }
- # Measure the time taken by _zsh_highlight.
- TIMEFMT="%*Es"
- time (BUFFER="$BUFFER" && _zsh_highlight)
+ # Set $? for _zsh_highlight
+ true && _zsh_highlight
}
run_test() {
@@ -95,9 +93,11 @@ run_test() {
}
# Process each test data file in test data directory.
-for data_file in ${0:h:h}/highlighters/$1/test-data/*.zsh; do
+local data_file
+TIMEFMT="%*Es"
+{ time (for data_file in ${0:h:h}/highlighters/$1/test-data/*.zsh; do
run_test "$data_file"
(( $pipestatus[1] )) && exit 2
-done
+done) } 2>&1 || exit $?
exit 0
diff --git a/tests/test-zprof.zsh b/tests/test-zprof.zsh
new file mode 100755
index 0000000..ada1618
--- /dev/null
+++ b/tests/test-zprof.zsh
@@ -0,0 +1,78 @@
+#!/usr/bin/env zsh
+# -------------------------------------------------------------------------------------------------
+# Copyright (c) 2010-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
+# -------------------------------------------------------------------------------------------------
+
+# Load the main script.
+typeset -a region_highlight
+. ${0:h:h}/zsh-syntax-highlighting.zsh
+
+# Activate the highlighter.
+ZSH_HIGHLIGHT_HIGHLIGHTERS=(main)
+
+source_file=0.7.1:highlighters/$1/$1-highlighter.zsh
+
+# Runs a highlighting test
+# $1: data file
+run_test_internal() {
+ setopt interactivecomments
+
+ local -a highlight_zone
+
+ local tests_tempdir="$1"; shift
+ local srcdir="$PWD"
+ builtin cd -q -- "$tests_tempdir" || { echo >&2 "Bail out! cd failed: $?"; return 1 }
+
+ # Load the data and prepare checking it.
+ PREBUFFER=
+ BUFFER=$(cd -- "$srcdir" && git cat-file blob $source_file)
+ expected_region_highlight=()
+
+ zmodload zsh/zprof
+ zprof -c
+ # Set $? for _zsh_highlight
+ true && _zsh_highlight
+ zprof
+}
+
+run_test() {
+ # Do not combine the declaration and initialization: «local x="$(false)"» does not set $?.
+ local __tests_tempdir
+ __tests_tempdir="$(mktemp -d)" && [[ -d $__tests_tempdir ]] || {
+ echo >&2 "Bail out! mktemp failed"; return 1
+ }
+ typeset -r __tests_tempdir # don't allow tests to override the variable that we will 'rm -rf' later on
+
+ {
+ (run_test_internal "$__tests_tempdir" "$@")
+ } always {
+ rm -rf -- "$__tests_tempdir"
+ }
+}
+
+run_test
diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh
index 47a4e07..11fbb5f 100644
--- a/zsh-syntax-highlighting.zsh
+++ b/zsh-syntax-highlighting.zsh
@@ -1,5 +1,5 @@
# -------------------------------------------------------------------------------------------------
-# Copyright (c) 2010-2016 zsh-syntax-highlighting contributors
+# 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
@@ -28,9 +28,9 @@
# -------------------------------------------------------------------------------------------------
# First of all, ensure predictable parsing.
-zsh_highlight__aliases=`builtin alias -Lm '[^+]*'`
-# In zsh <= 5.2, `alias -L` emits aliases that begin with a plus sign ('alias -- +foo=42')
-# them without a '--' guard, so they don't round trip.
+typeset zsh_highlight__aliases="$(builtin alias -Lm '[^+]*')"
+# In zsh <= 5.2, aliases that begin with a plus sign ('alias -- +foo=42')
+# are emitted by `alias -L` without a '--' guard, so they don't round trip.
#
# Hence, we exclude them from unaliasing:
builtin unalias -m '[^+]*'
@@ -103,9 +103,9 @@ _zsh_highlight__function_callable_p() {
# zsh-users/zsh@48cadf4 http://www.zsh.org/mla/workers//2017/msg00034.html
autoload -Uz is-at-least
if is-at-least 5.4; then
- zsh_highlight__pat_static_bug=false
+ typeset -g zsh_highlight__pat_static_bug=false
else
- zsh_highlight__pat_static_bug=true
+ typeset -g zsh_highlight__pat_static_bug=true
fi
# Array declaring active highlighters names.
@@ -119,35 +119,99 @@ _zsh_highlight()
{
# Store the previous command return code to restore it whatever happens.
local ret=$?
+ # Make it read-only. Can't combine this with the previous line when POSIX_BUILTINS may be set.
+ typeset -r ret
+
+ # $region_highlight should be predefined, either by zle or by the test suite's mock (non-special) array.
+ (( ${+region_highlight} )) || {
+ echo >&2 'zsh-syntax-highlighting: error: $region_highlight is not defined'
+ echo >&2 'zsh-syntax-highlighting: (Check whether zsh-syntax-highlighting was installed according to the instructions.)'
+ return $ret
+ }
+
+ # Probe the memo= feature, once.
+ (( ${+zsh_highlight__memo_feature} )) || {
+ region_highlight+=( " 0 0 fg=red, memo=zsh-syntax-highlighting" )
+ case ${region_highlight[-1]} in
+ ("0 0 fg=red")
+ # zsh 5.8 or earlier
+ integer -gr zsh_highlight__memo_feature=0
+ ;;
+ ("0 0 fg=red memo=zsh-syntax-highlighting")
+ # zsh 5.9 or later
+ integer -gr zsh_highlight__memo_feature=1
+ ;;
+ (" 0 0 fg=red, memo=zsh-syntax-highlighting") ;&
+ (*)
+ # We can get here in two ways:
+ #
+ # 1. When not running as a widget. In that case, $region_highlight is
+ # not a special variable (= one with custom getter/setter functions
+ # written in C) but an ordinary one, so the third case pattern matches
+ # and we fall through to this block. (The test suite uses this codepath.)
+ #
+ # 2. When running under a future version of zsh that will have changed
+ # the serialization of $region_highlight elements from their underlying
+ # C structs, so that none of the previous case patterns will match.
+ #
+ # In either case, fall back to a version check.
+ #
+ # The memo= feature was added to zsh in commit zsh-5.8-172-gdd6e702ee.
+ # The version number at the time was 5.8.0.2-dev (see Config/version.mk).
+ # Therefore, on 5.8.0.3 and newer the memo= feature is available.
+ #
+ # On zsh version 5.8.0.2 between the aforementioned commit and the
+ # first Config/version.mk bump after it (which, at the time of writing,
+ # is yet to come), this condition will false negative.
+ if is-at-least 5.8.0.3; then
+ integer -gr zsh_highlight__memo_feature=1
+ else
+ integer -gr zsh_highlight__memo_feature=0
+ fi
+ ;;
+ esac
+ region_highlight[-1]=()
+ }
+
+ # Reset region_highlight to build it from scratch
+ if (( zsh_highlight__memo_feature )); then
+ region_highlight=( "${(@)region_highlight:#*memo=zsh-syntax-highlighting*}" )
+ else
+ # Legacy codepath. Not very interoperable with other plugins (issue #418).
+ region_highlight=()
+ fi
# Remove all highlighting in isearch, so that only the underlining done by zsh itself remains.
# For details see FAQ entry 'Why does syntax highlighting not work while searching history?'.
# This disables highlighting during isearch (for reasons explained in README.md) unless zsh is new enough
# and doesn't have the pattern matching bug
if [[ $WIDGET == zle-isearch-update ]] && { $zsh_highlight__pat_static_bug || ! (( $+ISEARCHMATCH_ACTIVE )) }; then
- region_highlight=()
return $ret
fi
# Before we 'emulate -L', save the user's options
local -A zsyh_user_options
if zmodload -e zsh/parameter; then
- zsyh_user_options=("${(@kv)options}")
+ zsyh_user_options=("${(kv)options[@]}")
else
local canonical_options onoff option raw_options
raw_options=(${(f)"$(emulate -R zsh; set -o)"})
canonical_options=(${${${(M)raw_options:#*off}%% *}#no} ${${(M)raw_options:#*on}%% *})
- for option in $canonical_options; do
+ for option in "${canonical_options[@]}"; do
[[ -o $option ]]
- # This variable cannot be eliminated c.f. workers/42101.
- onoff=${${=:-off on}[2-$?]}
- zsyh_user_options+=($option $onoff)
+ case $? in
+ (0) zsyh_user_options+=($option on);;
+ (1) zsyh_user_options+=($option off);;
+ (*) # Can't happen, surely?
+ echo "zsh-syntax-highlighting: warning: '[[ -o $option ]]' returned $?"
+ ;;
+ esac
done
fi
typeset -r zsyh_user_options
emulate -L zsh
- setopt localoptions warncreateglobal
+ setopt localoptions warncreateglobal nobashrematch
local REPLY # don't leak $REPLY into global scope
# Do not highlight if there are more than 300 chars in the buffer. It's most
@@ -157,10 +221,6 @@ _zsh_highlight()
# Do not highlight if there are pending inputs (copy/paste).
[[ $PENDING -gt 0 ]] && return $ret
- # Reset region highlight to build it from scratch
- typeset -ga region_highlight
- region_highlight=();
-
{
local cache_place
local -a region_highlight_copy
@@ -203,24 +263,25 @@ _zsh_highlight()
# Re-apply zle_highlight settings
# region
- if (( REGION_ACTIVE == 1 )); then
- _zsh_highlight_apply_zle_highlight region standout "$MARK" "$CURSOR"
- elif (( REGION_ACTIVE == 2 )); then
- () {
+ () {
+ (( REGION_ACTIVE )) || return
+ integer min max
+ if (( MARK > CURSOR )) ; then
+ min=$CURSOR max=$MARK
+ else
+ min=$MARK max=$CURSOR
+ fi
+ if (( REGION_ACTIVE == 1 )); then
+ [[ $KEYMAP = vicmd ]] && (( max++ ))
+ elif (( REGION_ACTIVE == 2 )); then
local needle=$'\n'
- integer min max
- if (( MARK > CURSOR )) ; then
- min=$CURSOR max=$MARK
- else
- min=$MARK max=$CURSOR
- fi
# CURSOR and MARK are 0 indexed between letters like region_highlight
# Do not include the newline in the highlight
(( min = ${BUFFER[(Ib:min:)$needle]} ))
(( max = ${BUFFER[(ib:max:)$needle]} - 1 ))
- _zsh_highlight_apply_zle_highlight region standout "$min" "$max"
- }
- fi
+ fi
+ _zsh_highlight_apply_zle_highlight region standout "$min" "$max"
+ }
# yank / paste (zsh-5.1.1 and newer)
(( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END"
@@ -278,7 +339,7 @@ _zsh_highlight_apply_zle_highlight() {
else
start=$second end=$first
fi
- region_highlight+=("$start $end $region")
+ region_highlight+=("$start $end $region, memo=zsh-syntax-highlighting")
}
@@ -318,7 +379,7 @@ _zsh_highlight_add_highlight()
shift 2
for highlight; do
if (( $+ZSH_HIGHLIGHT_STYLES[$highlight] )); then
- region_highlight+=("$start $end $ZSH_HIGHLIGHT_STYLES[$highlight]")
+ region_highlight+=("$start $end $ZSH_HIGHLIGHT_STYLES[$highlight], memo=zsh-syntax-highlighting")
break
fi
done
@@ -505,6 +566,12 @@ zmodload zsh/parameter 2>/dev/null || true
# Initialize the array of active highlighters if needed.
[[ $#ZSH_HIGHLIGHT_HIGHLIGHTERS -eq 0 ]] && ZSH_HIGHLIGHT_HIGHLIGHTERS=(main)
+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
+
# Restore the aliases we unned
eval "$zsh_highlight__aliases"
builtin unset zsh_highlight__aliases