style: format zsh and markdown to zinit convention (#8)

* style: format zsh & markdown files and update copyright notice

Signed-off-by: Vladislav Doster <mvdoster@gmail.com>
This commit is contained in:
vladislav doster 2022-07-01 10:41:59 -05:00 committed by GitHub
parent 698e889ebc
commit 458e75c16d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 957 additions and 1557 deletions

114
CHANGELOG.md Normal file
View file

@ -0,0 +1,114 @@
## 14-07-2020
- If an `[…]` string will occur in the search query, it'll be interpreted as pattern. So that it's
possible to enter as the search query e.g.: `print ["a-zA-Z0-9_-]` or `print [^[:alpha:]]`, etc.
## 28-10-2019
- `^` if first matches beginning of the command's string, $ if last its end. So that it's
possible to enter `'^ls'` and have only commands starting with `ls` matched.
## 25-05-2018
- Hash holding paths that shouldn't be grepped (globbed) blacklist for slow disks, mounts, etc.:
```zsh
typeset -gA FAST_BLIST_PATTERNS
FAST_BLIST_PATTERNS[/mount/nfs1/*]=1
FAST_BLIST_PATTERNS[/mount/disk2/*]=1
```
## 13-06-2017
- Canceling search doesn't clear entered query. Change to previous behavior via:
```zsh
zstyle ":plugin:history-search-multi-word" clear-on-cancel "yes"
```
## 12-04-2017
- Page size can be relative to screen height, e.g.:
```zsh
zstyle ":history-search-multi-word" page-size "LINES/4"
```
## 05-04-2017
- 17% performance optimization
## 27-01-2017
- Input-driven case-sensivity of search if your query contains capital latin letters, search will
be case-sensitive
## 12-11-2016
- HSMW can now show context of selected history entry! Just hit `Ctrl-K`,
[video](https://asciinema.org/a/92516)
- More performance optimizations
## 31-10-2016
- Newlines do not disturb the parser anymore, and are also highlighted with a dark color
[video](https://asciinema.org/a/91159)
## 27-10-2016
- New optimizations **30%** speed up of syntax highlighting!
- Architectural change syntax highlighting is now computed rarely, so any possible performance
problems are now solved, in advance!
## 24-10-2016
- Workaround for Zsh versions like 5.0.2 has been added **Ctrl-V** and **ESC** cancel search. On
such Zsh versions Ctrl-C might not work. Fully problem-free Zsh version will be the upcoming 5.3,
where I have together with Zsh Hackers fully fixed the Ctrl-C issue.
## 22-10-2016
- Search process has been optimized by 20%! History sizes like 100000 are now supported.
- Active history entry can be `underline`, `standout` (i.e. inverse video), `bold`, `bg=blue`, etc.
with the new Zstyle `:plugin:history-search-multi-word / active` (see Zstyles section)
[video](https://asciinema.org/a/90214).
## 16-10-2016
- More optimizations of syntax highlighting (40% in total for the two days) new video above.
## 15-10-2016
- The compact, already optimized (by me)
[zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) part has been
further optimized by 21%! Also, more tokens are highlighted variable expressions like
`"${(@)var[1,3]}"` (when quoted).
## 11-10-2016
- Syntax highlighting of history adapted, fine crafted, **small** part of
[zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) to color what
`hsmw` shows:
![syntax highlighting](http://imagizer.imageshack.us/a/img921/1503/bMAF59.gif)
## 20-09-2016
- Keys Page Up and Page Down work and page-wise move along history. Also, `Ctrl-P`, `Ctrl-N` move to
previous and next entries.
## 19-09-2016
- Better immunity to [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) and
[zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) home, end, left
and right cursor keys now work smoothly.
## 25-05-2016
- Cooperation with [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) plugin
- Configuration option to set page size, example use:
```zsh
zstyle ":history-search-multi-word" page-size "5"
```

View file

@ -1,441 +0,0 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [2018-08-14, received $30](#2018-08-14-received-30)
- [2018-08-03, received $8](#2018-08-03-received-8)
- [2018-08-02, received $3 from Patreon](#2018-08-02-received-3-from-patreon)
- [2018-07-31, received $7](#2018-07-31-received-7)
- [2018-07-28, received $2](#2018-07-28-received-2)
- [2018-07-25, received $3](#2018-07-25-received-3)
- [2018-07-20, received $3](#2018-07-20-received-3)
- [2018-06-17, received ~$155 (200 CAD)](#2018-06-17-received-155-200-cad)
- [2018-06-10, received $10](#2018-06-10-received-10)
- [2018-05-25, received $50](#2018-05-25-received-50)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
Below are reports about what is being done with donations, i.e. which commits
are created thanks to them, which new features are added, etc. From the money
I receive I buy myself coffee and organize the time to work on the requested
features, sometimes many days in a row.
## 2018-08-14, received $30
* **Project**: **[Zplugin](https://github.com/zdharma-continuum/zinit)**
* **Goal**: Create a binary Zsh module with one Zplugin optimization and optionally some
other features.
* **Status**: The job is done.
Thanks to this donation I have finally started to code **[binary Zplugin module](
https://github.com/zdharma-continuum/zinit#quick-start-module-only)**, which is a big step onward
in evolution of Zplugin. I've implemented and published the module with 3 complete
features: 1) `load` optimization, 2) autocompilation of scripts, 3) profiling of script
load times.
Commit list:
```
2018-08-22 7b96fad doc: mod-install.sh
2018-08-22 ba1ba64 module: Update zpmod usage text
2018-08-22 b0d72e8 zplugin,*autoload: `module' command, manages new zdharma/zplugin module
2018-08-22 706bbb3 Update Zsh source files to latest
2018-08-20 b77426f module: source-study builds report with milliseconds without fractions
2018-08-20 c3cc09b module: Updated zpmod_usage, i.a. with `source-study' sub-command
2018-08-20 6190295 module: Go back to subcommand-interface to `zpmod'; simple option parser
2018-08-20 881005f module: Report on sourcing times is shown on `zpmod -S`. Done generation
2018-08-19 e5d046a module: Correct conditions on zwc file vs. script file (after stats)
2018-08-19 1282c21 module: Duration of sourcing a file is measured and stored into a hash
2018-08-18 e080153 module: Overload both `source' and `.' builtins
2018-08-18 580efb8 module: Invoke bin_zcompile with -U option (i.e. no alias expansion)
2018-08-18 b7d9836 module: Custom `source' ensures script is compiled, compiles if not
2018-08-18 1e75a47 module: Code cleanup, vim folding
2018-08-18 a4a02f3 module: Finally working `source'/`.' overload (used options translating)
2018-08-16 99bba56 module: zpmod_usage gained content
2018-08-16 04703cd module: Add the main builtin zpmod with report-append which is working
2018-08-16 cd6dc19 module: my_ztrdup_glen, zp_unmetafy_zalloc
2018-08-16 6d44e36 module: Cleanup, `source' overload after patron leoj3n restarted module
```
## 2018-08-03, received $8
* **Project**: **[zdharma/history-search-multi-word](https://github.com/zdharma/history-search-multi-word)**
* **Goal**: Allow calling `zle reset-prompt` (Zshell feature).
* **Status**: The job is done.
A user wanted to be able to call `reset-prompt` Zshell widget without disturbing my project
`history-search-multi-word`. I've implemented the necessary changes to HSMW.
Commit list:
```
2018-08-04 9745d3d hsmw: reset-prompt-protect zstyle allow users to run zle reset-prompt
2018-08-04 ce48a53 hsmw: More typo-like lackings of % substitution
2018-08-04 7e2d79b hsmw: A somewhat typo, missing % substitution
```
## 2018-08-02, received $3 from Patreon
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: No goal set up.
* **Status**: Bug-fixing work.
I did bug-fixing run on `fast-syntax-highlighting`, spotted many small and sometimes important things to
improve. Did one bigger thing added global-aliases functionality.
Commit list:
```
2018-08-02 1e854f5 -autoload.ch: Don't check existence for arguments that are variables
2018-08-02 14cdc5e *-string-*: Support highlighter cooperation in presence of $PREBUFFER
2018-08-02 2d8f0e4 *-highlight: Correctly highlight $VAR, $~VAR, ${+VAR}, etc. in strings
2018-08-02 e3032d9 *-highlight: ${#PREBUFFER} -> __PBUFLEN, equal performance
2018-08-02 f0a7121 *-highlight: Make case conditions and brackets highlighter compatible
2018-08-02 781f68e *-highlight: Recognize more case-item-end tokens
2018-08-02 206c122 *-highlight: Remove unused 4th __arg_type
2018-08-02 c6da477 *-string-*: Handle 'abc\' no slash-quoting here. Full quoting support
2018-08-02 52e0176 *-string-*: Fix bug, third level was getting wrong style
2018-08-02 5edbfae -git.ch: Support "--message=..." syntax (commit)
2018-08-02 669d4b7 -git.ch: Handle "--" argument (stops options)
2018-08-02 4fae1f2 -make.ch: Handle make's -f option
2018-08-02 3fd32fe -make.ch: Handle make's -C option
2018-08-02 31751f5 -make.ch: Recognize options that obtain argument
2018-08-02 e480f18 -make.ch: Fix reply-var clash, gained consistency
2018-08-02 0e8bc1e Updated README.md
2018-08-02 eee0034 images: global-alias.png
2018-08-02 00b41ef *-highlight,themes,fast-theme: Support for global aliases #41
```
## 2018-07-31, received $7
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: Implement ideal brackets highlighting.
* **Status**: The job is done.
When a source code is edited e.g. in `Notepad++` or some IDE, then most often brackets are somehow matched to
each other, so that the programmer can detect mistakes. `Fast-syntax-highlighting` too gained that feature. It
was done in such a way that FSH cannot make any mistake, colors will perfectly match brackets to each other.
Commit list:
```
2018-07-31 2889860 *-highlight: Correct place to initialize $_FAST_COMPLEX_BRACKETS
2018-07-31 2bde2a9 Performance status -15/8/8
2018-07-31 5078261 *-highlight,README: Brackets highlighter active by default
2018-07-31 2ee3073 *-highlight,*string-*: Brackets in [[..]], ((..)), etc. handled normally
2018-07-31 776b12d plugin.zsh: $_ZSH_HIGHLIGHT_MAIN_CACHE -> $_FAST_MAIN_CACHE
2018-07-30 2867712 plugin.zsh: Fix array parameter created without declaring #43
2018-07-30 cbe5fc8 Updated README.md
2018-07-30 2bd3291 images: brackets.gif
2018-07-30 ef23a96 *-string-*: Bug-fix, correctly use theme styles
2018-07-30 9046f82 plugin.zsh: Attach the new brackets highlighter; F_H[use_brackets]=1
2018-07-30 b33a5fd fast-theme: Support 4 new styles (for brackets)
2018-07-30 a03f004 themes: Add 4 new styles (brackets)
2018-07-30 2448cdc *-string-*: Additional highlight of bracket under cursor; more styles
2018-07-30 5e1795e *-string-*: Highlighter for brackets, handles all quotings; detached
```
## 2018-07-28, received $2
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: Distinguish file and directory when highlighting
* **Status**: The job is done.
A user requested that when `fast-syntax-highlighting` colorizes the command line it should use different
styles (e.g. colors) for token that's a *file* and that's a *directory*. It was a reasonable idea and I've
implemented it.
Commit list:
```
2018-07-28 7f48e04 themes: Extend all themes with new style `path-to-dir'
2018-07-28 c7c6a91 fast-theme: Support for new style `path-to-dir'
2018-07-28 264676c *-highlight: Differentiate path and to-dir path. New style: path-to-dir
```
## 2018-07-25, received $3
* **Project**: **[zdharma/zshelldoc](https://github.com/zdharma/zshelldoc)**
* **Goal**: Implement documenting of used environment variables.
* **Status**: The job is done.
Zshelldoc generates code-documentation like Doxygen or Javadoc, etc. User requested a
new feature: the generated docs should enumerate environment variables used and/or
exported by every function. Everything went fine and this feature has been implemented.
Commit list:
```
2018-07-26 f63ea25 Updated README.md
2018-07-26 3af0cf7 *detect: Get `var' from ${var:-...} and ${...:+${var}} and other subst
2018-07-25 2932510 *adoc: Better language in output document (about exported vars) #5
2018-07-25 f858dd8 *adoc: Include (in the output document) data on env-vars used #5
2018-07-25 80e3763 *adoc: Include data on exports (environment) in the output document #5
2018-07-25 ca576e2 *detect: Detect which env-vars are used, store meta-data in data/ #5
2018-07-25 f369dcc *detect: Function `find-variables' reported "$" as a variable, fixed #5
2018-07-25 e243dab *detect: Function `find-variables' #5
2018-07-25 5b34bb1 *transform: Detect exports done by function/script-body, store #5
```
## 2018-07-20, received $3
* **Project**: **[zdharma/zshelldoc](https://github.com/zdharma/zshelldoc)**
* **Goal**: Implement stripping of leading `#` char from functions' descriptions.
* **Status**: The job is done.
A user didn't like that functions' descriptions in the JavaDoc-like document (generated with Zshelldoc) all
contain a leading `#` character. I've added stripping of this character (it is there in the processed source
code) controlled by a new Zshelldoc option.
Commit list:
```
2018-07-20 172c220 zsd,*adoc,README: Option --scomm to strip "#" from function descriptions
```
## 2018-06-17, received ~$155 (200 CAD)
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: No goal set up.
* **Status**: Done intense research.
I've created 2 new branches: `Hue-optimization` (33 commits) and `Tidbits-feature` (22 commits). Those were
branches with architectural changes and extraordinary features. The changes yielded to be too slow, and I had
to withdraw the merge. Below are fixing and optimizing commits (i.e. the valuable ones) that I've restored
from the two branches into master.
Commit list:
```
2018-07-21 dab6576 *-highlight: Merge-restore: remove old comments
2018-07-21 637521f *-highlight: Merge-restore: a threshold on # of zle .redisplay calls
2018-07-21 4163d4d *-highlight: Merge-restore: optimize four $__arg[1] = ... cases
2018-07-21 0f01195 *-highlight: Merge-restore: can remove one (Q) dequoting
2018-07-21 39a4ec6 *-highlight: Merge-restore: $v = A* is faster than $v[1] = A, tests:
2018-07-21 99d6b33 *-highlight: Merge-restore: optimize-out ${var:1} Bash syntax
2018-07-21 719c092 *-highlight: Merge-restore: allow $V/cmd, "$V/cmd, "$V/cmd", "${V}/cmd"
2018-07-21 026941d *-highlight: Merge-restore: stack pop in single instruction, not two
2018-07-21 3467e3d *-highlight: Merge-restore: more reasonable redirection-detecting code
2018-07-21 00d25ee *-highlight: Merge-restore: one active_command="$__arg" not needed (?)
2018-07-21 1daa6b3 *-highlight: Merge-restore: simplify ; and \n code short-paths
2018-07-21 55d65be *-highlight: Merge-restore: proc_buf advancement via patterns (not (i))
2018-07-21 cc55546 *-highlight: Merge-restore: pattern matching to replace (i) flag
```
## 2018-06-10, received $10
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: No goal set up.
* **Status**: Done intense experimenting.
I was working on *chromas* command-specific colorization. I've added `which` and
`printf` colorization, then added asynchronous path checking (needed on slow network
drives), then coded experimental `ZPath` feature for chromas, but it couldn't be optimized
so I had to resign of it.
Commit list:
```
2018-06-12 c4ed1c6 Optimization the same idea as in previous patch, better method
2018-06-12 c36feef Optimization a) don't index large buffer, b) with negative index
2018-06-12 2f03829 Performance status 2298 / 1850
2018-06-12 14f5159 New working feature ZPath. It requires optimization
2018-06-12 e027c40 -which.ch: One of commands can apparently return via stderr (#27)
2018-06-11 5b8004f New chroma `ruby', works like chroma `perl', checks syntax via -ce opts
2018-06-10 ca2e18b *-highlight: Async path checking has now 8-second cache
2018-06-10 e071469 *-highlight: Remove path-exists queue clearing
2018-06-10 5a6684c *-highlight: Support for asynchronous path checking
2018-06-10 1d7d6f5 New chroma: `printf', highlights special sequences like %s, %20s, etc.
2018-06-10 8f59868 -which.ch: Update main comment on purpose of this chroma
2018-06-10 5f4ece2 -which.ch: Added `whatis', it has only 1st line if output used
2018-06-10 e2d173e -which.ch: Uplift: handle `which' called on a function, /usr/bin/which
```
## 2018-05-25, received $50
* **Project**: **[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)**
* **Goal**: No goal set up.
* **Status**: New ideas and features.
I was working from May, 25 to June, 9 and came up with key ideas and implemented them. First were *themes*
that were very special because they were using `INI` files instead of some Zsh-script format. Creating themes
for `fast-syntax-highlighting` is thus easy and fun. Then I came up with *chromas*, command-specific
highlighting, which redefine how syntax-highlighting for Zshell works detailed highlighting for e.g. Git
became possible, the user is informed about e.g. a mistake even before running a command. Overall 178 commits
in 16 days.
```
2018-06-09 3f72e6c -git.ch: `revert' works almost like `checkout', attach `revert' there
2018-06-09 b892743 Updated CHROMA_GUIDE.adoc
2018-06-09 f05643d Revert "Revert "Updated CHROMA_GUIDE.md""
2018-06-09 729bf7f Revert "Revert "CHROMA_GUIDE: Remove redundant comments, uplift""
2018-06-09 48a4e0c Revert "CHROMA_GUIDE: Remove redundant comments, uplift"
2018-06-09 55ede0a Revert "Updated CHROMA_GUIDE.md"
2018-06-09 17a28ba New chroma `-docker.ch' that verifies image ID passed to `image rm'
2018-06-09 868812a -make.ch,*-make-targets: Check Makefile exists, use 7 second cache, #24
2018-06-09 73df278 -sh.ch: Attach fish, has -c option, though different syntax, let's try
2018-06-09 3a73b8e Updated CHROMA_GUIDE.md
2018-06-09 29d04c8 CHROMA_GUIDE: Remove redundant comments, uplift
2018-06-09 22ce1d8 -sh.ch,*-highlight: Attach to 2 other shells, Zsh and Bash
2018-06-09 f54e44f New chroma `-sh.ch', colorizes code passed to `sh' with -c option
2018-06-09 f5d2375 CHROMA_GUIDE: Add example code block (rendered broken in mdown)
2018-06-09 08f4b28 CHROMA_GUIDE: Switch to asciidoc (rename)
2018-06-09 4e03609 CHROMA_GUIDE.md
2018-06-09 bbcf2d6 -source.ch: Word "source" should be highlighted as builtin
2018-06-09 6739b8b New chroma `source' to handle . and source builtins
2018-06-09 b961211 gitignore: ignore more paths
2018-06-09 59d5d09 Updated README.md
2018-06-09 f6d4d19 Updated README.md
2018-06-09 eb31324 Update README.md (figlet logo)
2018-06-09 71dcc5f Performance status 298 / 479
2018-06-09 00c5f8f *-highlight: Add comments
2018-06-09 232903c -awk.ch: Highlight `sub' function, not working {, } highlighting
2018-06-09 b5241ba *-highlight: Much better $( ) recursion, would say problems-free, maybe
2018-06-08 6c69437 *-highlight: Larger buffer (110 -> 250) for $( ) matching
2018-06-08 f2b7a96 -awk.ch: Syntax check code passed to awk. Awk is very forgiving, though
2018-06-08 c53d8ba -vim.ch: Pass almost everything to big-loop, check if vim exists
2018-06-08 7fbf7cd chroma: New chroma `vim', shows last opened files under prompt
2018-06-08 06e4570 gitignore: Extend .gitignore
2018-06-08 3184ba1 chroma: All chroma functions end chroma mode on e.g. | and similar
2018-06-08 070077d *-highlight,-example.ch: Rename arg_type -> __arg_type, use it to end
2018-06-08 6c2411e -awk.ch: Use the new theme style `subtle-bg'
2018-06-08 9ec8d63 themes: All themes (remaining 4) to support `subtle-bg' style
2018-06-08 66e848b fast-theme: New theme key `subtle-bg', default & clean.ini support it
2018-06-08 1e794f9 -awk.ch: More keywords highlighted
2018-06-08 f3bbaca -awk.ch: Don't highlight keywords when they only contain proper keyword
2018-06-08 e4d5283 -awk.ch: Fix mistake (indices), was highlighting 1 extra trailing letter
2018-06-08 eebbb19 -awk.ch: Initialize FSH_LIST
2018-06-08 8ec24ca *-highlight: Missing math function for awk
2018-06-08 d8e423a -awk.ch: Highlight more keywords, via more general code
2018-06-07 ee26e66 Commit missing -fast-make-targets
2018-06-07 9d4f2b5 New chroma `-awk.ch', colorizes regex characters and a keyword (print)
2018-06-07 def5133 -example.ch: Add comments
2018-06-07 f31a2d0 New chroma -make.ch, verifies if target is correct
2018-06-07 623b8ce -perl.ch: Use correct keys in FAST_HIGHLIGHT hash
2018-06-07 090f420 themes: Make all themes provide {in,}correct-subtle styles
2018-06-07 2201fb6 New -perl.ch chroma, syntax-checks perl code; 2 new theme entries
2018-06-06 4b9598e *-highlight: Fix bug in math highlight allow variables starting with _
2018-06-06 708afec *-highlight: Fix FAST_BLIST_PATTERNS not expanding path to absolute one
2018-06-06 caef05a -example.ch: Update, fix typos, remove unused code
2018-06-06 3fb192a Updated README.md
2018-06-06 6de0c82 images: git_chroma.png
2018-06-06 2852fdd -grep.ch (new): Special highlighting for grep -grep.ch chroma function
2018-06-06 f216785 -example.ch: Added comments
2018-06-06 4ab5b36 -example.ch: Add comments
2018-06-06 380cd12 -example.ch: Added comments
2018-06-06 c8947cc -example.ch: Add comments
2018-06-06 f2e273e -example.ch: Add comments
2018-06-06 2f3565b plugin.zsh: Fix parse error
2018-06-06 4f1a9bd plugin.zsh: Added $fpath handling, to match what README contains
2018-06-06 cc9adb5 -example.ch: Change and extend comments
2018-06-06 3128fff -git.ch: More intelligent `checkout' highlighting ref is first
2018-06-06 4b6f54b -git.ch: Support for `checkout' subcommand
2018-06-06 1930d37 -example.ch: Added example chroma function
2018-06-05 d79cd85 -git.ch: Add comments
2018-06-05 1473c9e -git.ch: Add comments
2018-06-05 0cb1419 -git.ch: Message passed after -m is checked for the 72 chars boundary
2018-06-05 3f99944 -git.ch: Architectural uplift of git chroma
2018-06-05 e044d13 -git.ch: Single place to add entry to $reply (target: region_highlight)
2018-06-05 3a84364 -git.ch: Handle quoted non-option arguments, also partly quoted: "abc
2018-06-05 d635bf4 -fast-run-git-command, it handles cache automatically, decimates source
2018-06-05 102ea78 -git.ch: Smart handling of `git push', remotes and branches are verified
2018-06-04 be88850 Performance status [+] 39+77=116 / -26+24=-2
2018-06-04 0e033f8 Experimental chroma support, currently active only on command `git'
2018-06-04 43ae221 *-highlight: Emacs mode-line
2018-06-04 938ad29 test: New "-git" parsing option, test results, -git.ch included
2018-06-04 e433fbc fast-theme: Explicitly return 0; added Emacs mode-line
2018-06-04 66e9b3c *-highlight: Detection of $( ) now doesn't go for $(( )) as a candidate
2018-06-04 488a580 chroma: Empty chroma function for `git'
2018-06-04 f54d770 *-highlight: Rename $cur_cmd to $active_command
2018-06-04 3f24e68 *-highlight: Make sudo and always-block compatible with `case' handling
2018-06-02 cd82637 themes: forest.ini to support 3 new `case' styles
2018-06-02 e1e993e themes: safari.ini & zdharma.ini to support 3 new `case' styles
2018-06-02 2e78a02 themes: clean.ini & default.ini to support 3 new `case' styles
2018-06-02 c1c3aab themes: free.ini to support 3 new `case' styles
2018-06-02 70a7e18 fast-theme,*-highlight: 3 new styles for `case' higlighting
2018-06-02 8d90dc2 *-highlight: Support for `case' highlighting
2018-06-02 10d291c *-highlight: Softer state manipulation, less rigid =1 etc. assignments
2018-06-02 6159507 *-highlight: Don't highlight closing ) with style `assign'
2018-06-02 1fc2450 *-highlight: One complex math command optimization, top of the loop
2018-06-02 cc49247 *-highlight: Fix improper state after assignment (command | regular)
2018-06-02 02942b8 Updated README.md
2018-06-02 5e28259 images: eval_cmp.png
2018-06-02 df92fed *-highlight: Fix removal of trailing "/' when recursing in eval
2018-06-02 4f61938 Performance status 46 / 44
2018-06-02 a5ade0e *-highlight: Recursive highlighting of eval string argument
2018-06-02 e91847b *-highlight: Don't recurse when not at main *-process call
2018-06-02 fca8603 *-highlight: Support assignments of arrays when key is taken from array
2018-06-02 5d70f01 *-highlight: Math highlighting recognizes ${+VAR}
2018-06-02 c48eb0d *-highlight: Math colorizing recognizes variables in braces ${HISTISZE}
2018-06-02 53dd85a *-highlight: Allow -- for precommand modifiers command & exec
2018-06-02 d9fe110 *-highlight: Detect globbing also when `##' occurs
2018-06-02 55c923d Performance status 132 / 66
2018-06-02 3bd8f07 themes: safari.ini to have globbing color specifically selected
2018-06-02 2b55260 themes: free.ini to have globbing color specifically selected
2018-06-02 494868e themes: clean.ini to have globbing color specifically selected
2018-06-01 fca6b3d images: herestring.png #9
2018-06-01 f9842c1 themes: forest.ini to use underline instead of bg color #9
2018-06-01 c25c539 themes: Small tune-up of forest & zdharma themes for here-string #9
2018-06-01 988d504 themes: Rudimentary (all same) configuration of here-string tokens #9
2018-06-01 99842d2 fast-theme,*-highlight: Support for here-string, can use bg color #9
2018-06-01 f739c30 Updated README.md
2018-06-01 7fa8451 images: execfd.png execfd_cmp.png
2018-06-01 d7384f1 themes: All themes gained `exec-descriptor=` key, now supported by code
2018-06-01 d66d140 themes: Fix improper effect of s/red/.../ substitution in clean,forest
2018-06-01 f7ee5e2 fast-theme,*-highlight: Support highlighting of {FD} etc. passed to exec
2018-06-01 e5c5534 *-highlight: Proper states for precmd (command,exec) option handling
2018-06-01 647b198 images: New cmdsubst.png
2018-06-01 74bdc4c Updated README.md
2018-06-01 86eb15e images: theme.png
2018-06-01 5169e82 Updated README.md
2018-06-01 1c462b7 Updated README.md
2018-06-01 4c21da4 images: cmdsubst.png
2018-06-01 b39996e *-highlight: Switch theme to secondary when descending into $() #15
2018-06-01 bf96045 themes: Equip all themes with key `secondary' (an alternate theme) #15
2018-06-01 aa1b112 fast-theme: Generate secondary theme (from key `secondary' in theme) #15
2018-06-01 6dd3bd3 *-highlight: Support for multiple active themes #15
2018-06-01 8a32944 *-highlight: Fix "$() found?" comparison
2018-06-01 3651605 *-highlight: Significant change: the parser is called recursively on $()
2018-05-31 882d88b test,*-highlight: New -ooo performance test; highlighter takes arguments
2018-05-31 5ba1178 *-highlight: Optimization - compute __arg length once
2018-05-30 b2a0126 *-highlight: Allow multiple separate options for `command', `exec' (#10)
2018-05-30 5804e9a *-highlight: Correct state after option for precommand (#10)
2018-05-30 1247b64 *-highlight: Simpler and more accurate option-testing for exec, command (#10)
2018-05-30 d87fed4 *-highlight: Correctly highlight options for `command' and `exec' (#10)
2018-05-30 8c3e75e *-highlight: Double-hyphen (--) stops option recognition and colorizing
2018-05-30 1c5a56c *-highlight: Support ${VAR} at command position (not only $VAR)
2018-05-30 f19d761 Updated README.md
2018-05-30 4a27351 images: for-loop
2018-05-30 4d650de themes: zdharma.ini to support for-loop
2018-05-30 45cafbc themes: safari.ini to support for-loop
2018-05-30 8bb9ee0 themes: free.ini to support for-loop
2018-05-30 f25a059 themes: forest.ini to support for-loop
2018-05-29 093d79e themes: default.ini to support for-loop
2018-05-29 446cb7b clean.ini,fast-theme: Clean-theme & theme subsystem to support for-loop
2018-05-29 1bb701f *-highlight: Move $variable highlighting from case to if-block
2018-05-29 b8413e9 *-highlight: For-loop highlighting, working, needs few upgrades
2018-05-28 7bec6e5 *-highlight: Three more simple vs. complex math operation optimizations
2018-05-27 baae683 *-highlight: Optimise complex math command into single one with & and ~
2018-05-27 2dc3103 *-highlight: Optimise complex math command into single one with & and ~
2018-05-27 291f905 _fast-theme: Update -t/--test description
2018-05-27 ec305f6 fast-theme: Help message treats about -t/--test
2018-05-27 0e1d19a Updated README.md
2018-05-27 5c3c911 Updated README.md
2018-05-26 76af248 themes: A fix for zdharma theme, 61 -> 63, a lighter color for builtins
2018-05-26 8eca0f2 *fast-theme: Ability to test theme after setting it (-t/--test)
2018-05-26 d3a7922 *-highlight: Fix in_array_assignment setting when closing ) found
2018-05-26 796c482 *-highlight: Make parameters' names exotic blank-var detection to work
2018-05-26 ae3913f _fast-theme: Complete theme names
2018-05-26 d212945 *-highlight,plugin.zsh,default.ini: Uplift of fg=112-fix code
2018-05-26 ee56f65 *-highlight,plugin.zsh: Final fix for fg=112 assignment  use zstyle
2018-05-26 391f5a4 fast-theme: Set `theme' zstyle in `:plugin:fast...' to given theme
2018-05-26 e0dc086 plugin.zsh: Fix the fg=112 assignment done for `variable' style
2018-05-26 17c9286 Updated README.md
2018-05-26 4774c1c fast-theme: Add completion for this function
2018-05-26 d971f39 fast-theme: Detect lack of theme name in arguments
2018-05-26 74f0d4d fast-theme: Use standard option parsing (zparseopts) and typical options
2018-05-26 d9c6180 New theme: `forest'
2018-05-26 419c156 New theme: `zdharma'
2018-05-26 a7735df gitignore
2018-05-26 99db69a New theme: `free'
2018-05-26 73619ff New theme: `clean'
2018-05-25 52307fb Theme support, 1 extra theme `safari'
2018-05-25 41df55b *-highlight: (k) subscript flag is sufficient, no need for (K)
2018-05-25 cb21c05 Updated README.md
2018-05-25 a580cff *-highlight: FAST_BLIST_PATTERNS
```

240
README.md
View file

@ -1,35 +1,32 @@
[![License (GPL version 3)](https://img.shields.io/badge/license-GNU%20GPL%20version%203-blue.svg?style=flat-square)](./LICENSE) # history-search-multi-word - zsh plugin
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](./LICENSE)
![ZSH 5.0.0](https://img.shields.io/badge/zsh-v5.0.0-orange.svg?style=flat-square)
[![Gitter][gitter-image]][gitter-link]
# Introduction [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
[![Gitter](https://img.shields.io/gitter/room/zdharma-continuum/zinit.svg?style=flat-square)](https://gitter.im/zdharma-continuum/zinit)
Binds `Ctrl-R` to a widget that searches for multiple keywords in `AND` fashion. Binds `Ctrl-R` to a widget that searches for multiple keywords in an `AND` fashion. In other words, you
In other words, you can enter multiple words, and history entries that match can enter multiple words, and history entries that match all of them are returned. Additionally, search matches are syntax highlighted.
all of them will be found. The entries are syntax highlighted.
Video  view on [asciinema](https://asciinema.org/a/88954). You can resize the video by pressing `Ctrl-+` or `Cmd-+`. Video view on [asciinema](https://asciinema.org/a/88954). You can resize the video by pressing
`Ctrl-+` or `Cmd-+`.
[![asciicast](https://asciinema.org/a/88954.png)](https://asciinema.org/a/88954) [![asciicast](https://asciinema.org/a/88954.png)](https://asciinema.org/a/88954)
HSMW has feature called **context viewing**  see all occurrences of a command together HSMW has a feature called **context viewing** see all occurrences of a command together with
with surrounding commands: surrounding commands:
[![asciicast](https://asciinema.org/a/155704.png)](https://asciinema.org/a/155704) [![asciicast](https://asciinema.org/a/155704.png)](https://asciinema.org/a/155704)
Set: Set:
```zsh ```bash
zstyle :plugin:history-search-multi-word reset-prompt-protect 1 zstyle :plugin:history-search-multi-word reset-prompt-protect 1
``` ```
to be able to use `zle reset-prompt` in your e.g. `sched` calls, in presence of In order to use `zle reset-prompt` in function calls (e.g. `sched`) in addition to plugins that hook up into Zshell by overloading Zle
`zdharma-continuum/fast-syntax-highlighting`, `zsh-users/zsh-syntax-highlighting`, widgets (e.g., `fast-syntax-highlighting`, `zsh-syntax-highlighting`,
`zsh-users/zsh-autosuggestions` and other plugins that hook up into Zshell by `zsh-autosuggestions`), use `sched` :
overloading Zle widgets. You could e.g. use `sched` in following way:
```zsh ```bash
PROMPT=%B%F{yellow}%D{%H:%M:%S}%B%b%f PROMPT=%B%F{yellow}%D{%H:%M:%S}%B%b%f
schedprompt() { schedprompt() {
zle && zle reset-prompt zle && zle reset-prompt
@ -40,209 +37,122 @@ zmodload -i zsh/sched
schedprompt schedprompt
``` ```
to refresh the clock in prompt every second. The `reset-prompt-protect` zstyle To refresh the clock in prompt every second. The `reset-prompt-protect` zstyle should be `1`
needs to be set to 1 for correct cooperation with HSMW. Or, you could use `zle for proper cooperation with HSMW. Or, you could use `zle .reset-prompt` (i.e., with the dot in
.reset-prompt` (i.e. with the dot in front) to call the original, not front) to call the original, not overloaded (e.g., F-Sy-H, zsh-autosuggestions, etc.) `reset-prompt` widget.
overloaded (by F-Sy-H, zsh-autosuggestsions, etc.) `reset-prompt` widget.
# News ## Installation
* 14-07-2020
- If an `[…]` string will occur in the search query, it'll be interpreted as
pattern. So that it's possible to enter as the search query e.g.: `print
["a-zA-Z0-9_-]` or `print [^[:alpha:]]`, etc.
* 28-10-2019 The plugin is **plugin manager agnostic**.
- `^`  if first matches beginning of the command's string, $  if last
its end. So that it's possible to enter `'^ls'` and have only commands
starting with `ls` matched.
* 25-05-2018 To install, clone the `history-search-multi-word` repository and add the following snippet to your
- Hash holding paths that shouldn't be grepped (globbed) blacklist for slow disks, mounts, etc.: `.zshrc`
```zsh ```bash
typeset -gA FAST_BLIST_PATTERNS source <LOCATION-WHERE-REPOSITORY >/history-search-multi-word.plugin.zsh
FAST_BLIST_PATTERNS[/mount/nfs1/*]=1
FAST_BLIST_PATTERNS[/mount/disk2/*]=1
```
* 13-06-2017
- Canceling search doesn't clear entered query. Change to previous behavior via:
```zsh
zstyle ":plugin:history-search-multi-word" clear-on-cancel "yes"
```
* 12-04-2017
- Page size can be relative to screen height, e.g.:
```zsh
zstyle ":history-search-multi-word" page-size "LINES/4"
```
* 05-04-2017
- 17% performance optimization
* 27-01-2017
- Input-driven case-sensivity of search  if your query contains capital latin letters, search will be case-sensitive
* 12-11-2016
- HSMW can now show context of selected history entry! Just hit `Ctrl-K`, [video](https://asciinema.org/a/92516)
- More performance optimizations
* 31-10-2016
- Newlines do not disturb the parser anymore, and are also highlighted with a dark color  [video](https://asciinema.org/a/91159)
* 27-10-2016
- New optimizations **30%** speed up of syntax highlighting!
- Architectural change  syntax highlighting is now computed rarely, so any possible performance problems are now solved, in advance!
* 24-10-2016
- Workaround for Zsh versions like 5.0.2 has been added  **Ctrl-V** and **ESC** cancel search. On such Zsh
versions Ctrl-C might not work. Fully problem-free Zsh version will be the upcoming 5.3, where
I have together with Zsh Hackers fully fixed the Ctrl-C issue.
* 22-10-2016
- Search process has been optimized by 20%! History sizes like 100000 are now supported.
- Active history entry can be `underline`, `standout` (i.e. inverse video), `bold`, `bg=blue`, etc. with
the new Zstyle `:plugin:history-search-multi-word / active` (see Zstyles section)  [video](https://asciinema.org/a/90214).
* 16-10-2016
- More optimizations of syntax highlighting (40% in total for the two days) new video above.
* 15-10-2016
- The compact, already optimized (by me) [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) part has been further optimized by 21%!
Also, more tokens are highlighted  variable expressions like `"${(@)var[1,3]}"` (when quoted).
* 11-10-2016
- Syntax highlighting of history  adapted, fine crafted, **small** part of [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)
to color what `hsmw` shows:
![syntax highlighting](http://imagizer.imageshack.us/a/img921/1503/bMAF59.gif)
* 20-09-2016
- Keys Page Up and Page Down work and page-wise move along history. Also, `Ctrl-P`, `Ctrl-N`
move to previous and next entries.
* 19-09-2016
- Better immunity to [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
and [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) home,
end, left and right cursor keys now work smoothly.
* 25-05-2016
- Cooperation with
[zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
plugin
- Configuration option to set page size, example use:
```zsh
zstyle ":history-search-multi-word" page-size "5"
```
# Installation
**The plugin is "standalone"**, which means that only sourcing it is needed. So to
install, unpack `history-search-multi-word` somewhere and add
```zsh
source {where-hsmw-is}/history-search-multi-word.plugin.zsh
``` ```
to `zshrc`. If using a plugin manager, then `Zinit` is recommended, but you can use any other too, and also
install with `Oh My Zsh` (by copying the directory to `~/.oh-my-zsh/custom/plugins`).
If using a plugin manager, then `Zinit` is recommended, but you can use any
other too, and also install with `Oh My Zsh` (by copying directory to
`~/.oh-my-zsh/custom/plugins`).
### [Zinit](https://github.com/zdharma-continuum/zinit) ### [Zinit](https://github.com/zdharma-continuum/zinit)
Add `zinit load zdharma-continuum/history-search-multi-word` to your `.zshrc` file. Add the following snippet to your `.zshrc`:
Zinit will handle cloning the plugin for you automatically the next time you
start zsh. ```bash
zinit load zdharma-continuum/history-search-multi-word
```
Zinit will automatically handle cloning the plugin for you the next time you start zsh.
### Antigen ### Antigen
Add `antigen bundle zdharma-continuum/history-search-multi-word` to your `.zshrc` file. Add `antigen bundle zdharma-continuum/history-search-multi-word` to your `.zshrc` file. Antigen will
Antigen will handle cloning the plugin for you automatically the next time you automatically handle cloning the plugin for you the next time you start zsh. You can also add the
start zsh. You can also add the plugin to a running zsh with `antigen bundle plugin to a running zsh with `antigen bundle zdharma-continuum/history-search-multi-word` for
zdharma-continuum/history-search-multi-word` for testing before adding it to your testing before adding it to your `.zshrc`.
`.zshrc`.
### Oh-My-Zsh ### Oh-My-Zsh
1. `cd ~/.oh-my-zsh/custom/plugins` 1. `cd ~/.oh-my-zsh/custom/plugins`
2. `git clone git@github.com:zdharma-continuum/history-search-multi-word.git` 1. `git clone git@github.com:zdharma-continuum/history-search-multi-word.git`
3. Add `history-search-multi-word` to your plugin list 1. Add `history-search-multi-word` to your plugin list
### Zgen ### Zgen
Add `zgen load zdharma-continuum/history-search-multi-word` to your .zshrc file in the same ```zsh
place you're doing your other `zgen load` calls in. zgen load zdharma-continuum/history-search-multi-word
```
to your .zshrc file in the same place
you're doing your other `zgen load` calls in.
### [Sheldon](https://github.com/rossmacarthur/sheldon) ### [Sheldon](https://github.com/rossmacarthur/sheldon)
Run 1. Run
```bash ```bash
sheldon add history-search-multi-word --github zdharma-continuum/history-search-multi-word sheldon add history-search-multi-word --github zdharma-continuum/history-search-multi-word
``` ```
and add `bindkey "^R" history-search-multi-word` to `.zshrc` to enable the keybinding. To add the `ctrl-R` keybinding, add the following snippet to your `.zshrc`
```bash
bindkey "^R" history-search-multi-word
```
### Arch Linux ### Arch Linux
1. Install [`zsh-history-search-multi-word-git`](https://aur.archlinux.org/packages/zsh-history-search-multi-word-git/) from the [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository). 1. Install
[`zsh-history-search-multi-word-git`](https://aur.archlinux.org/packages/zsh-history-search-multi-word-git/)
from the [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository).
2. Add the following to your `.zshrc`: 1. Add the following to your `.zshrc`
```sh ```bash
source /usr/share/zsh/plugins/history-search-multi-word/history-search-multi-word.plugin.zsh source /usr/share/zsh/plugins/history-search-multi-word/history-search-multi-word.plugin.zsh
``` ```
3. Start a new terminal session 1. Start a new terminal session via `exec zsh`
## Options
# Customizing ```bash
## Zstyles
```zsh
zstyle ":history-search-multi-word" page-size "8" # Number of entries to show (default is $LINES/3)
zstyle ":history-search-multi-word" highlight-color "fg=yellow,bold" # Color in which to highlight matched, searched text (default bg=17 on 256-color terminals) zstyle ":history-search-multi-word" highlight-color "fg=yellow,bold" # Color in which to highlight matched, searched text (default bg=17 on 256-color terminals)
zstyle ":plugin:history-search-multi-word" synhl "yes" # Whether to perform syntax highlighting (default true) zstyle ":history-search-multi-word" page-size "8" # Number of entries to show (default is $LINES/3)
zstyle ":plugin:history-search-multi-word" active "underline" # Effect on active history entry. Try: standout, bold, bg=blue (default underline) zstyle ":plugin:history-search-multi-word" active "underline" # Effect on active history entry. Try: standout, bold, bg=blue (default underline)
zstyle ":plugin:history-search-multi-word" check-paths "yes" # Whether to check paths for existence and mark with magenta (default true) zstyle ":plugin:history-search-multi-word" check-paths "yes" # Whether to check paths for existence and mark with magenta (default true)
zstyle ":plugin:history-search-multi-word" clear-on-cancel "no" # Whether pressing Ctrl-C or ESC should clear entered query zstyle ":plugin:history-search-multi-word" clear-on-cancel "no" # Whether pressing Ctrl-C or ESC should clear entered query
zstyle ":plugin:history-search-multi-word" synhl "yes" # Whether to perform syntax highlighting (default true)
``` ```
## Syntax highlighting ### Syntax highlighting
Syntax highlighting is customized via `HSMW_HIGHLIGHT_STYLES` associative array. Syntax highlighting is customized via `HSMW_HIGHLIGHT_STYLES` associative array. It has keys like
It has keys like `reserved-word`, `alias`, `command`, `path`, etc. which are assigned `reserved-word`, `alias`, `command`, `path`, etc., which are assigned with strings like
with strings like `fg=blue,bold`, to configure how given elements are to be `fg=blue,bold` to configure how given elements are to be colored. If you assign this array before
colored. If you assign this array before or after loading `hsmw` you will change the defaults. Complete list or after loading `hsmw`, you will change the defaults. The complete list of available keys is
of available keys is [at the beginning](https://github.com/zdharma-continuum/history-search-multi-word/blob/master/hsmw-highlight#L34-L62) [at the beginning](https://github.com/zdharma-continuum/history-search-multi-word/blob/master/hsmw-highlight#L34-L62)
of `hsmw-highlight` file. Example `~/.zshrc` addition that sets `path` key of `hsmw-highlight` file. Example `~/.zshrc` addition that sets `path` key paths that exist will
paths that exist will be highlighted with background magenta, foreground white, bold: be highlighted with background magenta, foreground white, bold:
```zsh ```bash
typeset -gA HSMW_HIGHLIGHT_STYLES typeset -gA HSMW_HIGHLIGHT_STYLES
HSMW_HIGHLIGHT_STYLES[path]="bg=magenta,fg=white,bold" HSMW_HIGHLIGHT_STYLES[path]="bg=magenta,fg=white,bold"
``` ```
Following code will enable coloring of options of form "-o" and "--option", with cyan: #### Enable coloring of options of form "-o" and "--option", with cyan:
```zsh ```zsh
typeset -gA HSMW_HIGHLIGHT_STYLES typeset -gA HSMW_HIGHLIGHT_STYLES
HSMW_HIGHLIGHT_STYLES[single-hyphen-option]="fg=cyan"
HSMW_HIGHLIGHT_STYLES[double-hyphen-option]="fg=cyan" HSMW_HIGHLIGHT_STYLES[double-hyphen-option]="fg=cyan"
HSMW_HIGHLIGHT_STYLES[single-hyphen-option]="fg=cyan"
``` ```
Following code will use 256 colors to highlight command separators (like ";" or "&&"): #### 256 colors to highlight command separators (e.g., ;, &&, and ||):
```zsh ```bash
HSMW_HIGHLIGHT_STYLES[commandseparator]="fg=241,bg=17" HSMW_HIGHLIGHT_STYLES[commandseparator]="fg=241,bg=17"
``` ```
[gitter-image]: https://badges.gitter.im/zdharma-continuum/community.svg <!-- vim:set ft=markdown tw=100 fo+=1n: -->
[gitter-link]: https://gitter.im/zdharma-continuum/community

View file

@ -1,5 +1,9 @@
# -*- Mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- #!/usr/bin/env zsh
# vim:ft=zsh:sw=4:sts=4:et #
# -*- mode: sh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
#
# Copyright (c) 2016-2020 Sebastian Gniazdowski and contributors
# Copyright (c) 2021-2022 zdharma-continuum and contributors
# To use (when not using as plugin) copy to site-functions and issue # To use (when not using as plugin) copy to site-functions and issue
# (add to ~/.zshrc): # (add to ~/.zshrc):

View file

@ -1,5 +1,9 @@
# -*- Mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- #!/usr/bin/env zsh
# vim:ft=zsh:sw=4:sts=4:et #
# -*- mode: sh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
#
# Copyright (c) 2016-2020 Sebastian Gniazdowski and contributors
# Copyright (c) 2021-2022 zdharma-continuum and contributors
# #
# No plugin manager is needed to use this file. All that is needed is adding: # No plugin manager is needed to use this file. All that is needed is adding:

View file

@ -1,8 +1,11 @@
# -*- Mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- #!/usr/bin/env zsh
# vim:ft=zsh:sw=4:sts=4:et #
# -*- mode: sh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
#
# Copyright (c) 2016-2020 Sebastian Gniazdowski and contributors
# Copyright (c) 2021-2022 zdharma-continuum and contributors
__hsmw_ctx_prev_idx="$__hsmw_ctx_idx" __hsmw_ctx_prev_idx="$__hsmw_ctx_idx"
[[ "$WIDGET" = *-word ]] && (( __hsmw_ctx_idx -- )) [[ "$WIDGET" = *-word ]] && (( __hsmw_ctx_idx -- ))
[[ "$WIDGET" = *-backwards ]] && (( __hsmw_ctx_idx ++ )) [[ "$WIDGET" = *-backwards ]] && (( __hsmw_ctx_idx ++ ))
[[ "$WIDGET" = *-pforwards ]] && (( __hsmw_ctx_idx = __hsmw_ctx_idx - __hsmw_page_size )) [[ "$WIDGET" = *-pforwards ]] && (( __hsmw_ctx_idx = __hsmw_ctx_idx - __hsmw_page_size ))
@ -23,45 +26,36 @@ _hsmw_ctx_down() {
} }
_hsmw_ctx_off() { _hsmw_ctx_off() {
__hsmw_ctx_to_search="" __hsmw_ctx=0
__hsmw_ctx_found=( ) __hsmw_ctx_found=( )
__hsmw_ctx_which=0
__hsmw_ctx_idx=0 __hsmw_ctx_idx=0
__hsmw_ctx_page_start_idx=0 __hsmw_ctx_page_start_idx=0
__hsmw_ctx_prev_offset=0 __hsmw_ctx_prev_offset=0
__hsmw_ctx=0 __hsmw_ctx_to_search=""
__hsmw_ctx_which=0
# Reset main state so that it re-highlights # Reset main state so that it re-highlights
__hsmw_prev_offset=0 __hsmw_prev_offset=0
zle -la _hsmw_ctx_down && zle -D _hsmw_ctx_down zle -la _hsmw_ctx_down && zle -D _hsmw_ctx_down
zle -la _hsmw_ctx_up && zle -D _hsmw_ctx_up zle -la _hsmw_ctx_up && zle -D _hsmw_ctx_up
bindkey -M hsmw '^N' "history-search-multi-word" bindkey -M hsmw '^N' "history-search-multi-word"
bindkey -M hsmw '^P' "history-search-multi-word-backwards" bindkey -M hsmw '^P' "history-search-multi-word-backwards"
(( ${1}+0 )) && _hsmw_simulate_widget (( ${1}+0 )) && _hsmw_simulate_widget
} }
if [[ "$WIDGET" = "hsmw-context-main" ]]; then if [[ "$WIDGET" = "hsmw-context-main" ]]; then
__hsmw_ctx=1-__hsmw_ctx __hsmw_ctx=1-__hsmw_ctx
if (( __hsmw_ctx == 0 )); then if (( __hsmw_ctx == 0 )); then
_hsmw_ctx_off 1 _hsmw_ctx_off 1
return return
fi fi
zle -N _hsmw_ctx_down zle -N _hsmw_ctx_down
zle -N _hsmw_ctx_up zle -N _hsmw_ctx_up
bindkey -M hsmw '^N' "_hsmw_ctx_down" bindkey -M hsmw '^N' "_hsmw_ctx_down"
bindkey -M hsmw '^P' "_hsmw_ctx_up" bindkey -M hsmw '^P' "_hsmw_ctx_up"
fi fi
_hsmw_ctx_main() { _hsmw_ctx_main() {
# The repeat will make the matching work on a fresh heap arena # The repeat will make the matching work on a fresh heap arena
local to_search="${__hsmw_hcw_found[__hsmw_hcw_index]}" nl=$'\n' local to_search="${__hsmw_hcw_found[__hsmw_hcw_index]}" nl=$'\n'
to_search="${to_search//(#m)[][*?|#~^()><\\]/\\$MATCH}" to_search="${to_search//(#m)[][*?|#~^()><\\]/\\$MATCH}"
if [[ "$to_search" != "$__hsmw_ctx_to_search" ]]; then if [[ "$to_search" != "$__hsmw_ctx_to_search" ]]; then
__hsmw_ctx_to_search="$to_search" __hsmw_ctx_to_search="$to_search"
repeat 1; do repeat 1; do
@ -74,77 +68,61 @@ _hsmw_ctx_main() {
__hsmw_ctx_found[__hsmw_ctx_text_idx]=() __hsmw_ctx_found[__hsmw_ctx_text_idx]=()
done done
fi fi
integer final_hist_found_idx integer final_hist_found_idx
final_hist_found_idx=__hsmw_ctx_text_idx+__hsmw_ctx_which-1 final_hist_found_idx=__hsmw_ctx_text_idx+__hsmw_ctx_which-1
integer the_index="${__hsmw_ctx_found[final_hist_found_idx]}" integer the_index="${__hsmw_ctx_found[final_hist_found_idx]}"
the_index=the_index+__hsmw_ctx_idx the_index=the_index+__hsmw_ctx_idx
integer max_index=$(( ${${(k)history[@]}[1]} + 1 )) integer max_index=$(( ${${(k)history[@]}[1]} + 1 ))
if [[ "$max_index" -le "0" ]]; then if [[ "$max_index" -le "0" ]]; then
POSTDISPLAY=$'\n'"No matches found" POSTDISPLAY=$'\n'"No matches found"
return 0 return 0
fi fi
# #
# Pagination, index value guards # Pagination, index value guards
# #
integer page_size="$__hsmw_page_size" integer page_size="$__hsmw_page_size"
[[ "$page_size" -gt "$max_index" ]] && page_size="$max_index" [[ "$page_size" -gt "$max_index" ]] && page_size="$max_index"
[[ "$the_index" -le 0 ]] && { __hsmw_ctx_idx="$__hsmw_ctx_prev_idx"; the_index=1; } [[ "$the_index" -le 0 ]] && { __hsmw_ctx_idx="$__hsmw_ctx_prev_idx"; the_index=1; }
[[ "$the_index" -gt "$(( max_index - 1))" ]] && { __hsmw_ctx_idx="$__hsmw_ctx_prev_idx"; the_index="$(( max_index - 1 ))"; } [[ "$the_index" -gt "$(( max_index - 1))" ]] && { __hsmw_ctx_idx="$__hsmw_ctx_prev_idx"; the_index="$(( max_index - 1 ))"; }
integer page_start_idx=$(( ((the_index-1)/page_size)*page_size+1 )) integer page_start_idx=$(( ((the_index-1)/page_size)*page_size+1 ))
integer on_page_idx=$(( page_size - (the_index - page_start_idx) )) integer on_page_idx=$(( page_size - (the_index - page_start_idx) ))
# #
# Prepare display # Prepare display
# #
if [[ "$page_start_idx" != "$__hsmw_ctx_page_start_idx" ]]; then if [[ "$page_start_idx" != "$__hsmw_ctx_page_start_idx" ]]; then
integer idx integer idx
__hsmw_ctx_disp_list=( ) __hsmw_ctx_disp_list=( )
for (( idx = page_start_idx + page_size - 1; idx >= page_start_idx ; idx -- )); do for (( idx = page_start_idx + page_size - 1; idx >= page_start_idx ; idx -- )); do
__hsmw_ctx_disp_list+=( "${history[$idx]}" ) __hsmw_ctx_disp_list+=( "${history[$idx]}" )
done done
# Don't do @ splitting, it's slower # Don't do @ splitting, it's slower
__hsmw_ctx_disp_list_newlines=( "${__hsmw_ctx_disp_list[@]}" ) __hsmw_ctx_disp_list_newlines=( "${__hsmw_ctx_disp_list[@]}" )
# Replace all new lines with "\n" text # Replace all new lines with "\n" text
__hsmw_ctx_disp_list=( "${(@)__hsmw_ctx_disp_list//$'\n'/\\n}" ) __hsmw_ctx_disp_list=( "${(@)__hsmw_ctx_disp_list//$'\n'/\\n}" )
# Truncate to display width, preceede by two spaces # Truncate to display width, preceede by two spaces
__hsmw_ctx_disp_list=( "${(@)__hsmw_ctx_disp_list/(#m)*/ ${MATCH[1,COLUMNS-8]}}" ) __hsmw_ctx_disp_list=( "${(@)__hsmw_ctx_disp_list/(#m)*/ ${MATCH[1,COLUMNS-8]}}" )
# The same with newlines adapted for syntax highlighting # The same with newlines adapted for syntax highlighting
__hsmw_ctx_disp_list_newlines=( "${(@)__hsmw_ctx_disp_list_newlines//$'\n'/ $nl}" ) __hsmw_ctx_disp_list_newlines=( "${(@)__hsmw_ctx_disp_list_newlines//$'\n'/ $nl}" )
__hsmw_ctx_disp_list_newlines=( "${(@)__hsmw_ctx_disp_list_newlines/(#m)*/ ${MATCH[1,COLUMNS-8]}}" ) __hsmw_ctx_disp_list_newlines=( "${(@)__hsmw_ctx_disp_list_newlines/(#m)*/ ${MATCH[1,COLUMNS-8]}}" )
fi fi
# #
# Detect where "> .." entry starts, add the ">" mark # Detect where "> .." entry starts, add the ">" mark
# #
local txt_before="${(F)${(@)__hsmw_ctx_disp_list[1,on_page_idx-1]}}" local txt_before="${(F)${(@)__hsmw_ctx_disp_list[1,on_page_idx-1]}}"
local entry="${__hsmw_ctx_disp_list[on_page_idx]}" local entry="${__hsmw_ctx_disp_list[on_page_idx]}"
local text="${(F)__hsmw_ctx_disp_list}" local text="${(F)__hsmw_ctx_disp_list}"
integer replace_idx=${#txt_before}+2 integer replace_idx=${#txt_before}+2
(( replace_idx == 2 )) && replace_idx=1 (( replace_idx == 2 )) && replace_idx=1
text[replace_idx]=">" text[replace_idx]=">"
# #
# Colorify # Colorify
# #
local preamble=$'\n'"Showing context of history entry. Ctrl-K to return to search." local preamble=$'\n'"Showing context of history entry. Ctrl-K to return to search."
local preamble2=$'\n'"Ctrl-N/P: next/previous occurence. Occurence #$(( __hsmw_ctx_which + 1 )) of ${#__hsmw_ctx_found}" local preamble2=$'\n'"Ctrl-N/P: next/previous occurence. Occurence #$(( __hsmw_ctx_which + 1 )) of ${#__hsmw_ctx_found}"
preamble2=${(r:${#preamble}:: :)preamble2}$'\n' preamble2=${(r:${#preamble}:: :)preamble2}$'\n'
preamble+=$preamble2 preamble+=$preamble2
integer offset=${#preamble}+${#BUFFER} integer offset=${#preamble}+${#BUFFER}
POSTDISPLAY="$preamble$text" POSTDISPLAY="$preamble$text"
if (( page_start_idx != __hsmw_ctx_page_start_idx || offset != __hsmw_ctx_prev_offset )); then if (( page_start_idx != __hsmw_ctx_page_start_idx || offset != __hsmw_ctx_prev_offset )); then
region_highlight=( "${#BUFFER} $offset bg=22" ) region_highlight=( "${#BUFFER} $offset bg=22" )
if (( __hsmw_synhl )); then if (( __hsmw_synhl )); then
@ -160,11 +138,8 @@ _hsmw_ctx_main() {
else else
region_highlight[-1]=() region_highlight[-1]=()
fi fi
__hsmw_ctx_page_start_idx=page_start_idx __hsmw_ctx_page_start_idx=page_start_idx
__hsmw_ctx_prev_offset=offset __hsmw_ctx_prev_offset=offset
region_highlight+=( "$(( offset + ${#txt_before} )) $(( offset + ${#txt_before} + ${#entry} + 1 )) $__hsmw_active" ) region_highlight+=( "$(( offset + ${#txt_before} )) $(( offset + ${#txt_before} + ${#entry} + 1 )) $__hsmw_active" )
} }
_hsmw_ctx_main _hsmw_ctx_main

View file

@ -1,32 +1,11 @@
# -*- Mode: sh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- #!/usr/bin/env zsh
# vim:ft=zsh:sw=2:sts=2:et #
# -*- mode: sh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# ------------------------------------------------------------------------------------------------- #
# Copyright (c) 2010-2016 zsh-syntax-highlighting contributors # Copyright (c) 2010-2016 zsh-syntax-highlighting contributors
# Copyright (c) 2016-2017 Sebastian Gniazdowski (modifications) # Copyright (c) 2016-2017 Sebastian Gniazdowski (modifications)
# All rights reserved. # Copyright (c) 2021-2022 zdharma-continuum and contributors
#
# 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.
# -------------------------------------------------------------------------------------------------
typeset -gA __hsmw_highlight_main__command_type_cache typeset -gA __hsmw_highlight_main__command_type_cache
@ -103,21 +82,8 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
'|&' 3 '|&' 3
'&!' 3 '&!' 3
'&|' 3 '&|' 3
# ### 'case' syntax, but followed by a pattern, not by a command
# ';;' ';&' ';|'
) )
# Get the type of a command.
#
# Uses the zsh/parameter module if available to avoid forks, and a
# wrapper around 'type -w' as fallback.
#
# Takes a single argument.
#
# The result will be stored in REPLY.
-hsmw-highlight-main-type() { -hsmw-highlight-main-type() {
REPLY=$__hsmw_highlight_main__command_type_cache[(e)$1] REPLY=$__hsmw_highlight_main__command_type_cache[(e)$1]
[[ -z "$REPLY" ]] && { [[ -z "$REPLY" ]] && {
@ -135,12 +101,6 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
REPLY='suffix alias' REPLY='suffix alias'
elif (( $reswords[(Ie)$1] )); then elif (( $reswords[(Ie)$1] )); then
REPLY=reserved REPLY=reserved
# zsh 5.2 and older have a bug whereby running 'type -w ./sudo' implicitly
# runs 'hash ./sudo=/usr/local/bin/./sudo' (assuming /usr/local/bin/sudo
# exists and is in $PATH). Avoid triggering the bug, at the expense of
# falling through to the $() below, incurring a fork. (Issue #354.)
#
# The second disjunct mimics the isrelative() C call from the zsh bug.
elif [[ $1 != */* || "${+ZSH_ARGZERO}" = "1" ]] && ! builtin type -w -- $1 >/dev/null 2>&1; then elif [[ $1 != */* || "${+ZSH_ARGZERO}" = "1" ]] && ! builtin type -w -- $1 >/dev/null 2>&1; then
REPLY=none REPLY=none
fi fi
@ -199,8 +159,7 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
} }
# Main syntax highlighting function. # Main syntax highlighting function.
-hsmw-highlight-process() -hsmw-highlight-process() {
{
emulate -L zsh emulate -L zsh
setopt extendedglob bareglobqual nonomatch noksharrays setopt extendedglob bareglobqual nonomatch noksharrays
@ -218,64 +177,13 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
integer arg_type=0 MBEGIN MEND in_redirection len=${#buf} already_added offset idx end_idx this_word=1 next_word=0 insane_alias integer arg_type=0 MBEGIN MEND in_redirection len=${#buf} already_added offset idx end_idx this_word=1 next_word=0 insane_alias
local -a match mbegin mend local -a match mbegin mend
# integer BIT_start=1 BIT_regular=2 BIT_sudo_opt=4 BIT_sudo_arg=8 BIT_always=16
# State machine
#
# The states are:
# - :start: Command word
# - :sudo_opt: A leading-dash option to sudo (such as "-u" or "-i")
# - :sudo_arg: The argument to a sudo leading-dash option that takes one,
# when given as a separate word; i.e., "foo" in "-u foo" (two
# words) but not in "-ufoo" (one word).
# - :regular: "Not a command word", and command delimiters are permitted.
# Mainly used to detect premature termination of commands.
# - :always: The word 'always' in the «{ foo } always { bar }» syntax.
#
# When the kind of a word is not yet known, $this_word / $next_word may contain
# multiple states. For example, after "sudo -i", the next word may be either
# another --flag or a command name, hence the state would include both :start:
# and :sudo_opt:.
#
# The tokens are always added with both leading and trailing colons to serve as
# word delimiters (an improvised array); [[ $x == *:foo:* ]] and x=${x//:foo:/}
# will DTRT regardless of how many elements or repetitions $x has..
#
# Handling of redirections: upon seeing a redirection token, we must stall
# the current state --- that is, the value of $this_word --- for two iterations
# (one for the redirection operator, one for the word following it representing
# the redirection target). Therefore, we set $in_redirection to 2 upon seeing a
# redirection operator, decrement it each iteration, and stall the current state
# when it is non-zero. Thus, upon reaching the next word (the one that follows
# the redirection operator and target), $this_word will still contain values
# appropriate for the word immediately following the word that preceded the
# redirection operator.
#
# The "the previous word was a redirection operator" state is not communicated
# to the next iteration via $next_word/$this_word as usual, but via
# $in_redirection. The value of $next_word from the iteration that processed
# the operator is discarded.
#
# Processing buffer # Processing buffer
local proc_buf="$buf" needle local proc_buf="$buf" needle
for arg in ${interactive_comments-${(z)buf}} \ for arg in ${interactive_comments-${(z)buf}} ${interactive_comments+${(zZ+c+)buf}}; do
${interactive_comments+${(zZ+c+)buf}}; do
# Initialize $next_word to its default value? # Initialize $next_word to its default value?
(( in_redirection )) && (( --in_redirection )) (( in_redirection )) && (( --in_redirection ))
(( in_redirection == 0 )) && next_word=2 # else Stall $next_word. (( in_redirection == 0 )) && next_word=2 # else Stall $next_word.
# Initialize per-"simple command" [zshmisc(1)] variables:
#
# $already_added (see next paragraph)
# $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"
#
# $already_added is set to 1 to disable adding an entry to region_highlight
# for this iteration. Currently, that is done for "" and $'' strings,
# which add the entry early so escape sequences within the string override
# the string's color.
already_added=0 already_added=0
style=unknown-token style=unknown-token
if (( this_word & 1 )); then if (( this_word & 1 )); then
@ -285,22 +193,10 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
# Compute the new $start_pos and $end_pos, skipping over whitespace in $buf. # Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
if [[ $arg == ';' ]] ; then 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).
needle=$'[;\n]' needle=$'[;\n]'
offset=$(( ${proc_buf[(i)$needle]} - 1 )) offset=$(( ${proc_buf[(i)$needle]} - 1 ))
(( start_pos += offset )) (( start_pos += offset ))
(( end_pos = start_pos + $#arg )) (( end_pos = start_pos + $#arg ))
# Do not run default code for case when there is a new line
# It shouldn't be treated as ';', i.e. shouldn't be highlighted
# as unknown-token when appears after command-starting arg like "{"
if [[ "${proc_buf[offset+1]}" = $'\n' ]]; then if [[ "${proc_buf[offset+1]}" = $'\n' ]]; then
(( in_array_assignment )) && (( this_word = 2 )) || { (( this_word = 1 )); highlight_glob=1; } (( in_array_assignment )) && (( this_word = 2 )) || { (( this_word = 1 )); highlight_glob=1; }
in_redirection=0 in_redirection=0
@ -309,7 +205,6 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
start_pos=$end_pos start_pos=$end_pos
continue continue
else else
# One more short path  for ';' command separator
(( in_array_assignment )) && (( this_word = 2 )) || { (( this_word = 1 )); highlight_glob=1; } (( in_array_assignment )) && (( this_word = 2 )) || { (( this_word = 1 )); highlight_glob=1; }
in_redirection=0 in_redirection=0
[[ "${HSMW_HIGHLIGHT_STYLES[commandseparator]}" != "none" ]] && reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[commandseparator]}") [[ "${HSMW_HIGHLIGHT_STYLES[commandseparator]}" != "none" ]] && reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[commandseparator]}")
@ -322,28 +217,22 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
else else
offset=0 offset=0
if [[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\[[:space:]])##)* ]]; then if [[ "$proc_buf" = (#b)(#s)(([[:space:]]|\\[[:space:]])##)* ]]; then
# The first, outer parenthesis
offset="${mend[1]}" offset="${mend[1]}"
fi fi
((start_pos+=offset)) ((start_pos+=offset))
((end_pos=start_pos+${#arg})) ((end_pos=start_pos+${#arg}))
# No-hit will result in value 0
arg_type=${__HSMW_HIGHLIGHT_TOKENS_TYPES[$arg]} arg_type=${__HSMW_HIGHLIGHT_TOKENS_TYPES[$arg]}
fi fi
proc_buf="${proc_buf[offset + $#arg + 1,len]}" proc_buf="${proc_buf[offset + $#arg + 1,len]}"
# Handle the INTERACTIVE_COMMENTS option.
#
# We use the (Z+c+) flag so the entire comment is presented as one token in $arg.
if [[ -n ${interactive_comments+'set'} && $arg[1] == $histchars[3] ]]; then if [[ -n ${interactive_comments+'set'} && $arg[1] == $histchars[3] ]]; then
if (( this_word & 3 )); then if (( this_word & 3 )); then
style=comment style=comment
else else
style=unknown-token # prematurely terminated style=unknown-token # prematurely terminated
fi fi
# ADD
reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[$style]}") reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[$style]}")
start_pos=$end_pos start_pos=$end_pos
continue continue
@ -400,12 +289,6 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
(( next_word = next_word | 4 )) (( next_word = next_word | 4 ))
(( next_word = next_word | 1 )) (( next_word = next_word | 1 ))
else else
# Special-case: command word is '$foo', like that, without braces or anything.
#
# 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.
if [[ ${arg[1]} == \$ ]] && (( ${+parameters} )) && [[ ${arg:1} = (#m)([a-zA-Z_][a-zA-Z0-9_]#|[0-9]##) ]] && (( ${+parameters[${MATCH}]} )); then if [[ ${arg[1]} == \$ ]] && (( ${+parameters} )) && [[ ${arg:1} = (#m)([a-zA-Z_][a-zA-Z0-9_]#|[0-9]##) ]] && (( ${+parameters[${MATCH}]} )); then
-hsmw-highlight-main-type ${(P)MATCH} -hsmw-highlight-main-type ${(P)MATCH}
else else
@ -419,7 +302,6 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
if [[ $arg == $'\x7b' ]]; then if [[ $arg == $'\x7b' ]]; then
braces_stack='Y'"$braces_stack" braces_stack='Y'"$braces_stack"
elif [[ $arg == $'\x7d' && $braces_stack[1] == "Y" ]]; then elif [[ $arg == $'\x7d' && $braces_stack[1] == "Y" ]]; then
# We're at command word, so no need to check $right_brace_is_recognised_everywhere
braces_stack[1]="" braces_stack[1]=""
style=reserved-word style=reserved-word
(( next_word = next_word | 16 )) (( next_word = next_word | 16 ))
@ -427,20 +309,19 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
braces_stack='A'"$braces_stack" braces_stack='A'"$braces_stack"
fi fi
;; ;;
'suffix alias') style=suffix-alias;; 'suffix alias') style=suffix-alias ;;
alias) alias)
insane_alias=0 insane_alias=0
case $arg in case $arg in
# Issue #263: aliases with '=' on their LHS. '='*)
# :
# There are three cases: ;;
# *'='*)
# - Unsupported, breaks 'alias -L' output, but invokable: insane_alias=1
('='*) :;; ;;
# - Unsupported, not invokable: *)
(*'='*) insane_alias=1;; :
# - The common case: ;;
(*) :;;
esac esac
if (( insane_alias )); then if (( insane_alias )); then
style=unknown-token style=unknown-token
@ -450,46 +331,33 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
[[ ${__HSMW_HIGHLIGHT_TOKENS_TYPES[$alias_target]} = "1" && "$arg_type" != "1" ]] && __HSMW_HIGHLIGHT_TOKENS_TYPES[$arg]="1" [[ ${__HSMW_HIGHLIGHT_TOKENS_TYPES[$alias_target]} = "1" && "$arg_type" != "1" ]] && __HSMW_HIGHLIGHT_TOKENS_TYPES[$arg]="1"
fi fi
;; ;;
builtin) style=builtin;; builtin)
function) style=function;; style=builtin ;;
command) style=command;; function)
hashed) style=hashed-command;; style=() ;;
dirpath) style=path;; command)
none) # Assign? style=command ;;
hashed)
style=hashed-command ;;
dirpath)
style=path ;;
none)
if [[ $arg == [[:alpha:]_][[:alnum:]_]#(|\[[^\]]#\])(|[+])=* ]] || [[ $arg == [0-9]##(|[+])=* ]]; then if [[ $arg == [[:alpha:]_][[:alnum:]_]#(|\[[^\]]#\])(|[+])=* ]] || [[ $arg == [0-9]##(|[+])=* ]]; then
style=assign style=assign
# Assignment to a scalar parameter or to array
# (For array assignments, the command doesn't start until the ")" token.)
[[ $arg[-1] == '(' ]] && in_array_assignment=1 || (( next_word = next_word | 1 )) [[ $arg[-1] == '(' ]] && in_array_assignment=1 || (( next_word = next_word | 1 ))
elif [[ $arg[1] = $histchars[1] && -n "${arg[2]}" ]]; then elif [[ $arg[1] = $histchars[1] && -n "${arg[2]}" ]]; then
style=history-expansion style=history-expansion
elif [[ $arg[1] == $histchars[2] ]]; then elif [[ $arg[1] == $histchars[2] ]]; then
style=history-expansion style=history-expansion
elif (( arg_type == 3 )); then elif (( arg_type == 3 )); then
# This highlights empty commands (semicolon follows nothing) as an error.
# Zsh accepts them, though.
(( this_word & 2 )) && style=commandseparator (( this_word & 2 )) && style=commandseparator
elif [[ $arg[1,2] == '((' ]]; then elif [[ $arg[1,2] == '((' ]]; then
# Arithmetic evaluation.
#
# Note: prior to zsh-5.1.1-52-g4bed2cf (workers/36669), the ${(z)...}
# splitter would only output the '((' token if the matching '))' had
# been typed. Therefore, under those versions of zsh, BUFFER="(( 42"
# would be highlighted as an error until the matching "))" are typed.
#
# We highlight just the opening parentheses, as a reserved word; this
# is how [[ ... ]] is highlighted, too.
# ADD
reply+=("$start_pos $(( start_pos + 2 )) ${HSMW_HIGHLIGHT_STYLES[reserved-word]}") reply+=("$start_pos $(( start_pos + 2 )) ${HSMW_HIGHLIGHT_STYLES[reserved-word]}")
already_added=1 already_added=1
# ADD
[[ $arg[-2,-1] == '))' ]] && reply+=("$(( end_pos - 2 )) $end_pos ${HSMW_HIGHLIGHT_STYLES[reserved-word]}") [[ $arg[-2,-1] == '))' ]] && reply+=("$(( end_pos - 2 )) $end_pos ${HSMW_HIGHLIGHT_STYLES[reserved-word]}")
elif [[ $arg == '()' ]]; then elif [[ $arg == '()' ]]; then
# anonymous function
style=reserved-word style=reserved-word
elif [[ $arg == $'\x28' ]]; then elif [[ $arg == $'\x28' ]]; then
# subshell
style=reserved-word style=reserved-word
braces_stack='R'"$braces_stack" braces_stack='R'"$braces_stack"
elif [[ $arg == $'\x29' ]]; then elif [[ $arg == $'\x29' ]]; then
@ -499,15 +367,11 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
fi fi
;; ;;
*) *)
# ADD
# reply+=("$start_pos $end_pos commandtypefromthefuture-$REPLY")
already_added=1 already_added=1
;; ;;
esac esac
fi fi
# in_redirection || BIT_regular || BIT_sudo_opt || BIT_sudo_arg elif (( in_redirection + this_word & 14 )); then
elif (( in_redirection + this_word & 14 ))
then # $arg is a non-command word
case $arg in case $arg in
']]') ']]')
style=reserved-word style=reserved-word
@ -517,7 +381,6 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
style=builtin style=builtin
;; ;;
$'\x28') $'\x28')
# '(' inside [[
style=reserved-word style=reserved-word
braces_stack='R'"$braces_stack" braces_stack='R'"$braces_stack"
;; ;;
@ -529,25 +392,24 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
elif [[ $braces_stack[1] == "R" ]]; then elif [[ $braces_stack[1] == "R" ]]; then
braces_stack[1]="" braces_stack[1]=""
style=reserved-word style=reserved-word
fi;; fi ;;
$'\x28\x29') # possibly a function definition $'\x28\x29')
# || false # TODO: or if the previous word was a command word
(( multi_func_def )) && (( next_word = next_word | 1 )) (( multi_func_def )) && (( next_word = next_word | 1 ))
style=reserved-word style=reserved-word
# Remove possible annoying unknown-token style, or misleading function style
reply[-1]=() reply[-1]=()
;; ;;
'--'*) style=double-hyphen-option;; '--'*)
'-'*) style=single-hyphen-option;; style=double-hyphen-option ;;
"'"*) style=single-quoted-argument;; '-'*)
style=single-hyphen-option ;;
"'"*)
style=single-quoted-argument ;;
'"'*) '"'*)
# ADD
reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[double-quoted-argument]}") reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[double-quoted-argument]}")
-hsmw-highlight-string -hsmw-highlight-string
already_added=1 already_added=1
;; ;;
\$\'*) \$\*)
# ADD
reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[dollar-quoted-argument]}") reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[dollar-quoted-argument]}")
-hsmw-highlight-dollar-string -hsmw-highlight-dollar-string
already_added=1 already_added=1
@ -555,15 +417,14 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
\$[^\(]*) \$[^\(]*)
style=variable style=variable
;; ;;
'`'*) style=back-quoted-argument;; '`'*)
style=back-quoted-argument
;;
[*?]*|*[^\\][*?]*) [*?]*|*[^\\][*?]*)
(( highlight_glob )) && style=globbing || style=default;; (( highlight_glob )) && style=globbing || style=default
*) if [[ $arg = $'\x7d' && $braces_stack[1] == "Y" && "$right_brace_is_recognised_everywhere" = "1" ]]; then ;;
# right brace *)
# Parsing rule: # { if [[ $arg = $'\x7d' && $braces_stack[1] == "Y" ]] && [[ "$right_brace_is_recognised_everywhere" = "1" ]]; then
#
# Additionally, `tt(})' is recognized in any position if neither the
# tt(IGNORE_BRACES) option nor the tt(IGNORE_CLOSE_BRACES) option is set."""
braces_stack[1]="" braces_stack[1]=""
style=reserved-word style=reserved-word
(( next_word = next_word | 16 )) (( next_word = next_word | 16 ))
@ -575,17 +436,16 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
style=redirection style=redirection
else else
if (( __hsmw_no_check_paths == 0 )) && -hsmw-highlight-check-path; then if (( __hsmw_no_check_paths == 0 )) && -hsmw-highlight-check-path; then
# ADD
reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[path]}") reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[path]}")
already_added=1 already_added=1
[[ -n "$HSMW_HIGHLIGHT_STYLES[path_pathseparator]" && "$HSMW_HIGHLIGHT_STYLES[path]" != "$HSMW_HIGHLIGHT_STYLES[path_pathseparator]" ]] && {
if [[ -n "$HSMW_HIGHLIGHT_STYLES[path_pathseparator]" && "$HSMW_HIGHLIGHT_STYLES[path]" != "$HSMW_HIGHLIGHT_STYLES[path_pathseparator]" ]]; then
local pos local pos
for (( pos = start_pos; pos <= end_pos; pos++ )) ; do for (( pos = start_pos; pos <= end_pos; pos++ )) ; do
# ADD
[[ ${buf[pos]} == "/" ]] && reply+=("$(( pos - 1 )) $pos ${HSMW_HIGHLIGHT_STYLES[path_pathseparator]}") [[ ${buf[pos]} == "/" ]] && reply+=("$(( pos - 1 )) $pos ${HSMW_HIGHLIGHT_STYLES[path_pathseparator]}")
done done
} fi
else else
style=default style=default
fi fi
@ -594,12 +454,10 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
esac esac
fi fi
# ADD
(( already_added == 0 )) && [[ "${HSMW_HIGHLIGHT_STYLES[$style]}" != "none" ]] && reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[$style]}") (( already_added == 0 )) && [[ "${HSMW_HIGHLIGHT_STYLES[$style]}" != "none" ]] && reply+=("$start_pos $end_pos ${HSMW_HIGHLIGHT_STYLES[$style]}")
if (( arg_type == 3 )); then if (( arg_type == 3 )); then
if [[ $arg == ';' ]] && (( in_array_assignment )); then if [[ $arg == ';' ]] && (( in_array_assignment )); then
# literal newline inside an array assignment
(( next_word = 2 )) (( next_word = 2 ))
elif [[ -n "${braces_stack[(r)A]}" ]]; then elif [[ -n "${braces_stack[(r)A]}" ]]; then
(( next_word = 2 )) (( next_word = 2 ))
@ -610,107 +468,83 @@ __HSMW_HIGHLIGHT_TOKENS_TYPES=(
elif (( arg_type == 1 || arg_type == 2 )) && (( this_word & 1 )); then elif (( arg_type == 1 || arg_type == 2 )) && (( this_word & 1 )); then
(( next_word = 1 )) (( next_word = 1 ))
elif [[ $arg == "repeat" ]] && (( this_word & 1 )); then elif [[ $arg == "repeat" ]] && (( this_word & 1 )); then
# skip the repeat-count word
in_redirection=2 in_redirection=2
# The redirection mechanism assumes $this_word describes the word (( thisword = 3 ))
# 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 = 3 ))
fi fi
start_pos=$end_pos start_pos=$end_pos
# This is the default/common codepath. (( in_redirection == 0 )) && (( this_word = next_word ))
(( in_redirection == 0 )) && (( this_word = next_word )) #else # Stall $this_word.
done done
return 0 return 0
} }
# Check if $arg is a path. -hsmw-highlight-check-path() {
# If yes, return 0 and in $REPLY the style to use.
# Else, return non-zero (and the contents of $REPLY is undefined).
-hsmw-highlight-check-path()
{
: ${expanded_path:=${(Q)~arg}} : ${expanded_path:=${(Q)~arg}}
[[ -n "${FAST_BLIST_PATTERNS[(k)$expanded_path]}" ]] && return 1 [[ -n "${FAST_BLIST_PATTERNS[(k)$expanded_path]}" ]] && return 1
[[ -z $expanded_path ]] && return 1 [[ -z $expanded_path ]] && return 1
[[ -e $expanded_path ]] && return 0 [[ -e $expanded_path ]] && return 0
# Search the path in CDPATH, only for CD command if [[ "$cur_cmd" = "cd" ]]; then
[[ "$cur_cmd" = "cd" ]] && for cdpath_dir in $cdpath ; do for cdpath_dir in $cdpath ; do
[[ -e "$cdpath_dir/$expanded_path" ]] && return 0 if [[ -e "$cdpath_dir/$expanded_path" ]]; then
return 0
fi
done done
fi
# It's not a path.
return 1 return 1
} }
# Highlight special chars inside double-quoted strings -hsmw-highlight-string() {
-hsmw-highlight-string()
{
mybuf="$arg" mybuf="$arg"
idx=start_pos idx=start_pos
while [[ "$mybuf" = (#b)[^\$\\]#((\$(#B)([a-zA-Z_:][a-zA-Z0-9_:]#|[0-9]##)(#b)(\[[^\]]#\])(#c0,1))|(\$[{](\([a-zA-Z0@%#]##\))(#c0,1)[a-zA-Z0-9_:#]##(\[[^\]]#\])(#c0,1)[}])|[\\][\'\"\$]|[\\](*))(*) ]]; do while [[ "$mybuf" = (#b)[^\$\\]#((\$(#B)([a-zA-Z_:][a-zA-Z0-9_:]#|[0-9]##)(#b)(\[[^\]]#\])(#c0,1))|(\$[{](\([a-zA-Z0@%#]##\))(#c0,1)[a-zA-Z0-9_:#]##(\[[^\]]#\])(#c0,1)[}])|[\\][\"\'\$]|[\\](*))(*) ]]; do
[[ -n "${match[7]}" ]] && { if [[ -n "${match[7]}" ]]; then
# Skip following char it is quoted. Choice is
# made to not highlight such quoting
idx+=${mbegin[1]}+1 idx+=${mbegin[1]}+1
mybuf="${match[7]:1}" mybuf="${match[7]:1}"
} || { else
idx+=${mbegin[1]}-1 idx+=${mbegin[1]}-1
end_idx=idx+${mend[1]}-${mbegin[1]}+1 end_idx=idx+${mend[1]}-${mbegin[1]}+1
mybuf="${match[8]}" mybuf="${match[8]}"
# ADD
reply+=("$idx $end_idx ${HSMW_HIGHLIGHT_STYLES[back-or-dollar-double-quoted-argument]}") reply+=("$idx $end_idx ${HSMW_HIGHLIGHT_STYLES[back-or-dollar-double-quoted-argument]}")
idx=end_idx idx=end_idx
} fi
done done
} }
# Highlight special chars inside dollar-quoted strings -hsmw-highlight-dollar-string() {
-hsmw-highlight-dollar-string()
{
local i j k style local i j k style
local AA local AA
integer c integer c
# Starting dollar-quote is at 1:2, so start parsing at offset 3 in the string. for (( i = 3 ; i < end_pos - start_pos ; i += 1 )); do
for (( i = 3 ; i < end_pos - start_pos ; i += 1 )) ; do
(( j = i + start_pos - 1 )) (( j = i + start_pos - 1 ))
(( k = j + 1 )) (( k = j + 1 ))
case "$arg[$i]" in case $arg[$i] in
"\\") style=back-dollar-quoted-argument \\)
style=back-dollar-quoted-argument
for (( c = i + 1 ; c <= end_pos - start_pos ; c += 1 )); do for (( c = i + 1 ; c <= end_pos - start_pos ; c += 1 )); do
[[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break [[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break
done done
AA=$arg[$i+1,$c-1] AA=$arg[$i+1,$c-1]
# Matching for HEX and OCT values like \0xA6, \xA6 or \012 if [[ "$AA" =~ "^(x|X)[0-9a-fA-F]{1,2}" || "$AA" =~ "^[0-7]{1,3}" || "$AA" =~ "^u[0-9a-fA-F]{1,4}" || "$AA" =~ "^U[0-9a-fA-F]{1,8}" ]]; then
if [[ "$AA" =~ "^(x|X)[0-9a-fA-F]{1,2}"
|| "$AA" =~ "^[0-7]{1,3}"
|| "$AA" =~ "^u[0-9a-fA-F]{1,4}"
|| "$AA" =~ "^U[0-9a-fA-F]{1,8}"
]]; then
(( k += $#MATCH )) (( k += $#MATCH ))
(( i += $#MATCH )) (( i += $#MATCH ))
else else
if (( $#arg > $i+1 )) && [[ $arg[$i+1] == [xXuU] ]]; then if (( $#arg > $i+1 )) && [[ $arg[$i+1] == [xXuU] ]]; then
# \x not followed by hex digits is probably an error
style=unknown-token style=unknown-token
fi fi
(( k += 1 )) # Color following char too. (( k += 1 )) # Color following char too.
(( i += 1 )) # Skip parsing the escaped char. (( i += 1 )) # Skip parsing the escaped char.
fi fi
;; ;;
*) continue ;; *)
continue
;;
esac esac
# ADD
reply+=("$j $k ${HSMW_HIGHLIGHT_STYLES[$style]}") reply+=("$j $k ${HSMW_HIGHLIGHT_STYLES[$style]}")
done done
} }