Hacking on zsh-syntax-highlighting itself ========================================= This document includes information for people working on z-sy-h itself: on the core driver (`zsh-syntax-highlighting.zsh`), on the highlighters in the distribution, and on the test suite. It does not target third-party highlighter authors (although they may find it an interesting read). The `main` highlighter ---------------------- The following function `pz` is useful when working on the `main` highlighting: ```zsh pq() { (( $#argv )) || return 0 print -r -l -- ${(qqqq)argv} } pz() { local arg for arg; do pq ${(z)arg} done } ``` It prints, for each argument, its token breakdown, similar to how the main loop of the `main` highlighter sees it. Testing the `brackets` highlighter ---------------------------------- Since the test harness empties `ZSH_HIGHLIGHT_STYLES` and the `brackets` highlighter interrogates `ZSH_HIGHLIGHT_STYLES` to determine how to highlight, tests must set the `bracket-level-#` keys themselves. For example: ```zsh ZSH_HIGHLIGHT_STYLES[bracket-level-1]= ZSH_HIGHLIGHT_STYLES[bracket-level-2]= BUFFER='echo ({x})' expected_region_highlight=( "6 6 bracket-level-1" # ( "7 7 bracket-level-2" # { "9 9 bracket-level-2" # } "10 10 bracket-level-1" # ) ) ``` Testing the `pattern` and `regexp` highlighters ----------------------------------------------- Because the `pattern` and `regexp` highlighters modifies `region_highlight` directly instead of using `_zsh_highlight_add_highlight`, the test harness cannot get the `ZSH_HIGHLIGHT_STYLES` keys. Therefore, when writing tests, use the style itself as third word (cf. the [documentation for `expected_region_highlight`](docs/highlighters.md)). For example: ```zsh ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red') BUFFER='rm -rf /' expected_region_highlight=( "1 8 fg=white,bold,bg=red" # rm -rf / ) ``` Memos and commas ---------------- We append to `region_highlight` as follows: ```zsh region_highlight+=("$start $end $spec, memo=zsh-syntax-highlighting") ``` That comma is required to cause zsh 5.8 and older to ignore the memo without ignoring the `$spec`. It's a hack, but given that no further 5.8.x patch releases are planned, it's been deemed acceptable. See issue #418 and the cross-referenced issues. Miscellany ---------- If you work on the driver (`zsh-syntax-highlighting.zsh`), you may find the following zstyle useful: ```zsh zstyle ':completion:*:*:*:*:globbed-files' ignored-patterns {'*/',}zsh-syntax-highlighting.plugin.zsh ``` IRC channel ----------- We're on #zsh-syntax-highlighting on Libera.Chat.