zsh dir
|
@ -0,0 +1,98 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Almost all code borrowed from Zshell's _make function
|
||||
#
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
|
||||
local -a TARGETS
|
||||
|
||||
.make-expandVars() {
|
||||
local open close var val front='' rest=$1
|
||||
|
||||
while [[ $rest == (#b)[^$]#($)* ]]; do
|
||||
front=$front${rest[1,$mbegin[1]-1]}
|
||||
rest=${rest[$mbegin[1],-1]}
|
||||
|
||||
case $rest[2] in
|
||||
($) # '$$'. may not appear in target and variable's value
|
||||
front=$front\$\$
|
||||
rest=${rest[3,-1]}
|
||||
continue
|
||||
;;
|
||||
(\() # Variable of the form $(foobar)
|
||||
open='('
|
||||
close=')'
|
||||
;;
|
||||
({) # ${foobar}
|
||||
open='{'
|
||||
close='}'
|
||||
;;
|
||||
([[:alpha:]]) # $foobar. This is exactly $(f)oobar.
|
||||
open=''
|
||||
close=''
|
||||
var=$rest[2]
|
||||
;;
|
||||
(*) # bad parameter name
|
||||
print -- $front$rest
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n $open ]]; then
|
||||
if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then
|
||||
var=$match
|
||||
else # unmatched () or {}, or bad parameter name
|
||||
print -- $front$rest
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
val=''
|
||||
if [[ -n ${VAR_ARGS[(i)$var]} ]]; then
|
||||
val=${VAR_ARGS[$var]}
|
||||
else
|
||||
if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then
|
||||
if [[ $parameters[$var] == scalar-export* ]]; then
|
||||
val=${(P)var}
|
||||
elif [[ -n ${VARIABLES[(i)$var]} ]]; then
|
||||
val=${VARIABLES[$var]}
|
||||
fi
|
||||
else
|
||||
if [[ -n ${VARIABLES[(i)$var]} ]]; then
|
||||
val=${VARIABLES[$var]}
|
||||
elif [[ $parameters[$var] == scalar-export* ]]; then
|
||||
val=${(P)var}
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
rest=${rest//\$$open$var$close/$val}
|
||||
done
|
||||
|
||||
print -- ${front}${rest}
|
||||
}
|
||||
|
||||
|
||||
.make-parseMakefile () {
|
||||
local input var val target dep TAB=$'\t' tmp IFS=
|
||||
|
||||
while read input
|
||||
do
|
||||
case "$input " in
|
||||
# TARGET: dependencies
|
||||
# TARGET1 TARGET2 TARGET3: dependencies
|
||||
([[*?[:alnum:]$][^$TAB:=%]#:[^=]*)
|
||||
target=$(.make-expandVars ${input%%:*})
|
||||
TARGETS+=( ${(z)target} )
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then
|
||||
.make-parseMakefile
|
||||
FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS"
|
||||
FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}"
|
||||
fi
|
||||
|
||||
reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" )
|
||||
|
||||
# vim:ft=zsh:et
|
|
@ -0,0 +1,30 @@
|
|||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# $1 - path to the ini file to parse
|
||||
# $2 - name of output hash (INI by default)
|
||||
# $3 - prefix for keys in the hash (can be empty)
|
||||
#
|
||||
# Writes to given hash under keys built in following way: ${3}<section>_field.
|
||||
# Values are values from ini file.
|
||||
|
||||
local __ini_file="$1" __out_hash="${2:-INI}" __key_prefix="$3"
|
||||
local IFS='' __line __cur_section="void" __access_string
|
||||
local -a match mbegin mend
|
||||
|
||||
[[ ! -r "$__ini_file" ]] && { builtin print -r "fast-syntax-highlighting: an ini file is unreadable ($__ini_file)"; return 1; }
|
||||
|
||||
while read -r -t 1 __line; do
|
||||
if [[ "$__line" = [[:blank:]]#\;* ]]; then
|
||||
continue
|
||||
elif [[ "$__line" = (#b)[[:blank:]]#\[([^\]]##)\][[:blank:]]# ]]; then
|
||||
__cur_section="${match[1]}"
|
||||
elif [[ "$__line" = (#b)[[:blank:]]#([^[:blank:]=]##)[[:blank:]]#[=][[:blank:]]#(*) ]]; then
|
||||
match[2]="${match[2]%"${match[2]##*[! $'\t']}"}" # remove trailing whitespace
|
||||
__access_string="${__out_hash}[${__key_prefix}<$__cur_section>_${match[1]}]"
|
||||
: "${(P)__access_string::=${match[2]}}"
|
||||
fi
|
||||
done < "$__ini_file"
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:sw=4:sts=4:et
|
|
@ -0,0 +1,37 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# FAST_HIGHLIGHT hash serves as container for variables that
|
||||
# prevents creating them in global scope. (P) flag is not used,
|
||||
# output array is fixed (__lines_list).
|
||||
#
|
||||
# $1 - the command, e.g. "git remote"; 2>/dev/null redirection is
|
||||
# added automatically
|
||||
# $2 - FAST_HIGHLIGHT field name, e.g. "chroma-git-branches"; two
|
||||
# additional fields will be used, $2-cache, $2-cache-born-at
|
||||
# $3 - what to remove from beginning of the lines returned by the
|
||||
# command
|
||||
# $4 - cache validity time, default 5 (seconds)
|
||||
#
|
||||
# Output: array __lines_list, with output of the command ran
|
||||
|
||||
# User should not forget to define this array, the below code
|
||||
# will only ensure that it's array (can also define a global)
|
||||
typeset -ga __lines_list
|
||||
local -a __response
|
||||
|
||||
if [[ -z "${FAST_HIGHLIGHT[$2-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-cache-born-at] )) -gt ${4:-5} ]]; then
|
||||
FAST_HIGHLIGHT[$2-cache-born-at]="$EPOCHSECONDS"
|
||||
__response=( ${${(f)"$(command ${(Qz)1#+} 2>/dev/null)"}#${~3}} )
|
||||
[[ "$1" = "+"* ]] && __lines_list+=( "${__response[@]}" ) || __lines_list=( "${__response[@]}" )
|
||||
FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}"
|
||||
else
|
||||
# Quoted (s:;:) flag without @ will skip empty elements. It
|
||||
# still produces array output, interesingly. All this is for
|
||||
# the trailing ";" above, to skip last, empty element.
|
||||
[[ "$1" = "+"* ]] && \
|
||||
__lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \
|
||||
__lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" )
|
||||
fi
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,60 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# It runs given command, which in general will be a git command,
|
||||
# automatically looking at cache first (a field named *-cache,
|
||||
# in FAST_HIGHLIGHT), which is valid for 5 seconds, and in case
|
||||
# of outdated or not existing cache, runs the command, splitting
|
||||
# on new-lines, first checking if PWD is inside git repository.
|
||||
#
|
||||
# FAST_HIGHLIGHT hash serves as container for variables that
|
||||
# prevents creating them in global scope. (P) flag is not used,
|
||||
# output array is fixed (__lines_list).
|
||||
#
|
||||
# $1 - the command, e.g. "git remote"; 2>/dev/null redirection is
|
||||
# added automatically
|
||||
# $2 - FAST_HIGHLIGHT field name, e.g. "chroma-git-branches"; two
|
||||
# additional fields will be used, $2-cache, $2-cache-born-at
|
||||
# $3 - what to remove from beginning of the lines returned by the
|
||||
# command
|
||||
# $4 - cache validity time, default 5 (seconds)
|
||||
#
|
||||
# Output: array __lines_list, with output of the (git) command ran
|
||||
|
||||
# User should not forget to define this array, the below code
|
||||
# will only ensure that it's array (can also define a global)
|
||||
typeset -ga __lines_list
|
||||
local -a __response
|
||||
|
||||
if [[ $1 == --status ]] {
|
||||
integer __status=1
|
||||
shift
|
||||
}
|
||||
|
||||
if [[ -z ${FAST_HIGHLIGHT[$2-cache]} || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-cache-born-at] )) -gt ${4:-5} ]]; then
|
||||
FAST_HIGHLIGHT[$2-cache-born-at]=$EPOCHSECONDS
|
||||
if [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" = true ]]; then
|
||||
__response=( ${${(f)"$(command ${(Qz)${1#+}} 2>/dev/null)"}#$3} )
|
||||
integer retval=$?
|
||||
if (( __status )) {
|
||||
__response=( $retval )
|
||||
__lines_list=( $retval )
|
||||
} else {
|
||||
[[ "$1" = "+"* ]] && \
|
||||
__lines_list+=( "${__response[@]}" ) || \
|
||||
__lines_list=( "${__response[@]}" )
|
||||
}
|
||||
else
|
||||
__lines_list=()
|
||||
fi
|
||||
FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}"
|
||||
else
|
||||
# Quoted (s:;:) flag without @ will skip empty elements. It
|
||||
# still produces array output, interesingly. All this is for
|
||||
# the trailing ";" above, to skip last, empty element.
|
||||
[[ "$1" = "+"* ]] && \
|
||||
__lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \
|
||||
__lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" )
|
||||
fi
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,17 @@
|
|||
# $1 - file-descriptor to be read from
|
||||
# $2 - name of output variable (default: REPLY)
|
||||
|
||||
local __in_fd=${1:-0} __out_var=${2:-REPLY}
|
||||
local -a __tmp
|
||||
integer __ret=1 __repeat=10 __tmp_size=0
|
||||
|
||||
while sysread -s 65535 -i "$__in_fd" '__tmp[__tmp_size + 1]'; do
|
||||
(( ( __ret=$? ) == 0 )) && (( ++ __tmp_size ))
|
||||
(( __ret == 5 )) && { __ret=0; (( --__repeat == 0 )) && break; }
|
||||
done
|
||||
|
||||
: ${(P)__out_var::="${(j::)__tmp}"}
|
||||
|
||||
return __ret
|
||||
|
||||
# vim: ft=zsh:et:sw=4:sts=4
|
|
@ -0,0 +1,5 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: psprint
|
||||
patreon: psprint
|
||||
ko_fi: psprint
|
|
@ -0,0 +1,24 @@
|
|||
current_theme.zsh
|
||||
secondary_theme.zsh
|
||||
theme_overlay.zsh
|
||||
*.txt
|
||||
test/out.parse
|
||||
test/res
|
||||
hold/*
|
||||
*.zwc
|
||||
|
||||
### Vim
|
||||
# Swap
|
||||
[._]*.s[a-v][a-z]
|
||||
[._]*.sw[a-p]
|
||||
[._]s[a-v][a-z]
|
||||
[._]sw[a-p]
|
||||
|
||||
# Session
|
||||
Session.vim
|
||||
|
||||
# Temporary
|
||||
.netrwhist
|
||||
*~
|
||||
# Auto-generated tag files
|
||||
tags
|
|
@ -0,0 +1,13 @@
|
|||
addons:
|
||||
apt:
|
||||
packages:
|
||||
zsh
|
||||
install:
|
||||
- mkdir .bin
|
||||
- curl -L https://github.com/zunit-zsh/zunit/releases/download/v0.8.2/zunit > .bin/zunit
|
||||
- curl -L https://raw.githubusercontent.com/molovo/revolver/master/revolver > .bin/revolver
|
||||
- curl -L https://raw.githubusercontent.com/molovo/color/master/color.zsh > .bin/color
|
||||
before_script:
|
||||
- chmod u+x .bin/{color,revolver,zunit}
|
||||
- export PATH="$PWD/.bin:$PATH"
|
||||
script: zunit
|
|
@ -0,0 +1,8 @@
|
|||
tap: false
|
||||
directories:
|
||||
tests: tests
|
||||
output: tests/_output
|
||||
support: tests/_support
|
||||
time_limit: 0
|
||||
fail_fast: false
|
||||
allow_risky: false
|
|
@ -0,0 +1,144 @@
|
|||
# News On Updates in F-Sy-H
|
||||
|
||||
**2018-08-09**
|
||||
|
||||
Added ideal string highlighting – FSH now handles any legal quoting and combination of `"`,`'` and `\` when
|
||||
highlighting program arguments. See the introduction for an example (item #14).
|
||||
|
||||
**2018-08-02**
|
||||
|
||||
Global aliases are now supported:
|
||||
|
||||
![image](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/global-alias.png)
|
||||
|
||||
**2018-08-01**
|
||||
|
||||
Hint – how to customize styles when using Zplugin and turbo mode:
|
||||
|
||||
```zsh
|
||||
zplugin ice wait"1" atload"set_fast_theme"
|
||||
zplugin light zdharma/fast-syntax-highlighting
|
||||
|
||||
set_fast_theme() {
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]='bg=blue'
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}bracket-level-1]='fg=red,bold'
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}bracket-level-2]='fg=magenta,bold'
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}bracket-level-3]='fg=cyan,bold'
|
||||
}
|
||||
```
|
||||
|
||||
If you have set theme before an update of styles (e.g. recent addition of bracket highlighting)
|
||||
then please repeat `fast-theme {theme}` call to regenerate theme files. (**2018-08-09**: FSH
|
||||
now has full user-theme support, refer to [appropriate section of README](#customization)).
|
||||
|
||||
**2018-07-30**
|
||||
|
||||
Ideal highlighting of brackets (pairing, etc.) – no quoting can disturb the result:
|
||||
|
||||
![image](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/brackets.gif)
|
||||
|
||||
`FAST_HIGHLIGHT[use_brackets]=1` to enable this feature (**2018-07-31**: not needed anymore, this highlighting is active by default).
|
||||
|
||||
**2018-07-21**
|
||||
|
||||
Chroma architecture now supports aliases. You can have `alias mygit="git commit"` and when `mygit`
|
||||
will be invoked everything will work as expected (Git chroma will be ran).
|
||||
|
||||
**2018-07-11**
|
||||
|
||||
There were problems with Ctrl-C not working when using FSH. After many days I've found a fix
|
||||
for this, it's pushed to master.
|
||||
|
||||
Second, asynchronous path checking (useful on e.g. slow network drives, or when there are many files in directory)
|
||||
is now optional. Set `FAST_HIGHLIGHT[use_async]=1` to enable it. This saves some users from Zshell crashes
|
||||
– there's an unknown bug in Zsh.
|
||||
|
||||
**2018-06-09**
|
||||
|
||||
New chroma functions: `awk`, `make`, `perl`, `vim`. Checkout the [video](https://asciinema.org/a/186234),
|
||||
it shows functionality of `awk` – compiling of code and NOT running it. Perl can do this too:
|
||||
[video](https://asciinema.org/a/186098).
|
||||
|
||||
**2018-06-06**
|
||||
|
||||
FSH gained a new architecture – "chroma functions". They are similar to "completion functions", i.e. they
|
||||
are defined **per-command**, but instead of completing that command, they colorize it. Two chroma exist,
|
||||
for `Git` ([video](https://asciinema.org/a/185707), [video](https://asciinema.org/a/185811)) and for `grep`
|
||||
([video](https://asciinema.org/a/185942)). Checkout
|
||||
[example chroma](https://github.com/zdharma/fast-syntax-highlighting/blob/master/chroma/-example.ch) if you
|
||||
would like to highlight a command.
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/git_chroma.png)
|
||||
|
||||
**2018-06-01**
|
||||
|
||||
Highlighting of command substitution (i.e. `$(...)`) with alternate theme – two themes at once! It was just white before:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/cmdsubst.png)
|
||||
|
||||
To select which theme to use for `$(...)` set the key `secondary=` in [theme ini file](https://github.com/zdharma/fast-syntax-highlighting/blob/master/themes/free.ini#L7).
|
||||
All shipped themes have this key set (only the `default` theme doesn't use second theme).
|
||||
|
||||
Also added correct highlighting of descriptor-variables passed to `exec`:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/execfd.png)
|
||||
|
||||
**2018-05-30**
|
||||
|
||||
For-loop is highlighted, it has separate settings in [theme file](https://github.com/zdharma/fast-syntax-highlighting/blob/master/themes/free.ini).
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/for-loop.png)
|
||||
|
||||
**2018-05-27**
|
||||
|
||||
Added support for 256-color themes. There are six themes shipped with FSH. The command to
|
||||
switch theme is `fast-theme {theme-name}`, it has a completion which lists available themes
|
||||
and options. Checkout [asciinema recording](https://asciinema.org/a/183814) that presents
|
||||
the themes.
|
||||
|
||||
**2018-05-25**
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
**2018-05-23**
|
||||
|
||||
Assign colorizing now spans to variables defined by `typeset`, `export`, `local`, etc.:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/typeset.png)
|
||||
|
||||
Also, `zcalc` has a separate math mode and specialized highlighting – no more light-red colors because of
|
||||
treating `zcalc` like a regular command-line:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/zcalc.png)
|
||||
|
||||
**2018-05-22**
|
||||
|
||||
Array assignments were still boring, so I throwed in bracked colorizing:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/array-assign.png)
|
||||
|
||||
**2018-05-22**<a name="assign-update"></a>
|
||||
|
||||
Assignments are no more one-colour default-white. When used in assignment, highlighted are:
|
||||
|
||||
- variables (outside strings),
|
||||
- strings (double-quoted and single-quoted),
|
||||
- math-mode (`val=$(( ... ))`).
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/assign.png)
|
||||
|
||||
**2018-01-06**
|
||||
|
||||
Math mode is highlighted – expressions `(( ... ))` and `$(( ... ))`. Empty variables are colorized as red.
|
||||
There are 3 style names (fields of
|
||||
[FAST_HIGHLIGHT_STYLES](https://github.com/zdharma/fast-syntax-highlighting/blob/master/fast-highlight#L34)
|
||||
hash) for math-variable, number and empty variable (error): `mathvar`, `mathnum`, `matherr`. You can set
|
||||
them (like the animation below shows) to change colors.
|
||||
|
||||
![animation](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/math.gif)
|
|
@ -0,0 +1,166 @@
|
|||
# Chroma Guide for F-Sy-H
|
||||
|
||||
## Motivation
|
||||
|
||||
Someone might want to create a detailed highlighting for a **specific program**
|
||||
and this document helps achieving this. It explains how chroma functions – the
|
||||
code behind such detailed highlighting – are constructed and used.
|
||||
|
||||
## Keywords
|
||||
|
||||
- `chroma` - a shorthand for `chroma function` – the thing that literally colorizes selected commands, like `git`, `grep`, etc. invocations, see `chroma function` below,
|
||||
- `big loop` - main highlighting code, a loop over tokens and at least 2 large structular constructs (big `if` and `case`);
|
||||
it is advanced, e.g. parses `case` statements, here-string, it basically constitutes 90% of the F-Sy-H project,
|
||||
- `chroma function` - a plugin-function that is called when a specific command occurs (e.g. when user enters `git` at
|
||||
command line) suppressing activity of `big loop` (i.e. no standard highlighting unless requested),
|
||||
- `token` - result of splitting whole command line (i.e. `$BUFFER`, the Zle variable) into bits called tokens, which are
|
||||
words in general, separated by spaces on the command line.
|
||||
|
||||
## Overview Of Functioning
|
||||
|
||||
1. Big loop is working – token by token processes command line, changes states (e.g. enters state "inside case
|
||||
statement") and in the end decides on color of the token currently processed.
|
||||
|
||||
2. Big loop occurs a command that has a chroma, e.g. `git`.
|
||||
|
||||
3. Big loop enters "chroma" state, calls associated chroma function.
|
||||
|
||||
4. Chroma takes care of "chroma" state, ensures it will be set also for next token.
|
||||
|
||||
5. "chroma" state is active, so all following tokens are routed to the chroma (in general skipping big-loop, see next items),
|
||||
|
||||
6. When processing of a single token is complete, the associated chroma returns 0
|
||||
(shell-truth) to request no further processing by the big loop.
|
||||
|
||||
7. It can also return 1 so that single, current token will be passed into big-loop
|
||||
for processing (to do a standard highlighting).
|
||||
|
||||
## Chroma-Function Arguments
|
||||
|
||||
- `$1` - 0 or 1, denoting if it's the first call to the chroma, or a following one,
|
||||
|
||||
- `$2` - the current token, also accessible by `$\__arg` from the upper scope -
|
||||
basically a private copy of `$__arg`; the token can be eg.: "grep",
|
||||
|
||||
- `$3` - a private copy of `$_start_pos`, i.e. the position of the token in the
|
||||
command line buffer, used to add region_highlight entry (see man),
|
||||
because Zsh colorizes by *ranges* applied onto command line buffer (e.g.
|
||||
`from-10 to-13 fg=red`),
|
||||
|
||||
- `$4` - a private copy of `$_end_pos` from the upper scope; denotes where current token
|
||||
ends (at which index in the string being the command line).
|
||||
|
||||
So example invocation could look like this:
|
||||
|
||||
----
|
||||
chroma/-example.ch 1 "grep" "$_start_pos" "$_end_pos"
|
||||
----
|
||||
|
||||
Big-loop will be doing such calls for the user, after occurring a specific chroma-enabled command (like e.g. `awk`), and then until chroma will detect end of this chroma-enabled command (end of whole invocation, with arguments, etc.; in other words, when e.g. new line or `;`-character occurs, etc.).
|
||||
|
||||
## Example Chroma-Function
|
||||
|
||||
[source,zsh]
|
||||
----
|
||||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Example chroma function. It colorizes first two arguments as `builtin' style,
|
||||
# third and following arguments as `globbing' style. First two arguments may
|
||||
# be "strings", they will be passed through to normal higlighter (by returning 1).
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - like above document says
|
||||
#
|
||||
# $3 - ...
|
||||
#
|
||||
# $4 - ...
|
||||
#
|
||||
# Other tips are:
|
||||
# - $CURSOR holds cursor position
|
||||
# - $BUFFER holds whole command line buffer
|
||||
# - $LBUFFER holds command line buffer that is left from the cursor, i.e. it's a
|
||||
# BUFFER substring 1 .. $CURSOR
|
||||
# - $RBUFFER is the same as LBUFFER but holds part of BUFFER right to the cursor
|
||||
#
|
||||
# The function receives $BUFFER but via sequence of tokens, which are shell words,
|
||||
# e.g. "a b c" is a shell word, while a b c are 3 shell words.
|
||||
#
|
||||
# FAST_HIGHLIGHT is a friendly hash array which allows to store strings without
|
||||
# creating global parameters (variables). If you need hash, go ahead and use it,
|
||||
# declaring first, under some distinct name like: typeset -gA CHROMA_EXPLE_DICT.
|
||||
# Remember to reset the hash and others at __first_call == 1, so that you have
|
||||
# a fresh state for new command.
|
||||
|
||||
# Keep chroma-takever state meaning: until ;, handle highlighting via chroma.
|
||||
# So the below 8192 assignment takes care that next token will be routed to chroma.
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global string variables.
|
||||
FAST_HIGHLIGHT[chroma-example-counter]=0
|
||||
|
||||
# Set style for region_highlight entry. It is used below in
|
||||
# '[[ -n "$__style" ]] ...' line, which adds highlight entry,
|
||||
# like "10 12 fg=green", through `reply' array.
|
||||
#
|
||||
# Could check if command `example' exists and set `unknown-token'
|
||||
# style instead of `command'
|
||||
__style=${FAST_THEME_NAME}command
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
# Count non-option tokens
|
||||
(( FAST_HIGHLIGHT[chroma-example-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-example-counter] ))
|
||||
|
||||
# Colorize 1..2 as builtin, 3.. as glob
|
||||
if (( FAST_HIGHLIGHT[chroma-example-counter] <= 2 )); then
|
||||
if [[ "$__wrd" = \"* ]]; then
|
||||
# Pass through, fsh main code will do the highlight!
|
||||
return 1
|
||||
else
|
||||
__style=${FAST_THEME_NAME}builtin
|
||||
fi
|
||||
else
|
||||
__style=${FAST_THEME_NAME}globbing
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
# If 1 will be added to __start_pos, this will highlight "oken".
|
||||
# If 1 will be subtracted from __end_pos, this will highlight "toke".
|
||||
# $PREBUFFER is for specific situations when users does command \<ENTER>
|
||||
# i.e. when multi-line command using backslash is entered.
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code can do
|
||||
# it itself (and it does in other chromas) and skip setting __style to
|
||||
# this way disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves.
|
||||
# _start_pos=$_end_pos advainces pointers in command line buffer.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
----
|
||||
|
|
@ -0,0 +1,441 @@
|
|||
<!-- 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/zplugin)**
|
||||
* **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/zplugin#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
|
||||
```
|
|
@ -0,0 +1,23 @@
|
|||
Copyright (c) 2010-2016 zsh-syntax-highlighting contributors
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions
|
||||
and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of
|
||||
conditions and the following disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,290 @@
|
|||
[![paypal](https://img.shields.io/badge/-Donate-yellow.svg?longCache=true&style=for-the-badge)](https://www.paypal.me/ZdharmaInitiative)
|
||||
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D54B3S7C6HGME)
|
||||
[![patreon](https://img.shields.io/badge/-Patreon-orange.svg?longCache=true&style=for-the-badge)](https://www.patreon.com/psprint)
|
||||
<br/>New: You can request a feature when donating, even fancy or advanced ones get implemented this way. [There are
|
||||
reports](DONATIONS.md) about what is being done with the money received.
|
||||
|
||||
# Fast Syntax Highlighting (F-Sy-H)
|
||||
|
||||
Feature rich syntax highlighting for Zsh.
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/highlight-much.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Table of Contents
|
||||
|
||||
- [News](#news)
|
||||
- [Installation](#installation)
|
||||
- [Features](#features)
|
||||
- [Performance](#performance)
|
||||
- [IRC Channel](#irc-channel)
|
||||
|
||||
### Other Contents
|
||||
- [License](https://github.com/zdharma/fast-syntax-highlighting/blob/master/LICENSE)
|
||||
- [Changelog](https://github.com/zdharma/fast-syntax-highlighting/blob/master/CHANGELOG.md)
|
||||
- [Theme Guide](https://github.com/zdharma/fast-syntax-highlighting/blob/master/THEME_GUIDE.md)
|
||||
- [Chroma Guide](https://github.com/zdharma/fast-syntax-highlighting/blob/master/CHROMA_GUIDE.adoc)
|
||||
|
||||
# News
|
||||
|
||||
* 15-06-2019
|
||||
- A new architecture for defining the highlighting for **specific commands**: it now
|
||||
uses **abstract definitions** instead of **top-down, regular code**. The first effect
|
||||
is the highlighting for the `git` command it is now **maximally faithful**, it
|
||||
follows the `git` command almost completely.
|
||||
[Screencast](https://asciinema.org/a/253411)
|
||||
|
||||
# Installation
|
||||
|
||||
### Manual
|
||||
|
||||
Clone the Repository.
|
||||
|
||||
```zsh
|
||||
git clone https://github.com/zdharma/fast-syntax-highlighting ~/path/to/fsh
|
||||
```
|
||||
|
||||
And add the following to your `zshrc` file.
|
||||
```zsh
|
||||
source ~/path/to/fsh/fast-syntax-highlighting.plugin.zsh
|
||||
```
|
||||
|
||||
### Zinit
|
||||
|
||||
Add the following to your `zshrc` file.
|
||||
|
||||
```zsh
|
||||
zinit light zdharma/fast-syntax-highlighting
|
||||
```
|
||||
|
||||
Here's an example of how to load the plugin together with a few other popular
|
||||
ones with the use of
|
||||
[Turbo](https://zdharma.org/zinit/wiki/INTRODUCTION/#turbo_mode_zsh_62_53),
|
||||
i.e.: speeding up the Zsh startup by loading the plugin right after the first
|
||||
prompt, in background:
|
||||
|
||||
```zsh
|
||||
zinit wait lucid for \
|
||||
atinit"ZINIT[COMPINIT_OPTS]=-C; zicompinit; zicdreplay" \
|
||||
zdharma/fast-syntax-highlighting \
|
||||
blockf \
|
||||
zsh-users/zsh-completions \
|
||||
atload"!_zsh_autosuggest_start" \
|
||||
zsh-users/zsh-autosuggestions
|
||||
```
|
||||
|
||||
### Antigen
|
||||
|
||||
Add the following to your `zshrc` file.
|
||||
|
||||
```zsh
|
||||
antigen bundle zdharma/fast-syntax-highlighting
|
||||
```
|
||||
|
||||
### Zgen
|
||||
|
||||
Add the following to your `.zshrc` file in the same place you're doing
|
||||
your other `zgen load` calls in.
|
||||
|
||||
```zsh
|
||||
zgen load zdharma/fast-syntax-highlighting
|
||||
```
|
||||
|
||||
|
||||
### Oh-My-Zsh
|
||||
|
||||
Clone the Repository.
|
||||
|
||||
```zsh
|
||||
git clone https://github.com/zdharma/fast-syntax-highlighting.git \
|
||||
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting
|
||||
```
|
||||
|
||||
And add `fast-syntax-highlighting` to your plugin list.
|
||||
|
||||
# Features
|
||||
|
||||
### Themes
|
||||
|
||||
Switch themes via `fast-theme {theme-name}`.
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/theme.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
Run `fast-theme -t {theme-name}` option to obtain the snippet above.
|
||||
|
||||
Run `fast-theme -l` to list available themes.
|
||||
|
||||
### Variables
|
||||
|
||||
Comparing to the project `zsh-users/zsh-syntax-highlighting` (the upper line):
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/parameter.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/in_string.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Brackets
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/brackets.gif"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Conditions
|
||||
|
||||
Comparing to the project `zsh-users/zsh-syntax-highlighting` (the upper line):
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/cplx_cond.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Strings
|
||||
|
||||
Exact highlighting that recognizes quotings.
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/ideal-string.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
### here-strings
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/herestring.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### `exec` descriptor-variables
|
||||
|
||||
Comparing to the project `zsh-users/zsh-syntax-highlighting` (the upper line):
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/execfd_cmp.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### for-loops and alternate syntax (brace `{`/`}` blocks)
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/for-loop-cmp.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Function definitions
|
||||
|
||||
Comparing to the project `zsh-users/zsh-syntax-highlighting` (the upper 2 lines):
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/function.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Recursive `eval` and `$( )` highlighting
|
||||
|
||||
Comparing to the project `zsh-users/zsh-syntax-highlighting` (the upper line):
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/eval_cmp.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Chroma functions
|
||||
|
||||
Highlighting that is specific for a given command.
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/git_chroma.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
The [chromas](https://github.com/zdharma/fast-syntax-highlighting/tree/master/chroma)
|
||||
that are enabled by default can be found
|
||||
[here](https://github.com/zdharma/fast-syntax-highlighting/blob/master/fast-highlight#L166).
|
||||
|
||||
### Math-mode highlighting
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/math.gif"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Zcalc highlighting
|
||||
|
||||
<div style="width:100%;background-color:black;border:3px solid black;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<img
|
||||
src="https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/zcalc.png"
|
||||
alt="image could not be loaded"
|
||||
style="color:red;background-color:black;font-weight:bold"
|
||||
/>
|
||||
</div>
|
||||
|
||||
# Performance
|
||||
Performance differences can be observed in this Asciinema recording, where a `10 kB` function is being edited.
|
||||
|
||||
<div style="width:100%;background-color:#121314;border:3px solid #121314;border-radius:6px;margin:5px 0;padding:2px 5px">
|
||||
<a href="https://asciinema.org/a/112367">
|
||||
<img src="https://asciinema.org/a/112367.png" alt="asciicast">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
## IRC Channel
|
||||
|
||||
Channel `#zinit@freenode` is a support place for all author's projects. Connect to:
|
||||
[chat.freenode.net:6697](ircs://chat.freenode.net:6697/%23zinit) (SSL) or [chat.freenode.net:6667](irc://chat.freenode.net:6667/%23zinit)
|
||||
and join #zinit.
|
||||
|
||||
Following is a quick access via Webchat [![IRC](https://kiwiirc.com/buttons/chat.freenode.net/zinit.png)](https://kiwiirc.com/client/chat.freenode.net:+6697/#zinit)
|
|
@ -0,0 +1,76 @@
|
|||
# Theme Guide for F-Sy-H
|
||||
|
||||
`fast-theme` tool is used to select a theme. There are 6 shipped themes, they can be listed with `fast-theme -l`.
|
||||
Themes are basic [INI files](https://github.com/zdharma/fast-syntax-highlighting/tree/master/themes) where each
|
||||
key is a *style*.
|
||||
Besides shipped themes, user can point this tool to any other theme, by simple `fast-theme ~/mytheme.ini`. To
|
||||
obtain template to work on when creating own theme, issue `fast-theme --copy-shipped-theme {theme-name}`.
|
||||
|
||||
To alter just a few styles and not create a whole new theme, use **overlay**. What is overlay? It is in the same
|
||||
format as full theme, but can have only a few styles defined, and these styles will overwrite styles in main-theme.
|
||||
Example overlay file:
|
||||
|
||||
```ini
|
||||
; overlay.ini
|
||||
[base]
|
||||
commandseparator = yellow,bold
|
||||
comment = 17
|
||||
|
||||
[command-point]
|
||||
function = green
|
||||
command = 180
|
||||
```
|
||||
|
||||
File name `overlay.ini` is treated specially.
|
||||
|
||||
When specifing path, following short-hands can be used:
|
||||
|
||||
```
|
||||
XDG: = ~/.config/fsh (respects $XDG_CONFIG_HOME env var)
|
||||
LOCAL: = /usr/local/share/fsh/
|
||||
HOME: = ~/.fsh/
|
||||
OPT: = /opt/local/share/fsh/
|
||||
```
|
||||
|
||||
So for example, issue `fast-theme XDG:overlay` to load `~/.config/fsh/overlay.ini` as overlay. The `.ini`
|
||||
extension is optional.
|
||||
|
||||
## Secondary Theme
|
||||
|
||||
Each theme has key `secondary`, e.g. for theme `free`:
|
||||
|
||||
```ini
|
||||
; free.ini
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = red,bold
|
||||
; ...
|
||||
; ...
|
||||
; ...
|
||||
secondary = zdharma
|
||||
```
|
||||
|
||||
Secondary theme (`zdharma` in the example) will be used for highlighting of argument for `eval`
|
||||
and of `$( ... )` interior (i.e. of interior of command substitution). Basically, recursive
|
||||
highlighting uses alternate theme to make the highlighted code distinct:
|
||||
|
||||
![sshot](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/cmdsubst.png)
|
||||
|
||||
In the above screen-shot the interior of `$( ... )` uses different colors than the rest of the
|
||||
code. Example for `eval`:
|
||||
|
||||
![image](https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/images/eval_cmp.png)
|
||||
|
||||
First line doesn't use recursive highlighting, highlights `eval` argument as regular string.
|
||||
Second line switches theme to `zdharma` and does full recursive highlighting of eval argument.
|
||||
|
||||
## Custom Working Directory
|
||||
|
||||
Set `$FAST_WORK_DIR` before loading the plugin to have e.g. processed theme files (ready to
|
||||
load, in Zsh format, not INI) kept under specified location. This is handy if e.g. you install
|
||||
Fast-Syntax-Highlighting system-wide (e.g. from AUR on ArchLinux) and want to have per-user
|
||||
theme setup.
|
||||
|
||||
You can use "~" in the path, e.g. `FAST_WORK_DIR=~/.fsh` and also the `XDG:`, `LOCAL:`, `OPT:`,
|
||||
etc. short-hands, so e.g. `FAST_WORK_DIR=XDG` or `FAST_WORK_DIR=XDG:` is allowed (in this case
|
||||
it will be changed to `$HOME/.config/fsh` by default by F-Sy-H loader).
|
|
@ -0,0 +1,39 @@
|
|||
#compdef fast-theme
|
||||
|
||||
#
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Completion for theme-switching function, fast-theme,
|
||||
# part of zdharma/fast-syntax-highlighting.
|
||||
#
|
||||
|
||||
integer ret=1
|
||||
local -a arguments
|
||||
|
||||
arguments=(
|
||||
{-h,--help}'[display help text]'
|
||||
{-l,--list}'[list available themes]'
|
||||
{-r,--reset}'[unset any theme (revert to default highlighting)]'
|
||||
{-R,--ov-reset}'[unset overlay, use styles only from main-theme (requires restart)]'
|
||||
{-q,--quiet}'[no default messages]'
|
||||
{-s,--show}'[get and display the theme currently being set]'
|
||||
{-v,--verbose}'[more messages during operation]'
|
||||
{-t,--test}'[test theme after setting it (show example code)]'
|
||||
{-p,--palette}'[just print all 256 colors and exit (useful when creating a theme)]'
|
||||
{-w,--workdir}'[cd into $FAST_WORK_DIR (if not set, then into the plugin directory)]'
|
||||
)
|
||||
|
||||
typeset -a themes
|
||||
themes=( "$FAST_WORK_DIR"/themes/*.ini(:t:r) )
|
||||
|
||||
if [[ -d ${XDG_CONFIG_HOME:-$HOME/.config}/fsh ]] {
|
||||
typeset -a themes2
|
||||
themes2=( "${XDG_CONFIG_HOME:-$HOME/.config}"/fsh/*.ini(:t:r) )
|
||||
themes+=( XDG:${^themes2[@]} )
|
||||
}
|
||||
|
||||
_wanted themes expl "Themes" \
|
||||
compadd "$@" -a - themes && ret=0
|
||||
_arguments -s $arguments && ret=0
|
||||
|
||||
return $ret
|
|
@ -0,0 +1,77 @@
|
|||
# vim:ft=zsh:sw=4:sts=4
|
||||
|
||||
#
|
||||
# $1 - PREBUFFER
|
||||
# $2 - BUFFER
|
||||
#
|
||||
function -fast-highlight-string-process {
|
||||
emulate -LR zsh
|
||||
setopt extendedglob warncreateglobal typesetsilent
|
||||
|
||||
local -A pos_to_level level_to_pos pair_map final_pairs
|
||||
local input=$1$2 _mybuf=$1$2 __style __quoting
|
||||
integer __idx=0 __pair_idx __level=0 __start __end
|
||||
local -a match mbegin mend
|
||||
|
||||
pair_map=( "(" ")" "{" "}" "[" "]" )
|
||||
|
||||
while [[ $_mybuf = (#b)([^"{}()[]\\\"'"]#)((["({[]})\"'"])|[\\](*))(*) ]]; do
|
||||
if [[ -n ${match[4]} ]] {
|
||||
__idx+=${mbegin[2]}
|
||||
|
||||
[[ $__quoting = \' ]] && _mybuf=${match[4]} || { _mybuf=${match[4]:1}; (( ++ __idx )); }
|
||||
} else {
|
||||
__idx+=${mbegin[2]}
|
||||
[[ -z $__quoting && -z ${_FAST_COMPLEX_BRACKETS[(r)$((__idx-${#PREBUFFER}-1))]} ]] && {
|
||||
if [[ ${match[2]} = ["({["] ]]; then
|
||||
pos_to_level[$__idx]=$(( ++__level ))
|
||||
level_to_pos[$__level]=$__idx
|
||||
elif [[ ${match[2]} = ["]})"] ]]; then
|
||||
if (( __level > 0 )); then
|
||||
__pair_idx=${level_to_pos[$__level]}
|
||||
pos_to_level[$__idx]=$(( __level -- ))
|
||||
[[ ${pair_map[${input[__pair_idx]}]} = ${input[__idx]} ]] && {
|
||||
final_pairs[$__idx]=$__pair_idx
|
||||
final_pairs[$__pair_idx]=$__idx
|
||||
}
|
||||
else
|
||||
pos_to_level[$__idx]=-1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ ${match[2]} = \" && $__quoting != \' ]] {
|
||||
[[ $__quoting = '"' ]] && __quoting="" || __quoting='"';
|
||||
}
|
||||
if [[ ${match[2]} = \' && $__quoting != \" ]] {
|
||||
if [[ $__quoting = ("'"|"$'") ]] {
|
||||
__quoting=""
|
||||
} else {
|
||||
if [[ $match[1] = *\$ ]] {
|
||||
__quoting="\$'";
|
||||
} else {
|
||||
__quoting="'";
|
||||
}
|
||||
}
|
||||
}
|
||||
_mybuf=${match[5]}
|
||||
}
|
||||
done
|
||||
|
||||
for __idx in ${(k)pos_to_level}; do
|
||||
(( ${+final_pairs[$__idx]} )) && __style=${FAST_THEME_NAME}bracket-level-$(( ( (pos_to_level[$__idx]-1) % 3 ) + 1 )) || __style=${FAST_THEME_NAME}unknown-token
|
||||
(( __start=__idx-${#PREBUFFER}-1, __end=__idx-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
done
|
||||
|
||||
# If cursor is on a bracket, then highlight corresponding bracket, if any.
|
||||
if [[ $WIDGET != zle-line-finish ]]; then
|
||||
__idx=$(( CURSOR + 1 ))
|
||||
if (( ${+pos_to_level[$__idx]} )) && (( ${+final_pairs[$__idx]} )); then
|
||||
(( __start=final_pairs[$__idx]-${#PREBUFFER}-1, __end=final_pairs[$__idx]-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") && \
|
||||
reply+=("$CURSOR $__idx ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}")
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
|
@ -0,0 +1,384 @@
|
|||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2010-2016 zsh-syntax-highlighting contributors
|
||||
# Copyright (c) 2017-2019 Sebastian Gniazdowski (modifications)
|
||||
# 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
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# Standarized way of handling finding plugin dir,
|
||||
# regardless of functionargzero and posixargzero,
|
||||
# and with an option for a plugin manager to alter
|
||||
# the plugin directory (i.e. set ZERO parameter)
|
||||
# http://zdharma.org/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
|
||||
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
|
||||
0="${${(M)0:#/*}:-$PWD/$0}"
|
||||
|
||||
typeset -g FAST_HIGHLIGHT_VERSION=1.55
|
||||
typeset -g FAST_BASE_DIR="${0:h}"
|
||||
typeset -ga _FAST_MAIN_CACHE
|
||||
# Holds list of indices pointing at brackets that
|
||||
# are complex, i.e. e.g. part of "[[" in [[ ... ]]
|
||||
typeset -ga _FAST_COMPLEX_BRACKETS
|
||||
|
||||
typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${XDG_CACHE_HOME:-~/.cache}/fast-syntax-highlighting}
|
||||
: ${FAST_WORK_DIR:=$FAST_BASE_DIR}
|
||||
# Expand any tilde in the (supposed) path.
|
||||
FAST_WORK_DIR=${~FAST_WORK_DIR}
|
||||
|
||||
# Last (currently, possibly) loaded plugin isn't "fast-syntax-highlighting"?
|
||||
# And FPATH isn't containing plugin dir?
|
||||
if [[ ${zsh_loaded_plugins[-1]} != */fast-syntax-highlighting && -z ${fpath[(r)${0:h}]} ]]
|
||||
then
|
||||
fpath+=( "${0:h}" )
|
||||
fi
|
||||
|
||||
if [[ ! -w $FAST_WORK_DIR ]]; then
|
||||
FAST_WORK_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/fsh"
|
||||
command mkdir -p "$FAST_WORK_DIR"
|
||||
fi
|
||||
|
||||
# Invokes each highlighter that needs updating.
|
||||
# This function is supposed to be called whenever the ZLE state changes.
|
||||
_zsh_highlight()
|
||||
{
|
||||
# Store the previous command return code to restore it whatever happens.
|
||||
local ret=$?
|
||||
|
||||
# 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?'.
|
||||
if [[ $WIDGET == zle-isearch-update ]] && ! (( $+ISEARCHMATCH_ACTIVE )); then
|
||||
region_highlight=()
|
||||
return $ret
|
||||
fi
|
||||
|
||||
emulate -LR zsh
|
||||
setopt extendedglob warncreateglobal typesetsilent noshortloops
|
||||
|
||||
local REPLY # don't leak $REPLY into global scope
|
||||
local -a reply
|
||||
|
||||
# Do not highlight if there are more than 300 chars in the buffer. It's most
|
||||
# likely a pasted command or a huge list of files in that case..
|
||||
[[ -n ${ZSH_HIGHLIGHT_MAXLENGTH:-} ]] && [[ $#BUFFER -gt $ZSH_HIGHLIGHT_MAXLENGTH ]] && return $ret
|
||||
|
||||
# Do not highlight if there are pending inputs (copy/paste).
|
||||
[[ $PENDING -gt 0 ]] && return $ret
|
||||
|
||||
# Reset region highlight to build it from scratch
|
||||
# may need to remove path_prefix highlighting when the line ends
|
||||
if [[ $WIDGET == zle-line-finish ]] || _zsh_highlight_buffer_modified; then
|
||||
-fast-highlight-init
|
||||
-fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
(( FAST_HIGHLIGHT[use_brackets] )) && {
|
||||
_FAST_MAIN_CACHE=( $reply )
|
||||
-fast-highlight-string-process "$PREBUFFER" "$BUFFER"
|
||||
}
|
||||
region_highlight=( $reply )
|
||||
else
|
||||
local char="${BUFFER[CURSOR+1]}"
|
||||
if [[ "$char" = ["{([])}"] || "${FAST_HIGHLIGHT[prev_char]}" = ["{([])}"] ]]; then
|
||||
FAST_HIGHLIGHT[prev_char]="$char"
|
||||
(( FAST_HIGHLIGHT[use_brackets] )) && {
|
||||
reply=( $_FAST_MAIN_CACHE )
|
||||
-fast-highlight-string-process "$PREBUFFER" "$BUFFER"
|
||||
region_highlight=( $reply )
|
||||
}
|
||||
fi
|
||||
fi
|
||||
|
||||
{
|
||||
local cache_place
|
||||
local -a region_highlight_copy
|
||||
|
||||
# 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
|
||||
() {
|
||||
local needle=$'\n'
|
||||
integer min max
|
||||
if (( MARK > CURSOR )) ; then
|
||||
min=$CURSOR max=$(( MARK + 1 ))
|
||||
else
|
||||
min=$MARK max=$CURSOR
|
||||
fi
|
||||
(( min = ${${BUFFER[1,$min]}[(I)$needle]} ))
|
||||
(( max += ${${BUFFER:($max-1)}[(i)$needle]} - 1 ))
|
||||
_zsh_highlight_apply_zle_highlight region standout "$min" "$max"
|
||||
}
|
||||
fi
|
||||
|
||||
# yank / paste (zsh-5.1.1 and newer)
|
||||
(( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END"
|
||||
|
||||
# isearch
|
||||
(( $+ISEARCHMATCH_ACTIVE )) && (( ISEARCHMATCH_ACTIVE )) && _zsh_highlight_apply_zle_highlight isearch underline "$ISEARCHMATCH_START" "$ISEARCHMATCH_END"
|
||||
|
||||
# suffix
|
||||
(( $+SUFFIX_ACTIVE )) && (( SUFFIX_ACTIVE )) && _zsh_highlight_apply_zle_highlight suffix bold "$SUFFIX_START" "$SUFFIX_END"
|
||||
|
||||
return $ret
|
||||
|
||||
} always {
|
||||
typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER="$BUFFER"
|
||||
typeset -g _ZSH_HIGHLIGHT_PRIOR_RACTIVE="$REGION_ACTIVE"
|
||||
typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=$CURSOR
|
||||
}
|
||||
}
|
||||
|
||||
# Apply highlighting based on entries in the zle_highlight array.
|
||||
# This function takes four arguments:
|
||||
# 1. The exact entry (no patterns) in the zle_highlight array:
|
||||
# region, paste, isearch, or suffix
|
||||
# 2. The default highlighting that should be applied if the entry is unset
|
||||
# 3. and 4. Two integer values describing the beginning and end of the
|
||||
# range. The order does not matter.
|
||||
_zsh_highlight_apply_zle_highlight() {
|
||||
local entry="$1" default="$2"
|
||||
integer first="$3" second="$4"
|
||||
|
||||
# read the relevant entry from zle_highlight
|
||||
local region="${zle_highlight[(r)${entry}:*]}"
|
||||
|
||||
if [[ -z "$region" ]]; then
|
||||
# entry not specified at all, use default value
|
||||
region=$default
|
||||
else
|
||||
# strip prefix
|
||||
region="${region#${entry}:}"
|
||||
|
||||
# no highlighting when set to the empty string or to 'none'
|
||||
if [[ -z "$region" ]] || [[ "$region" == none ]]; then
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
integer start end
|
||||
if (( first < second )); then
|
||||
start=$first end=$second
|
||||
else
|
||||
start=$second end=$first
|
||||
fi
|
||||
region_highlight+=("$start $end $region")
|
||||
}
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# API/utility functions for highlighters
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
# Whether the command line buffer has been modified or not.
|
||||
#
|
||||
# Returns 0 if the buffer has changed since _zsh_highlight was last called.
|
||||
_zsh_highlight_buffer_modified()
|
||||
{
|
||||
[[ "${_ZSH_HIGHLIGHT_PRIOR_BUFFER:-}" != "$BUFFER" ]] || [[ "$REGION_ACTIVE" != "$_ZSH_HIGHLIGHT_PRIOR_RACTIVE" ]] || { _zsh_highlight_cursor_moved && [[ "$REGION_ACTIVE" = 1 || "$REGION_ACTIVE" = 2 ]] }
|
||||
}
|
||||
|
||||
# Whether the cursor has moved or not.
|
||||
#
|
||||
# Returns 0 if the cursor has moved since _zsh_highlight was last called.
|
||||
_zsh_highlight_cursor_moved()
|
||||
{
|
||||
[[ -n $CURSOR ]] && [[ -n ${_ZSH_HIGHLIGHT_PRIOR_CURSOR-} ]] && (($_ZSH_HIGHLIGHT_PRIOR_CURSOR != $CURSOR))
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Setup functions
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
# Helper for _zsh_highlight_bind_widgets
|
||||
# $1 is name of widget to call
|
||||
_zsh_highlight_call_widget()
|
||||
{
|
||||
integer ret
|
||||
builtin zle "$@"
|
||||
ret=$?
|
||||
_zsh_highlight
|
||||
return $ret
|
||||
}
|
||||
|
||||
# Rebind all ZLE widgets to make them invoke _zsh_highlights.
|
||||
_zsh_highlight_bind_widgets()
|
||||
{
|
||||
setopt localoptions noksharrays
|
||||
local -F2 SECONDS
|
||||
local prefix=orig-s${SECONDS/./}-r$(( RANDOM % 1000 )) # unique each time, in case we're sourced more than once
|
||||
|
||||
# Load ZSH module zsh/zleparameter, needed to override user defined widgets.
|
||||
zmodload zsh/zleparameter 2>/dev/null || {
|
||||
print -r -- >&2 'zsh-syntax-highlighting: failed loading zsh/zleparameter.'
|
||||
return 1
|
||||
}
|
||||
|
||||
# Override ZLE widgets to make them invoke _zsh_highlight.
|
||||
local -U widgets_to_bind
|
||||
widgets_to_bind=(${${(k)widgets}:#(.*|run-help|which-command|beep|set-local-history|yank|zle-line-pre-redraw)})
|
||||
|
||||
# Always wrap special zle-line-finish widget. This is needed to decide if the
|
||||
# current line ends and special highlighting logic needs to be applied.
|
||||
# E.g. remove cursor imprint, don't highlight partial paths, ...
|
||||
widgets_to_bind+=(zle-line-finish)
|
||||
|
||||
# Always wrap special zle-isearch-update widget to be notified of updates in isearch.
|
||||
# This is needed because we need to disable highlighting in that case.
|
||||
widgets_to_bind+=(zle-isearch-update)
|
||||
|
||||
local cur_widget
|
||||
for cur_widget in $widgets_to_bind; do
|
||||
case $widgets[$cur_widget] in
|
||||
|
||||
# Already rebound event: do nothing.
|
||||
user:_zsh_highlight_widget_*);;
|
||||
|
||||
# The "eval"'s are required to make $cur_widget a closure: the value of the parameter at function
|
||||
# definition time is used.
|
||||
#
|
||||
# We can't use ${0/_zsh_highlight_widget_} because these widgets are always invoked with
|
||||
# NO_function_argzero, regardless of the option's setting here.
|
||||
|
||||
# User defined widget: override and rebind old one with prefix "orig-".
|
||||
user:*) zle -N -- $prefix-$cur_widget ${widgets[$cur_widget]#*:}
|
||||
eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget ${(q)prefix}-${(q)cur_widget} -- \"\$@\" }"
|
||||
zle -N -- $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
||||
|
||||
# Completion widget: override and rebind old one with prefix "orig-".
|
||||
completion:*) zle -C $prefix-$cur_widget ${${(s.:.)widgets[$cur_widget]}[2,3]}
|
||||
eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget ${(q)prefix}-${(q)cur_widget} -- \"\$@\" }"
|
||||
zle -N -- $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
||||
|
||||
# Builtin widget: override and make it call the builtin ".widget".
|
||||
builtin) eval "_zsh_highlight_widget_${(q)prefix}-${(q)cur_widget}() { _zsh_highlight_call_widget .${(q)cur_widget} -- \"\$@\" }"
|
||||
zle -N -- $cur_widget _zsh_highlight_widget_$prefix-$cur_widget;;
|
||||
|
||||
# Incomplete or nonexistent widget: Bind to z-sy-h directly.
|
||||
*)
|
||||
if [[ $cur_widget == zle-* ]] && [[ -z $widgets[$cur_widget] ]]; then
|
||||
_zsh_highlight_widget_${cur_widget}() { :; _zsh_highlight }
|
||||
zle -N -- $cur_widget _zsh_highlight_widget_$cur_widget
|
||||
else
|
||||
# Default: unhandled case.
|
||||
print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget ${(qq)cur_widget}"
|
||||
fi
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Setup
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
# Try binding widgets.
|
||||
_zsh_highlight_bind_widgets || {
|
||||
print -r -- >&2 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.'
|
||||
return 1
|
||||
}
|
||||
|
||||
# Reset scratch variables when commandline is done.
|
||||
_zsh_highlight_preexec_hook()
|
||||
{
|
||||
typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER=
|
||||
typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=0
|
||||
typeset -ga _FAST_MAIN_CACHE
|
||||
_FAST_MAIN_CACHE=()
|
||||
}
|
||||
|
||||
autoload -Uz add-zsh-hook
|
||||
add-zsh-hook preexec _zsh_highlight_preexec_hook 2>/dev/null || {
|
||||
print -r -- >&2 'zsh-syntax-highlighting: failed loading add-zsh-hook.'
|
||||
}
|
||||
|
||||
/fshdbg() {
|
||||
print -r -- "$@" >>! /tmp/reply
|
||||
}
|
||||
|
||||
ZSH_HIGHLIGHT_MAXLENGTH=10000
|
||||
|
||||
# Load zsh/parameter module if available
|
||||
zmodload zsh/parameter 2>/dev/null
|
||||
zmodload zsh/system 2>/dev/null
|
||||
|
||||
autoload -Uz -- is-at-least fast-theme .fast-read-ini-file .fast-run-git-command \
|
||||
.fast-make-targets .fast-run-command .fast-zts-read-all
|
||||
autoload -Uz -- →chroma/-git.ch →chroma/-hub.ch →chroma/-lab.ch →chroma/-example.ch \
|
||||
→chroma/-grep.ch →chroma/-perl.ch →chroma/-make.ch →chroma/-awk.ch \
|
||||
→chroma/-vim.ch →chroma/-source.ch →chroma/-sh.ch →chroma/-docker.ch \
|
||||
→chroma/-autoload.ch →chroma/-ssh.ch →chroma/-scp.ch →chroma/-which.ch \
|
||||
→chroma/-printf.ch →chroma/-ruby.ch →chroma/-whatis.ch →chroma/-alias.ch \
|
||||
→chroma/-subcommand.ch →chroma/-autorandr.ch →chroma/-nmcli.ch \
|
||||
→chroma/-fast-theme.ch →chroma/-node.ch →chroma/-fpath_peq.ch \
|
||||
→chroma/-precommand.ch →chroma/-subversion.ch →chroma/-ionice.ch \
|
||||
→chroma/-nice.ch →chroma/main-chroma.ch →chroma/-ogit.ch →chroma/-zinit.ch
|
||||
|
||||
source "${0:h}/fast-highlight"
|
||||
source "${0:h}/fast-string-highlight"
|
||||
|
||||
local __fsyh_theme
|
||||
zstyle -s :plugin:fast-syntax-highlighting theme __fsyh_theme
|
||||
|
||||
[[ ( "${+termcap}" != 1 || "${termcap[Co]}" != <-> || "${termcap[Co]}" -lt "256" ) && "$__fsyh_theme" = (default|) ]] && {
|
||||
FAST_HIGHLIGHT_STYLES[defaultvariable]="none"
|
||||
FAST_HIGHLIGHT_STYLES[defaultglobbing-ext]="fg=blue,bold"
|
||||
FAST_HIGHLIGHT_STYLES[defaulthere-string-text]="bg=blue"
|
||||
FAST_HIGHLIGHT_STYLES[defaulthere-string-var]="fg=cyan,bg=blue"
|
||||
FAST_HIGHLIGHT_STYLES[defaultcorrect-subtle]="bg=blue"
|
||||
FAST_HIGHLIGHT_STYLES[defaultsubtle-bg]="bg=blue"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[variable]}" = "fg=113" ]] && FAST_HIGHLIGHT_STYLES[variable]="none"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[globbing-ext]}" = "fg=13" ]] && FAST_HIGHLIGHT_STYLES[globbing-ext]="fg=blue,bold"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[here-string-text]}" = "bg=18" ]] && FAST_HIGHLIGHT_STYLES[here-string-text]="bg=blue"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[here-string-var]}" = "fg=cyan,bg=18" ]] && FAST_HIGHLIGHT_STYLES[here-string-var]="fg=cyan,bg=blue"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[correct-subtle]}" = "fg=12" ]] && FAST_HIGHLIGHT_STYLES[correct-subtle]="bg=blue"
|
||||
[[ "${FAST_HIGHLIGHT_STYLES[subtle-bg]}" = "bg=18" ]] && FAST_HIGHLIGHT_STYLES[subtle-bg]="bg=blue"
|
||||
}
|
||||
|
||||
unset __fsyh_theme
|
||||
|
||||
alias fsh-alias=fast-theme
|
||||
|
||||
-fast-highlight-fill-option-variables
|
||||
|
||||
if [[ ! -e $FAST_WORK_DIR/secondary_theme.zsh ]] {
|
||||
if { type curl &>/dev/null } {
|
||||
curl -fsSL -o "$FAST_WORK_DIR/secondary_theme.zsh" \
|
||||
https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/share/free_theme.zsh \
|
||||
&>/dev/null
|
||||
} elif { type wget &>/dev/null } {
|
||||
wget -O "$FAST_WORK_DIR/secondary_theme.zsh" \
|
||||
https://raw.githubusercontent.com/zdharma/fast-syntax-highlighting/master/share/free_theme.zsh \
|
||||
&>/dev/null
|
||||
}
|
||||
touch "$FAST_WORK_DIR/secondary_theme.zsh"
|
||||
}
|
||||
|
||||
if [[ $(uname -a) = (#i)*darwin* ]] {
|
||||
typeset -gA FAST_HIGHLIGHT
|
||||
FAST_HIGHLIGHT[chroma-man]=
|
||||
}
|
||||
|
||||
[[ $COLORTERM == (24bit|truecolor) || ${terminfo[colors]} -eq 16777216 ]] || zmodload zsh/nearcolor &>/dev/null
|
|
@ -0,0 +1,385 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (c) 2018, 2019 Philippe Troin (F-i-f on GitHub)
|
||||
#
|
||||
# Theme support using ini-files.
|
||||
#
|
||||
|
||||
zmodload zsh/zutil 2>/dev/null
|
||||
|
||||
emulate -LR zsh
|
||||
setopt extendedglob typesetsilent warncreateglobal
|
||||
autoload colors; colors
|
||||
|
||||
typeset -g FAST_WORK_DIR
|
||||
: ${FAST_WORK_DIR:=$FAST_BASE_DIR}
|
||||
FAST_WORK_DIR=${~FAST_WORK_DIR}
|
||||
|
||||
local -A map
|
||||
map=( "XDG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/"
|
||||
"LOCAL:" "/usr/local/share/fsh/"
|
||||
"HOME:" "$HOME/.fsh/"
|
||||
"OPT:" "/opt/local/share/fsh/"
|
||||
)
|
||||
|
||||
FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(XDG|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/}
|
||||
|
||||
local OPT_HELP OPT_VERBOSE OPT_QUIET OPT_RESET OPT_LIST OPT_TEST OPT_SECONDARY OPT_SHOW OPT_COPY OPT_OV_RESET
|
||||
local OPT_PALETTE OPT_CDWD OPT_XCHG OPT_OV_XCHG
|
||||
local -A opthash
|
||||
zparseopts -E -D -A opthash h -help v -verbose q -quiet r -reset l -list t -test -secondary \
|
||||
s -show -copy-shipped-theme: R -ov-reset p -palette w -workdir \
|
||||
x -xchg y -ov-xchg || \
|
||||
{ echo "Improper options given, see help (-h/--help)"; return 1; }
|
||||
|
||||
(( ${+opthash[-h]} + ${+opthash[--help]} )) && OPT_HELP="-h"
|
||||
(( ${+opthash[-v]} + ${+opthash[--verbose]} )) && OPT_VERBOSE="-v"
|
||||
(( ${+opthash[-q]} + ${+opthash[--quiet]} )) && OPT_QUIET="-q"
|
||||
(( ${+opthash[-r]} + ${+opthash[--reset]} )) && OPT_RESET="-r"
|
||||
(( ${+opthash[-l]} + ${+opthash[--list]} )) && OPT_LIST="-l"
|
||||
(( ${+opthash[-t]} + ${+opthash[--test]} )) && OPT_TEST="-t"
|
||||
(( ${+opthash[--secondary]} )) && OPT_SECONDARY="--secondary"
|
||||
(( ${+opthash[-s]} + ${+opthash[--show]} )) && OPT_SHOW="-s"
|
||||
(( ${+opthash[--copy-shipped-theme]} )) && OPT_COPY="${opthash[--copy-shipped-theme]}"
|
||||
(( ${+opthash[-R]} + ${+opthash[--ov-reset]} )) && OPT_OV_RESET="-R"
|
||||
(( ${+opthash[-p]} + ${+opthash[--palette]} )) && OPT_PALETTE="-p"
|
||||
(( ${+opthash[-w]} + ${+opthash[--workdir]} )) && OPT_CDWD="-w"
|
||||
(( ${+opthash[-x]} + ${+opthash[--xchg]} )) && OPT_XCHG="-x"
|
||||
(( ${+opthash[-y]} + ${+opthash[--ov-xchg]} )) && OPT_OV_XCHG="-y"
|
||||
|
||||
local -a match mbegin mend
|
||||
local MATCH; integer MBEGIN MEND
|
||||
|
||||
[[ -n "$OPT_CDWD" ]] && {
|
||||
builtin cd $FAST_WORK_DIR
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ -n "$OPT_PALETTE" ]] && {
|
||||
local n
|
||||
local -a __colors
|
||||
for n in {000..255}
|
||||
do
|
||||
__colors+=("%F{$n}$n%f")
|
||||
done
|
||||
print -cP $__colors
|
||||
return
|
||||
}
|
||||
|
||||
[[ -n "$OPT_SHOW" ]] && {
|
||||
print -r -- "Currently active theme: ${fg_bold[yellow]}$FAST_THEME_NAME$reset_color"
|
||||
( source "$FAST_WORK_DIR"/current_theme.zsh 2>/dev/null && print "Main theme (loaded at startup of a session): ${fg_bold[yellow]}$FAST_THEME_NAME$reset_color" || print "No main theme is set"; )
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ -n "$OPT_COPY" ]] && {
|
||||
[[ ! -f "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' doesn't exist in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; }
|
||||
[[ ! -r "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' isn't readable in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; }
|
||||
[[ -n "$1" ]] && {
|
||||
[[ ! -e "$1" && ! -e ${1:h} ]] && { print "Destination path doesn't exist, aborting"; return 1; }
|
||||
}
|
||||
command cp -vf "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" "${${1:-.}%.ini}.ini" || return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ -n "$OPT_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/{current_theme.zsh,secondary_theme.zsh}; [[ -z "$OPT_QUIET" ]] && print "Reset done (no theme is now set, restart is required)"; return 0; }
|
||||
|
||||
[[ -n "$OPT_OV_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/theme_overlay.zsh; [[ -z "$OPT_QUIET" ]] && print "Overlay-reset done, it is inactive (restart is required)"; return 0; }
|
||||
|
||||
[[ -n "$OPT_LIST" ]] && {
|
||||
[[ -z "$OPT_QUIET" ]] && print -r -- "Available themes:"
|
||||
print -rl -- "$FAST_BASE_DIR"/themes/*.ini(:t:r)
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ -n "$OPT_HELP" ]] && {
|
||||
print -r -- "Usage: fast-theme [-h/--help] [-v/--verbose] [-q/--quiet] [-t/--test] <theme-name|theme-path>"
|
||||
print -r -- " fast-theme [-r/--reset] [-l/--list] [-s/--show] [-p/--palette] [-w/--workdir]"
|
||||
print -r -- " fast-theme --copy-shipped-theme {theme-name} [destination-path]"
|
||||
print -r -- ""
|
||||
print -r -- "Default action (after providing <theme-name> or <theme-path>) is to switch"
|
||||
print -r -- "current session and any future sessions to the new theme. Using <theme-path>,"
|
||||
print -r -- "i.e.: a path to an ini file means using custom, own theme. The path can use an"
|
||||
print -r -- "\"XDG:\" shorthand (e.g.: \"XDG:mytheme\") that will point to ~/.config/fsh/<theme>.ini"
|
||||
print -r -- "(or \$XDG_CONFIG_HOME/fsh/<theme>.ini in general if the variable is set in the"
|
||||
print -r -- "environment). If the INI file pointed in the path is \"*overlay*\", then it is"
|
||||
print -r -- "not a full theme, but an additional theme-snippet that overwrites only selected"
|
||||
print -r -- "styles of the main theme."
|
||||
print -r -- ""
|
||||
print -r -- "Other path-shorthands:"
|
||||
print -r -- "LOCAL: = /usr/local/share/fsh/"
|
||||
print -r -- "HOME: = $HOME/.fsh/"
|
||||
print -r -- "OPT: = /opt/local/share/fsh/"
|
||||
print -r -- ""
|
||||
print -r -- "-r/--reset - unset any theme, use default highlighting (requires restart)"
|
||||
print -r -- "-R/--ov-reset - unset overlay, use styles only from main-theme (requires restart)"
|
||||
print -r -- "-l/--list - list names of available themes"
|
||||
print -r -- "-t/--test - show test block of code after switching theme"
|
||||
print -r -- "-s/--show - get and display the theme currently being set"
|
||||
print -r -- "-p/--palette - just print all 256 colors and exit (useful when creating a theme)"
|
||||
print -r -- "-w/--workdir - cd into \$FAST_WORK_DIR (if not set, then into the plugin directory)"
|
||||
print -r -- "-v/--verbose - more messages during operation"
|
||||
print -r -- "-q/--quiet - no default messages"
|
||||
print -r -- ""
|
||||
print -r -- "The option --copy-shipped-theme allows easy copying of one of the 6 shipped"
|
||||
print -r -- "themes into given destination path. Normal use means changing directory to"
|
||||
print -r -- "e.g.: ~/.config/fsh, and then issuing e.g.: \`fast-theme --copy-shipped-theme"
|
||||
print -r -- "clean mytheme', to obtain a template for own new theme."
|
||||
return 0
|
||||
}
|
||||
|
||||
[[ -z "$1" ]] && { print -u2 "Provide a theme (its name or path to its file) to switch to, aborting (see -h/--help)"; return 1; }
|
||||
|
||||
# FAST_HIGHLIGHT_STYLES key onto ini-file key
|
||||
map=(
|
||||
default "-"
|
||||
unknown-token "-"
|
||||
reserved-word "-"
|
||||
subcommand "- reserved-word"
|
||||
alias "- command builtin"
|
||||
suffix-alias "- alias command builtin"
|
||||
builtin "-"
|
||||
function "- builtin command"
|
||||
command "-"
|
||||
precommand "- command"
|
||||
commandseparator "-"
|
||||
hashed-command "- command"
|
||||
path "-"
|
||||
path_pathseparator "pathseparator"
|
||||
globbing "- back-or-dollar-double-quoted-argument" # fallback: variable in string "text $var text"
|
||||
globbing-ext "- double-quoted-argument" # fallback: the string "abc..."
|
||||
history-expansion "-"
|
||||
single-hyphen-option "- single-quoted-argument"
|
||||
double-hyphen-option "- double-quoted-argument"
|
||||
back-quoted-argument "-"
|
||||
single-quoted-argument "-"
|
||||
double-quoted-argument "-"
|
||||
dollar-quoted-argument "-"
|
||||
back-or-dollar-double-quoted-argument "- back-dollar-quoted-argument"
|
||||
back-dollar-quoted-argument "- back-or-dollar-double-quoted-argument"
|
||||
assign "- reserved-word"
|
||||
redirection "- reserved-word"
|
||||
comment "-"
|
||||
variable "-"
|
||||
mathvar "- forvar variable"
|
||||
mathnum "- fornum"
|
||||
matherr "- incorrect-subtle"
|
||||
assign-array-bracket "-"
|
||||
for-loop-variable "forvar mathvar variable"
|
||||
for-loop-number "fornum mathnum"
|
||||
for-loop-operator "foroper reserved-word"
|
||||
for-loop-separator "forsep commandseparator"
|
||||
exec-descriptor "- reserved-word"
|
||||
here-string-tri "-"
|
||||
here-string-text "- subtle-bg"
|
||||
here-string-var "- back-or-dollar-double-quoted-argument"
|
||||
secondary "-"
|
||||
recursive-base "- default"
|
||||
case-input "- variable"
|
||||
case-parentheses "- reserved-word"
|
||||
case-condition "- correct-subtle"
|
||||
correct-subtle "-"
|
||||
incorrect-subtle "-"
|
||||
subtle-separator "- commandseparator"
|
||||
subtle-bg "- correct-subtle"
|
||||
path-to-dir "- path"
|
||||
paired-bracket "- subtle-bg correct-subtle"
|
||||
bracket-level-1 "-"
|
||||
bracket-level-2 "-"
|
||||
bracket-level-3 "-"
|
||||
global-alias "- alias suffix-alias"
|
||||
single-sq-bracket "-"
|
||||
double-sq-bracket "-"
|
||||
double-paren "-"
|
||||
optarg-string "- double-quoted-argument"
|
||||
optarg-number "- mathnum"
|
||||
)
|
||||
|
||||
# In which order to generate entries
|
||||
local -a order
|
||||
order=(
|
||||
default unknown-token reserved-word alias suffix-alias builtin function command precommand
|
||||
commandseparator hashed-command path path_pathseparator globbing globbing-ext history-expansion
|
||||
single-hyphen-option double-hyphen-option back-quoted-argument single-quoted-argument
|
||||
double-quoted-argument dollar-quoted-argument back-or-dollar-double-quoted-argument
|
||||
back-dollar-quoted-argument assign redirection comment variable mathvar
|
||||
mathnum matherr assign-array-bracket for-loop-variable for-loop-number for-loop-operator
|
||||
for-loop-separator exec-descriptor here-string-tri here-string-text here-string-var secondary
|
||||
case-input case-parentheses case-condition correct-subtle incorrect-subtle subtle-separator subtle-bg
|
||||
path-to-dir paired-bracket bracket-level-1 bracket-level-2 bracket-level-3
|
||||
global-alias subcommand single-sq-bracket double-sq-bracket double-paren
|
||||
optarg-string optarg-number recursive-base
|
||||
)
|
||||
|
||||
[[ -n "$OPT_VERBOSE" ]] && print "Number of styles available for customization: ${#order}"
|
||||
|
||||
# Named colors
|
||||
local -a color
|
||||
color=( red green blue yellow cyan magenta black white default )
|
||||
|
||||
#
|
||||
# Execution starts here
|
||||
#
|
||||
|
||||
local -A out
|
||||
local THEME_NAME THEME_PATH="$1"
|
||||
if [[ "$1" = */* || "$1" = (XDG|LOCAL|HOME|OPT):* ]]; then
|
||||
1="${${1/(#s)XDG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini"
|
||||
1="${${1/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini"
|
||||
1="${${1/(#s)HOME:/$HOME/.fsh/}%.ini}.ini"
|
||||
1="${${1/(#s)OPT://opt/local/share/fsh/}%.ini}.ini"
|
||||
1=${~1} # allow user to quote ~
|
||||
|
||||
[[ ! -f "$1" ]] && { print -u2 "No such theme \`$1', aborting"; return 1; }
|
||||
[[ ! -r "$1" ]] && { print -u2 "Theme \`$1' unreadable, aborting"; return 1; }
|
||||
|
||||
THEME_NAME="${1:t:r}"
|
||||
.fast-read-ini-file "$1" out ""
|
||||
else
|
||||
[[ ! -f "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "No such theme \`$1', aborting"; return 1; }
|
||||
[[ ! -r "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "Theme \`$1' unreadable, aborting"; return 1; }
|
||||
|
||||
THEME_NAME="$1"
|
||||
.fast-read-ini-file "$FAST_BASE_DIR/themes/$1.ini" out ""
|
||||
fi
|
||||
|
||||
[[ -z "$OPT_SECONDARY" ]] && { [[ "$THEME_NAME" = *"overlay"* ]] && local outfile="theme_overlay.zsh" || local outfile="current_theme.zsh"; } || local outfile="secondary_theme.zsh"
|
||||
[[ -z "$OPT_XCHG" && -z "$OPT_OV_XCHG" ]] && command rm -f "$FAST_WORK_DIR"/"$outfile"
|
||||
|
||||
# Set a zstyle and a parameter to carry theme name
|
||||
if [[ -z "$OPT_SECONDARY" && -z "$OPT_XCHG" && -z "$OPT_OV_XCHG" ]]; then
|
||||
[[ "$THEME_NAME" != *"overlay"* ]] && {
|
||||
print -r -- 'zstyle :plugin:fast-syntax-highlighting theme "'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile"
|
||||
print -r -- 'typeset -g FAST_THEME_NAME="'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile"
|
||||
zstyle :plugin:fast-syntax-highlighting theme "$THEME_NAME"
|
||||
typeset -g FAST_THEME_NAME="$THEME_NAME"
|
||||
}
|
||||
elif [[ -z "$OPT_XCHG" && -z "$OPT_OV_XCHG" ]]; then
|
||||
local FAST_THEME_NAME="$THEME_NAME"
|
||||
fi
|
||||
|
||||
# Store from which file the theme or overlay is being loaded
|
||||
[[ "$THEME_NAME" != *"overlay" && -z "$OPT_OV_XCHG" ]] && FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}-path]="$THEME_PATH" || FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}-ov-path]="$THEME_PATH"
|
||||
|
||||
# Generate current_theme.zsh or secondary_theme.zsh, traversing ini-file associative array
|
||||
local k kk
|
||||
local inikey inival result result2 first_val isbg
|
||||
integer ov_counter=0 first
|
||||
for k in "${order[@]}"; do
|
||||
first=1
|
||||
for kk in ${(s. .)map[$k]} default; do
|
||||
[[ "$kk" = "-" ]] && kk="$k"
|
||||
(( first )) && first_val="$kk"
|
||||
inikey="${out[(i)<*>_${kk}]}"
|
||||
[[ -n "$inikey" ]] && {
|
||||
(( !first )) && [[ -z "$OPT_QUIET" ]] && {
|
||||
[[ $kk = default ]] && {
|
||||
[[ "$THEME_NAME" != *"overlay"* ]] && print "Missing style: $first_val"
|
||||
} || print "For style $first_val, went for fallback style $kk"
|
||||
}
|
||||
break
|
||||
}
|
||||
first=0
|
||||
[[ "$THEME_NAME" = *"overlay"* ]] && break
|
||||
done
|
||||
|
||||
# ORIG: Clear orig-style when loading a new theme, not overlay
|
||||
[[ -z "$OPT_OV_XCHG" ]] && unset "FAST_HIGHLIGHT_STYLES[orig-style-$k]"
|
||||
# ORIG: Restore orig-style when loading a new overlay
|
||||
[[ -n "$OPT_OV_XCHG" && -n "${FAST_HIGHLIGHT_STYLES[orig-style-$k]}" ]] && { FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}$k]="${FAST_HIGHLIGHT_STYLES[orig-style-$k]}"; unset "FAST_HIGHLIGHT_STYLES[orig-style-$k]"; }
|
||||
# Set only the keys provided in theme
|
||||
[[ -z "$inikey" ]] && { [[ -z "$OPT_QUIET" && "$THEME_NAME" != *"overlay"* ]] && print "Missing style $first_val"; continue; }
|
||||
|
||||
inival="${out[$inikey]}"
|
||||
if [[ "$k" = "secondary" && -z "$OPT_SECONDARY" && -n "$inival" ]]; then
|
||||
fast-theme -q --secondary "$inival"
|
||||
fi
|
||||
|
||||
result=""
|
||||
if [[ $k = secondary ]]; then
|
||||
result="$inival"
|
||||
else
|
||||
for kk in ${(s:,:)inival}
|
||||
do
|
||||
if [[ $kk = (none|(no-|)(bold|blink|conceal|reverse|standout|underline)) ]]; then
|
||||
result+="${result:+,}$kk"
|
||||
else
|
||||
isbg=0
|
||||
if [[ $kk = bg:* ]]; then
|
||||
isbg=1
|
||||
kk=${kk#bg:}
|
||||
fi
|
||||
if [[ $kk = (${(~j:|:)color}) || $kk = [0-9]## || $kk = \#[0-9a-fA-F](#c6,6) ]]; then
|
||||
result+="${result:+,}"
|
||||
(( isbg )) && result+="bg=" || result+="fg="
|
||||
result+="$kk"
|
||||
else
|
||||
print "cannot parse style $k: unknown color or style element $kk"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "$THEME_NAME" = *"overlay"* || -n "$OPT_OV_XCHG" ]]; then
|
||||
(( ++ ov_counter ))
|
||||
[[ -z "$OPT_XCHG$OPT_OV_XCHG" ]] && print -r -- ': ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}'"$k"']::='"$result"'}' >>! "$FAST_WORK_DIR"/"$outfile"
|
||||
# ORIG: Save original value of the overwritten style
|
||||
FAST_HIGHLIGHT_STYLES[orig-style-$k]=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}$k]}
|
||||
# Overwrite theme's style
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}$k]="$result"
|
||||
else
|
||||
[[ -z "$OPT_XCHG$OPT_OV_XCHG" ]] && print -r -- ': ${FAST_HIGHLIGHT_STYLES['"${FAST_THEME_NAME}$k"']:='"$result"'}' >>! "$FAST_WORK_DIR"/"$outfile"
|
||||
FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}$k]="$result"
|
||||
fi
|
||||
done
|
||||
|
||||
# This can overwrite some of *_STYLES fields
|
||||
# Re-apply overlay on top of the theme we switched to
|
||||
[[ "$THEME_NAME" != *"overlay"* ]] && [[ -r "$FAST_WORK_DIR"/theme_overlay.zsh ]] && source "$FAST_WORK_DIR"/theme_overlay.zsh
|
||||
|
||||
zcompile $FAST_WORK_DIR/$outfile 2>/dev/null
|
||||
|
||||
[[ -z "$OPT_QUIET" ]] && {
|
||||
if [[ "$THEME_NAME" != *"overlay"* ]]; then
|
||||
print "Switched to theme \`$THEME_NAME' (current session, and future sessions)" || \
|
||||
else
|
||||
print "Processed the overlay ($ov_counter keys found), it is now active (for current session, and future sessions)"
|
||||
fi
|
||||
}
|
||||
|
||||
[[ -n "$OPT_TEST" ]] && {
|
||||
print -zr '
|
||||
# Subshell, assignments, math-mode
|
||||
echo $(cat /etc/hosts |& grep -i "hello337")
|
||||
local param1="text ${+variable[test]} text ${var} text"; typeset param2='"'"'other $variable'"'"'
|
||||
math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 ))
|
||||
|
||||
# Programming-like usage, bracket matching - through distinct colors; note the backslash quoting
|
||||
for (( ii = 1; ii <= size; ++ ii )); do
|
||||
if [[ "${cmds[ii]} string" = "| string" ]]
|
||||
then
|
||||
sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening cmd-subst
|
||||
(( sidx <= len + 100 )) && {
|
||||
eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing cmd-subst
|
||||
}
|
||||
fi
|
||||
done
|
||||
|
||||
# Regular command-line usage
|
||||
repeat 0 {
|
||||
zsh -i -c "cat /etc/shells* | grep -x --line-buffered -i '"'/bin/zsh'"'"
|
||||
builtin exit $return_value
|
||||
fast-theme -tq default
|
||||
fsh-alias -tq default-X # alias '"'"'fsh-alias=fast-theme'"'"' works just like the previous line
|
||||
command -v git | grep ".+git" && echo $'"'"'Git is installed'"'"'
|
||||
git checkout -m --ours /etc/shells && git status-X
|
||||
gem install asciidoctor
|
||||
cat <<<$PATH | tr : \\n > /dev/null 2>/usr/local
|
||||
man -a fopen fopen-X
|
||||
CFLAGS="-g -Wall -O0" ./configure
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
return 0
|
||||
# vim:ft=zsh:et:sw=4:sts=4
|
After Width: | Height: | Size: 164 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 151 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 6.3 KiB |
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 4.8 KiB |
|
@ -0,0 +1,61 @@
|
|||
: ${FAST_HIGHLIGHT_STYLES[freedefault]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeunknown-token]:=fg=red,bold}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freereserved-word]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freealias]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesuffix-alias]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freebuiltin]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freefunction]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecommand]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeprecommand]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecommandseparator]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freehashed-command]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freepath]:=fg=166}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freepath_pathseparator]:=}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeglobbing]:=fg=112}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeglobbing-ext]:=fg=118}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freehistory-expansion]:=fg=blue,bold}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesingle-hyphen-option]:=fg=110}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freedouble-hyphen-option]:=fg=110}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeback-quoted-argument]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesingle-quoted-argument]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freedouble-quoted-argument]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freedollar-quoted-argument]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeback-or-dollar-double-quoted-argument]:=fg=110}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeback-dollar-quoted-argument]:=fg=110}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeassign]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeredirection]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecomment]:=fg=black,bold}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freevariable]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freemathvar]:=fg=blue,bold}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freemathnum]:=fg=166}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freematherr]:=fg=red}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeassign-array-bracket]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freefor-loop-variable]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freefor-loop-number]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freefor-loop-operator]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freefor-loop-separator]:=fg=109}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeexec-descriptor]:=fg=yellow,bold}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freehere-string-tri]:=fg=yellow}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freehere-string-text]:=bg=19}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freehere-string-var]:=fg=110,bg=19}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesecondary]:=zdharma}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecase-input]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecase-parentheses]:=fg=116}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecase-condition]:=bg=19}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freecorrect-subtle]:=bg=55}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeincorrect-subtle]:=bg=52}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesubtle-separator]:=none}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesubtle-bg]:=bg=18}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freepath-to-dir]:=fg=166,underline}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freepaired-bracket]:=bg=blue}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freebracket-level-1]:=fg=130}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freebracket-level-2]:=fg=70}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freebracket-level-3]:=fg=69}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeglobal-alias]:=bg=19}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesubcommand]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freesingle-sq-bracket]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freedouble-sq-bracket]:=fg=180}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freedouble-paren]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeoptarg-string]:=fg=150}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freeoptarg-number]:=fg=166}
|
||||
: ${FAST_HIGHLIGHT_STYLES[freerecursive-base]:=fg=183}
|
|
@ -0,0 +1,220 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# This file runs the highlighter on a specified file
|
||||
# i.e. parses the file with the highlighter. Outputs
|
||||
# running time (stderr) and resulting region_highlight
|
||||
# (file parse.out, or $2 if given).
|
||||
#
|
||||
# Can be also run in line-wise mode on own input (-o
|
||||
# option in $1), no region_highlight file then.
|
||||
#
|
||||
|
||||
[[ -z "$ZSH_VERSION" ]] && exec /usr/bin/env /usr/local/bin/zsh-5.5.1 -f -c "source \"$0\" \"$1\" \"$2\" \"$3\""
|
||||
|
||||
ZERO="${(%):-%N}"
|
||||
|
||||
if [[ -e "${ZERO}/../fast-highlight" ]]; then
|
||||
source "${ZERO}/../fast-highlight"
|
||||
source "${ZERO}/../fast-string-highlight"
|
||||
fpath+=( "${ZERO}/.." )
|
||||
elif [[ -e "../fast-highlight" ]]; then
|
||||
source "../fast-highlight"
|
||||
source "../fast-string-highlight"
|
||||
fpath+=( "$PWD/.." )
|
||||
elif [[ -e "${ZERO}/fast-highlight" ]]; then
|
||||
source "${ZERO}/fast-highlight"
|
||||
source "${ZERO}/fast-string-highlight"
|
||||
fpath+=( "${ZERO}" )
|
||||
elif [[ -e "./fast-highlight" ]]; then
|
||||
source "./fast-highlight"
|
||||
source "./fast-string-highlight"
|
||||
fpath+=( "./" )
|
||||
else
|
||||
print -u2 "Could not find fast-highlight, aborting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
zmodload zsh/zprof
|
||||
autoload is-at-least chroma/-git.ch
|
||||
|
||||
setopt interactive_comments extendedglob
|
||||
|
||||
# Own input?
|
||||
if [[ "$1" = "-o" || "$1" = "-oo" || "$1" = "-ooo" || "$1" = "-git" || "$1" = "-hue" || "$1" = "-hol" ]]; then
|
||||
typeset -a input
|
||||
input=()
|
||||
if [[ "$1" = "-o" ]]; then
|
||||
input+=( "./parse.zsh ../fast-highlight parse2.out" )
|
||||
input+=( "rm -f parse*.out" )
|
||||
input+=( "./mh-parse.zsh ../fast-highlight > out" )
|
||||
input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" )
|
||||
input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" )
|
||||
input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' )
|
||||
input+=( 'func() { echo "a" >! phist2.db; echo "b" >>! phist2.db; fc -Rap "phist2.db"; list=( ${history[@]} ); echo "${history[1]}"; }' )
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
|
||||
elif [[ "$1" = "-oo" ]]; then
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
|
||||
elif [[ "$1" = "-ooo" ]]; then
|
||||
local in='
|
||||
# This is an example code that is diverse and allows to test a theme
|
||||
text="An example quite long string $with variable in it"
|
||||
local param1="text $variable" param2='"'"'other $variable'"'"'
|
||||
math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 ))
|
||||
|
||||
for (( ii = 1; ii <= size; ++ ii )); do
|
||||
if [[ "${cmds[ii]} string" = "| string" ]]
|
||||
then
|
||||
sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening $(
|
||||
(( sidx <= len )) && {
|
||||
eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing )
|
||||
}
|
||||
fi
|
||||
done'
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
||||
input+=( "$in" )
|
||||
input+=( "$in" )
|
||||
elif [[ "$1" = "-git" ]]; then
|
||||
local in="git lp
|
||||
git push origin master
|
||||
git commit
|
||||
git add safari.ini zdharma.ini
|
||||
git st .
|
||||
git diff --cached
|
||||
git commit --allow-empty
|
||||
git checkout themes/zdharma.ini
|
||||
git commit --amend
|
||||
git commit -m \"Example commit message\"
|
||||
git tag -a 'v1.18' -m 'Here-string is highlighted, descriptor-variables passed to exec are correctly highlighted'
|
||||
git tag -l -n9
|
||||
git checkout cb66b11
|
||||
"
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
||||
input+=( "$in" )
|
||||
input+=( "$in" )
|
||||
elif [[ "$1" = "-hue" ]]; then
|
||||
local in="var=\$other; local var=\$other
|
||||
() { eval \"\$var\"; }
|
||||
case \$other in
|
||||
\$var)
|
||||
( echo OK; )
|
||||
;;
|
||||
esac
|
||||
sudo -i -s ls -1 /var/log
|
||||
() { ( eval \"command ls -1\" ); } argument"
|
||||
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
||||
|
||||
input+=( "$in" "$in" )
|
||||
elif [[ "$1" = "-hol" ]]; then
|
||||
local in="var=\$( other )
|
||||
local var2=\$(( other + 1 ))
|
||||
() { eval \"\$var\"; }
|
||||
sudo -i -s ls -1 >/tmp/ls-log.txt /var/log
|
||||
IFS=\$'\\n' print -rl -- \$(command ls -1 | tee -a /tmp/ls-1.txt)
|
||||
var3=\$(( HISTSIZE + 10 + \$var ))
|
||||
local var4=\$( other command )
|
||||
touch \$(( HISTSIZE + \$SAVEHIST + 10 ))
|
||||
case \$other in
|
||||
\$var)
|
||||
( echo OK; )
|
||||
;;
|
||||
\$var3)
|
||||
( if { true } { noglob echo yes } )
|
||||
esac
|
||||
( builtin cd /var/log; ls -1; noglob cd \"/var/log\" 'log' )
|
||||
noglob cat <<<\"\$PATH\" | tr : \"\\n\"
|
||||
if [[ \"\$var\" -gt 10 ]]; then
|
||||
(( var = HISTSIZE + \$SAVEHIST ))
|
||||
fi
|
||||
/var/log
|
||||
sidx=\${buffer[(in:ii:)\\\$\\(?#[^\\\\\\\\]\\)]} # find opening cmd-subst
|
||||
{
|
||||
exec {MYFD}<&0 {MYFD2}>&1
|
||||
( read <&\$MYFD line; echo \$line >&\$MYFD2 && { builtin print \${match[1]}Written. } )
|
||||
} always {
|
||||
(( MYFD > 0 )) && { print -rl -- -myfd:\$MYFD >&\$MYFD2 && print \"Sent.\" '(to filedescriptor)'; }
|
||||
}
|
||||
command sleep \"\$(( \$a + b + \${cde} + \${(s::)fgh[ijk]} + \\\$l + \\m + \\\" ))\"
|
||||
for (( i = 0; i <= 2; ++ i )) { print \$i; }
|
||||
"
|
||||
|
||||
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
|
||||
|
||||
input+=( "$in" )
|
||||
fi
|
||||
|
||||
typeset -a long_input
|
||||
integer i
|
||||
for (( i=1; i<= 50; i ++ )); do
|
||||
long_input+=( "${input[@]}" )
|
||||
done
|
||||
|
||||
typeset -F SECONDS
|
||||
SECONDS=0
|
||||
|
||||
local right_brace_is_recognised_everywhere
|
||||
integer path_dirs_was_set multi_func_def ointeractive_comments
|
||||
-fast-highlight-fill-option-variables
|
||||
|
||||
local BUFFER
|
||||
for BUFFER in "${long_input[@]}"; do
|
||||
reply=( )
|
||||
() {
|
||||
-fast-highlight-init
|
||||
-fast-highlight-process "" "$BUFFER" "0"
|
||||
-fast-highlight-string-process "" "$BUFFER"
|
||||
}
|
||||
done
|
||||
|
||||
print "Running time: $SECONDS"
|
||||
zprof | head
|
||||
# File input?
|
||||
elif [[ -r "$1" ]]; then
|
||||
# Load from given file
|
||||
local BUFFER="$(<$1)"
|
||||
|
||||
typeset -F SECONDS
|
||||
SECONDS=0
|
||||
|
||||
reply=( )
|
||||
-fast-highlight-init
|
||||
|
||||
local right_brace_is_recognised_everywhere
|
||||
integer path_dirs_was_set multi_func_def ointeractive_comments
|
||||
-fast-highlight-fill-option-variables
|
||||
|
||||
() {
|
||||
-fast-highlight-process "" "$BUFFER" "0"
|
||||
-fast-highlight-string-process "" "$BUFFER"
|
||||
}
|
||||
|
||||
print "Running time: $SECONDS"
|
||||
zprof | head
|
||||
|
||||
# This output can be diffed to detect changes in operation
|
||||
if [[ -z "$2" ]]; then
|
||||
print -rl -- "${reply[@]}" >! out.parse
|
||||
else
|
||||
print -rl -- "${reply[@]}" >! "$2"
|
||||
fi
|
||||
else
|
||||
if [[ -z "$1" ]]; then
|
||||
print -u2 "Usage: ./parse.zsh {to-parse file} [region_highlight output file]"
|
||||
exit 2
|
||||
else
|
||||
print -u2 "Unreadable to-parse file \`$1', aborting"
|
||||
exit 3
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
# vim:ft=zsh
|
|
@ -0,0 +1,823 @@
|
|||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2010-2016 zsh-syntax-highlighting contributors
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
# provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice, this list of conditions
|
||||
# and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice, this list of
|
||||
# conditions and the following disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software without specific prior
|
||||
# written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
|
||||
# vim: ft=zsh sw=2 ts=2 et
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
typeset -gA __hsmw_highlight_main__command_type_cache
|
||||
|
||||
# Define default styles.
|
||||
typeset -gA HSMW_HIGHLIGHT_STYLES
|
||||
: ${HSMW_HIGHLIGHT_STYLES[default]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[unknown-token]:=fg=red,bold}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[reserved-word]:=fg=yellow}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[alias]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[suffix-alias]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[builtin]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[function]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[command]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[precommand]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[commandseparator]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[hashed-command]:=fg=green}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[path]:=fg=magenta}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[path_pathseparator]:=}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[path_prefix]:=fg=magenta}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[globbing]:=fg=blue,bold}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[history-expansion]:=fg=blue,bold}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[single-hyphen-option]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[double-hyphen-option]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[back-quoted-argument]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[single-quoted-argument]:=fg=yellow}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[double-quoted-argument]:=fg=yellow}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[dollar-quoted-argument]:=fg=yellow}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[dollar-double-quoted-argument]:=fg=cyan}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[back-double-quoted-argument]:=fg=cyan}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[back-dollar-quoted-argument]:=fg=cyan}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[assign]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[redirection]:=none}
|
||||
: ${HSMW_HIGHLIGHT_STYLES[comment]:=fg=black,bold}
|
||||
|
||||
# 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() {
|
||||
if (( $+__hsmw_highlight_main__command_type_cache )); then
|
||||
REPLY=$__hsmw_highlight_main__command_type_cache[(e)$1]
|
||||
if [[ -n "$REPLY" ]]; then
|
||||
return
|
||||
fi
|
||||
fi
|
||||
if (( $#options_to_set )); then
|
||||
setopt localoptions $options_to_set;
|
||||
fi
|
||||
unset REPLY
|
||||
if zmodload -e zsh/parameter; then
|
||||
if (( $+aliases[(e)$1] )); then
|
||||
REPLY=alias
|
||||
elif (( $+saliases[(e)${1##*.}] )); then
|
||||
REPLY='suffix alias'
|
||||
elif (( $reswords[(Ie)$1] )); then
|
||||
REPLY=reserved
|
||||
elif (( $+functions[(e)$1] )); then
|
||||
REPLY=function
|
||||
elif (( $+builtins[(e)$1] )); then
|
||||
REPLY=builtin
|
||||
elif (( $+commands[(e)$1] )); then
|
||||
REPLY=command
|
||||
# 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 $(x) below, incurring a fork. (Issue #354.)
|
||||
#
|
||||
# The second 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
|
||||
REPLY=none
|
||||
fi
|
||||
fi
|
||||
if ! (( $+REPLY )); then
|
||||
REPLY="${$(LC_ALL=C builtin type -w -- $1 2>/dev/null)#*: }"
|
||||
fi
|
||||
if (( $+__hsmw_highlight_main__command_type_cache )); then
|
||||
__hsmw_highlight_main__command_type_cache[(e)$1]=$REPLY
|
||||
fi
|
||||
}
|
||||
|
||||
# Check whether the first argument is a redirection operator token.
|
||||
# Report result via the exit code.
|
||||
-hsmw-highlight-is-redirection() {
|
||||
# A redirection operator token:
|
||||
# - starts with an optional single-digit number;
|
||||
# - then, has a '<' or '>' character;
|
||||
# - is not a process substitution [<(...) or >(...)].
|
||||
[[ $1 == (<0-9>|)(\<|\>)* ]] && [[ $1 != (\<|\>)$'\x28'* ]]
|
||||
}
|
||||
|
||||
# Resolve alias.
|
||||
#
|
||||
# Takes a single argument.
|
||||
#
|
||||
# The result will be stored in REPLY.
|
||||
-hsmw-highlight-resolve-alias() {
|
||||
if zmodload -e zsh/parameter; then
|
||||
REPLY=${aliases[$arg]}
|
||||
else
|
||||
REPLY="${"$(alias -- $arg)"#*=}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check that the top of $braces_stack has the expected value. If it does, set
|
||||
# the style according to $2; otherwise, set style=unknown-token.
|
||||
#
|
||||
# $1: character expected to be at the top of $braces_stack
|
||||
# $2: assignment to execute it if matches
|
||||
-hsmw-highlight-stack-pop() {
|
||||
if [[ $braces_stack[1] == $1 ]]; then
|
||||
braces_stack=${braces_stack:1}
|
||||
eval "$2"
|
||||
else
|
||||
style=unknown-token
|
||||
fi
|
||||
}
|
||||
|
||||
# Main syntax highlighting function.
|
||||
-hsmw-highlight-process()
|
||||
{
|
||||
## Before we even 'emulate -L', we must test a few options that would reset.
|
||||
if [[ -o interactive_comments ]]; then
|
||||
local interactive_comments= # set to empty
|
||||
fi
|
||||
if [[ -o ignore_braces ]] || eval '[[ -o ignore_close_braces ]] 2>/dev/null'; then
|
||||
local right_brace_is_recognised_everywhere=false
|
||||
else
|
||||
local right_brace_is_recognised_everywhere=true
|
||||
fi
|
||||
if [[ -o path_dirs ]]; then
|
||||
integer path_dirs_was_set=1
|
||||
else
|
||||
integer path_dirs_was_set=0
|
||||
fi
|
||||
if [[ -o multi_func_def ]]; then
|
||||
integer multi_func_def=1
|
||||
else
|
||||
integer multi_func_def=0
|
||||
fi
|
||||
emulate -L zsh
|
||||
setopt localoptions extendedglob bareglobqual
|
||||
|
||||
## Variable declarations and initializations
|
||||
local start_pos=0 end_pos highlight_glob=true arg style
|
||||
local in_array_assignment=false # true between 'a=(' and the matching ')'
|
||||
typeset -a __HSMW_HIGHLIGHT_TOKENS_COMMANDSEPARATOR
|
||||
typeset -a __HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS
|
||||
typeset -a __HSMW_HIGHLIGHT_TOKENS_CONTROL_FLOW
|
||||
local -a options_to_set # used in callees
|
||||
local buf="$1"
|
||||
integer len="${#buf}"
|
||||
integer pure_buf_len=len # historical, was $#BUFFER, i.e. len without $PREBUFFER; used e.g. in *_check_path
|
||||
|
||||
local braces_stack # "R" for round, "Q" for square, "Y" for curly
|
||||
|
||||
if (( path_dirs_was_set )); then
|
||||
options_to_set+=( PATH_DIRS )
|
||||
fi
|
||||
unset path_dirs_was_set
|
||||
|
||||
__HSMW_HIGHLIGHT_TOKENS_COMMANDSEPARATOR=(
|
||||
'|' '||' ';' '&' '&&'
|
||||
'|&'
|
||||
'&!' '&|'
|
||||
# ### 'case' syntax, but followed by a pattern, not by a command
|
||||
# ';;' ';&' ';|'
|
||||
)
|
||||
__HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS=(
|
||||
'builtin' 'command' 'exec' 'nocorrect' 'noglob'
|
||||
'pkexec' # immune to #121 because it's usually not passed --option flags
|
||||
)
|
||||
|
||||
# Tokens that, at (naively-determined) "command position", are followed by
|
||||
# a de jure command position. All of these are reserved words.
|
||||
__HSMW_HIGHLIGHT_TOKENS_CONTROL_FLOW=(
|
||||
$'\x7b' # block
|
||||
$'\x28' # subshell
|
||||
'()' # anonymous function
|
||||
'while'
|
||||
'until'
|
||||
'if'
|
||||
'then'
|
||||
'elif'
|
||||
'else'
|
||||
'do'
|
||||
'time'
|
||||
'coproc'
|
||||
'!' # reserved word; unrelated to $histchars[1]
|
||||
)
|
||||
|
||||
local -a match mbegin mend
|
||||
|
||||
# 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.
|
||||
#
|
||||
local this_word=':start:' next_word
|
||||
integer in_redirection
|
||||
# Processing buffer
|
||||
local proc_buf="$buf"
|
||||
for arg in ${interactive_comments-${(z)buf}} \
|
||||
${interactive_comments+${(zZ+c+)buf}}; do
|
||||
# Initialize $next_word.
|
||||
if (( in_redirection )); then
|
||||
(( --in_redirection ))
|
||||
fi
|
||||
if (( in_redirection == 0 )); then
|
||||
# Initialize $next_word to its default value.
|
||||
next_word=':regular:'
|
||||
else
|
||||
# Stall $next_word.
|
||||
fi
|
||||
|
||||
# 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.
|
||||
integer already_added=0
|
||||
style=unknown-token
|
||||
if [[ $this_word == *':start:'* ]]; then
|
||||
in_array_assignment=false
|
||||
if [[ $arg == 'noglob' ]]; then
|
||||
highlight_glob=false
|
||||
fi
|
||||
fi
|
||||
|
||||
# Compute the new $start_pos and $end_pos, skipping over whitespace in $buf.
|
||||
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 ))
|
||||
(( 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:]]|\\[[:space:]])##)* ]]; 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]}"
|
||||
|
||||
# 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 [[ $this_word == *(':regular:'|':start:')* ]]; then
|
||||
style=comment
|
||||
else
|
||||
style=unknown-token # prematurely terminated
|
||||
fi
|
||||
-hsmw-add-highlight $start_pos $end_pos $style
|
||||
already_added=1
|
||||
continue
|
||||
fi
|
||||
|
||||
# Analyse the current word.
|
||||
if -hsmw-highlight-is-redirection $arg ; then
|
||||
# A '<' or '>', possibly followed by a digit
|
||||
in_redirection=2
|
||||
fi
|
||||
|
||||
# Special-case the first word after 'sudo'.
|
||||
if (( ! in_redirection )); then
|
||||
if [[ $this_word == *':sudo_opt:'* ]] && [[ $arg != -* ]]; then
|
||||
this_word=${this_word//:sudo_opt:/}
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parse the sudo command line
|
||||
if (( ! in_redirection )); then
|
||||
if [[ $this_word == *':sudo_opt:'* ]]; then
|
||||
case "$arg" in
|
||||
# Flag that requires an argument
|
||||
'-'[Cgprtu]) this_word=${this_word//:start:/};
|
||||
next_word=':sudo_arg:';;
|
||||
# This prevents misbehavior with sudo -u -otherargument
|
||||
'-'*) this_word=${this_word//:start:/};
|
||||
next_word+=':start:';
|
||||
next_word+=':sudo_opt:';;
|
||||
*) ;;
|
||||
esac
|
||||
elif [[ $this_word == *':sudo_arg:'* ]]; then
|
||||
next_word+=':sudo_opt:'
|
||||
next_word+=':start:'
|
||||
fi
|
||||
fi
|
||||
|
||||
# The Great Fork: is this a command word? Is this a non-command word?
|
||||
if [[ $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 [[ $this_word == *':start:'* ]] && (( in_redirection == 0 )); then # $arg is the command word
|
||||
if [[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS:#"$arg"} ]]; then
|
||||
style=precommand
|
||||
elif [[ "$arg" = "sudo" ]]; then
|
||||
style=precommand
|
||||
next_word=${next_word//:regular:/}
|
||||
next_word+=':sudo_opt:'
|
||||
next_word+=':start:'
|
||||
else
|
||||
-hsmw-highlight-expand-path $arg
|
||||
local expanded_arg="$REPLY"
|
||||
-hsmw-highlight-main-type ${expanded_arg}
|
||||
local res="$REPLY"
|
||||
() {
|
||||
# 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.
|
||||
local -a match mbegin mend
|
||||
local MATCH; integer MBEGIN MEND
|
||||
if [[ $res == none ]] && (( ${+parameters} )) &&
|
||||
[[ ${arg[1]} == \$ ]] && [[ ${arg:1} = ([[:alpha:]_][[:alnum:]_]#|[[:digit:]]##) ]] &&
|
||||
(( ${+parameters[${MATCH}]} ))
|
||||
then
|
||||
-hsmw-highlight-main-type ${(P)MATCH}
|
||||
res=$REPLY
|
||||
fi
|
||||
}
|
||||
case $res in
|
||||
reserved) # reserved word
|
||||
style=reserved-word
|
||||
if [[ $arg == $'\x7b' ]]; then
|
||||
braces_stack='Y'"$braces_stack"
|
||||
elif [[ $arg == $'\x7d' ]]; then
|
||||
# We're at command word, so no need to check $right_brace_is_recognised_everywhere
|
||||
-hsmw-highlight-stack-pop 'Y' style=reserved-word
|
||||
if [[ $style == reserved-word ]]; then
|
||||
next_word+=':always:'
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
'suffix alias') style=suffix-alias;;
|
||||
alias) () {
|
||||
integer insane_alias
|
||||
case $arg 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
|
||||
else
|
||||
style=alias
|
||||
-hsmw-highlight-resolve-alias $arg
|
||||
local alias_target="$REPLY"
|
||||
[[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS:#"$alias_target"} && -z ${(M)__HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS:#"$arg"} ]] && __HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS+=($arg)
|
||||
fi
|
||||
}
|
||||
;;
|
||||
builtin) style=builtin;;
|
||||
function) style=function;;
|
||||
command) style=command;;
|
||||
hashed) style=hashed-command;;
|
||||
none) if -hsmw-highlight-check-assign; then
|
||||
style=assign
|
||||
if [[ $arg[-1] == '(' ]]; then
|
||||
in_array_assignment=true
|
||||
else
|
||||
# assignment to a scalar parameter.
|
||||
# (For array assignments, the command doesn't start until the ")" token.)
|
||||
next_word+=':start:'
|
||||
fi
|
||||
elif [[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
|
||||
style=history-expansion
|
||||
elif [[ $arg[0,1] == $histchars[2,2] ]]; then
|
||||
style=history-expansion
|
||||
elif [[ -n ${(M)__HSMW_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
|
||||
elif (( in_redirection == 2 )); then
|
||||
style=redirection
|
||||
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.
|
||||
style=reserved-word
|
||||
-hsmw-add-highlight $start_pos $((start_pos + 2)) $style
|
||||
already_added=1
|
||||
if [[ $arg[-2,-1] == '))' ]]; then
|
||||
-hsmw-add-highlight $((end_pos - 2)) $end_pos $style
|
||||
already_added=1
|
||||
fi
|
||||
elif [[ $arg == '()' ]]; then
|
||||
# anonymous function
|
||||
style=reserved-word
|
||||
elif [[ $arg == $'\x28' ]]; then
|
||||
# subshell
|
||||
style=reserved-word
|
||||
braces_stack='R'"$braces_stack"
|
||||
else
|
||||
if -hsmw-highlight-check-path; then
|
||||
style=$REPLY
|
||||
else
|
||||
style=unknown-token
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*) -hsmw-add-highlight $start_pos $end_pos commandtypefromthefuture-$res
|
||||
already_added=1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if (( ! already_added )) && [[ $style == unknown-token ]] && # not handled by the 'command word' codepath
|
||||
{ (( in_redirection )) || [[ $this_word == *':regular:'* ]] || [[ $this_word == *':sudo_opt:'* ]] || [[ $this_word == *':sudo_arg:'* ]] }
|
||||
then # $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:'
|
||||
else
|
||||
-hsmw-highlight-stack-pop 'R' style=reserved-word
|
||||
fi;;
|
||||
$'\x28\x29') # possibly a function definition
|
||||
if (( multi_func_def )) || false # TODO: or if the previous word was a command word
|
||||
then
|
||||
next_word+=':start:'
|
||||
fi
|
||||
style=reserved-word
|
||||
;;
|
||||
$'\x7d') # right brace
|
||||
#
|
||||
# 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 $right_brace_is_recognised_everywhere; then
|
||||
-hsmw-highlight-stack-pop 'Y' style=reserved-word
|
||||
if [[ $style == reserved-word ]]; then
|
||||
next_word+=':always:'
|
||||
fi
|
||||
else
|
||||
# Fall through to the catchall case at the end.
|
||||
fi
|
||||
;|
|
||||
'--'*) style=double-hyphen-option;;
|
||||
'-'*) style=single-hyphen-option;;
|
||||
"'"*) style=single-quoted-argument;;
|
||||
'"'*) style=double-quoted-argument
|
||||
-hsmw-add-highlight $start_pos $end_pos $style
|
||||
-hsmw-highlight-string
|
||||
already_added=1
|
||||
;;
|
||||
\$\'*) style=dollar-quoted-argument
|
||||
-hsmw-add-highlight $start_pos $end_pos $style
|
||||
-hsmw-highlight-dollar-string
|
||||
already_added=1
|
||||
;;
|
||||
'`'*) style=back-quoted-argument;;
|
||||
[*?]*|*[^\\][*?]*)
|
||||
$highlight_glob && style=globbing || style=default;;
|
||||
*) if false; then
|
||||
elif [[ $arg = $'\x7d' ]] && $right_brace_is_recognised_everywhere; then
|
||||
# was handled by the $'\x7d' case above
|
||||
elif [[ $arg[0,1] = $histchars[0,1] ]] && (( $#arg[0,2] == 2 )); then
|
||||
style=history-expansion
|
||||
elif [[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_COMMANDSEPARATOR:#"$arg"} ]]; then
|
||||
if [[ $this_word == *':regular:'* ]]; then
|
||||
style=commandseparator
|
||||
else
|
||||
style=unknown-token
|
||||
fi
|
||||
elif (( in_redirection == 2 )); then
|
||||
style=redirection
|
||||
else
|
||||
if -hsmw-highlight-check-path; then
|
||||
style=$REPLY
|
||||
else
|
||||
style=default
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
if ! (( already_added )); then
|
||||
-hsmw-add-highlight $start_pos $end_pos $style
|
||||
[[ $style == path || $style == path_prefix ]] && -hsmw-highlight-path-separators
|
||||
fi
|
||||
if [[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_COMMANDSEPARATOR:#"$arg"} ]]; then
|
||||
if [[ $arg == ';' ]] && $in_array_assignment; then
|
||||
# literal newline inside an array assignment
|
||||
next_word=':regular:'
|
||||
else
|
||||
next_word=':start:'
|
||||
highlight_glob=true
|
||||
fi
|
||||
elif
|
||||
[[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_CONTROL_FLOW:#"$arg"} && $this_word == *':start:'* ]] ||
|
||||
[[ -n ${(M)__HSMW_HIGHLIGHT_TOKENS_PRECOMMANDS:#"$arg"} && $this_word == *':start:'* ]]; then
|
||||
next_word=':start:'
|
||||
elif [[ $arg == "repeat" && $this_word == *':start:'* ]]; then
|
||||
# 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:'
|
||||
fi
|
||||
start_pos=$end_pos
|
||||
if (( in_redirection == 0 )); then
|
||||
# This is the default/common codepath.
|
||||
this_word=$next_word
|
||||
else
|
||||
# Stall $this_word.
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Check if $arg is variable assignment
|
||||
-hsmw-highlight-check-assign()
|
||||
{
|
||||
setopt localoptions extended_glob
|
||||
[[ $arg == [[:alpha:]_][[:alnum:]_]#(|\[*\])(|[+])=* ]] ||
|
||||
[[ $arg == [0-9]##(|[+])=* ]]
|
||||
}
|
||||
|
||||
-hsmw-highlight-path-separators()
|
||||
{
|
||||
local pos style_pathsep
|
||||
style_pathsep=${style}_pathseparator
|
||||
[[ -z "$HSMW_HIGHLIGHT_STYLES[$style_pathsep]" || "$HSMW_HIGHLIGHT_STYLES[$style]" == "$HSMW_HIGHLIGHT_STYLES[$style_pathsep]" ]] && return 0
|
||||
for (( pos = start_pos; $pos <= end_pos; pos++ )) ; do
|
||||
if [[ ${buf[pos]} == "/" ]]; then
|
||||
-hsmw-add-highlight $((pos - 1)) $pos $style_pathsep
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Check if $arg 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).
|
||||
-hsmw-highlight-check-path()
|
||||
{
|
||||
-hsmw-highlight-expand-path $arg;
|
||||
local expanded_path="$REPLY"
|
||||
|
||||
REPLY=path
|
||||
|
||||
[[ -z $expanded_path ]] && return 1
|
||||
[[ -L $expanded_path ]] && return 0
|
||||
[[ -e $expanded_path ]] && return 0
|
||||
|
||||
# Search the path in CDPATH
|
||||
local cdpath_dir
|
||||
for cdpath_dir in $cdpath ; do
|
||||
[[ -e "$cdpath_dir/$expanded_path" ]] && return 0
|
||||
done
|
||||
|
||||
# If dirname($arg) doesn't exist, neither does $arg.
|
||||
[[ ! -d ${expanded_path:h} ]] && return 1
|
||||
|
||||
# If this word ends the buffer, check if it's the prefix of a valid path.
|
||||
if [[ ${buf[1]} != "-" && $pure_buf_len == $end_pos ]]; then
|
||||
local -a tmp
|
||||
tmp=( ${expanded_path}*(N) )
|
||||
(( $#tmp > 0 )) && REPLY=path_prefix && return 0
|
||||
fi
|
||||
|
||||
# It's not a path.
|
||||
return 1
|
||||
}
|
||||
|
||||
# Highlight special chars inside double-quoted strings
|
||||
-hsmw-highlight-string()
|
||||
{
|
||||
setopt localoptions noksharrays
|
||||
local -a match mbegin mend
|
||||
local MATCH; integer MBEGIN MEND
|
||||
local i j k style
|
||||
# Starting quote is at 1, so start parsing at offset 2 in the string.
|
||||
for (( i = 2 ; i < end_pos - start_pos ; i += 1 )) ; do
|
||||
(( j = i + start_pos - 1 ))
|
||||
(( k = j + 1 ))
|
||||
case "$arg[$i]" in
|
||||
'$' ) style=dollar-double-quoted-argument
|
||||
# Look for an alphanumeric parameter name.
|
||||
if [[ ${arg:$i} = ([[:alpha:]_][[:alnum:]_]#|[[:digit:]]##) ]] ; then
|
||||
(( k += $#MATCH )) # highlight the parameter name
|
||||
(( i += $#MATCH )) # skip past it
|
||||
elif [[ ${arg:$i} = [{]([[:alpha:]_][[:alnum:]_]#|[[:digit:]]##)[}]* ]] ; then
|
||||
(( k += $#MATCH )) # highlight the parameter name and braces
|
||||
(( i += $#MATCH )) # skip past it
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
"\\") style=back-double-quoted-argument
|
||||
if [[ \\\`\"\$ == *$arg[$i+1]* ]]; then
|
||||
(( k += 1 )) # Color following char too.
|
||||
(( i += 1 )) # Skip parsing the escaped char.
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
*) continue ;;
|
||||
|
||||
esac
|
||||
-hsmw-add-highlight $j $k $style
|
||||
done
|
||||
}
|
||||
|
||||
# Highlight special chars inside dollar-quoted strings
|
||||
-hsmw-highlight-dollar-string()
|
||||
{
|
||||
setopt localoptions noksharrays
|
||||
local -a match mbegin mend
|
||||
local MATCH; integer MBEGIN MEND
|
||||
local i j k style
|
||||
local AA
|
||||
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
|
||||
(( j = i + start_pos - 1 ))
|
||||
(( k = j + 1 ))
|
||||
case "$arg[$i]" in
|
||||
"\\") style=back-dollar-quoted-argument
|
||||
for (( c = i + 1 ; c <= end_pos - start_pos ; c += 1 )); do
|
||||
[[ "$arg[$c]" != ([0-9xXuUa-fA-F]) ]] && break
|
||||
done
|
||||
AA=$arg[$i+1,$c-1]
|
||||
# Matching for HEX and OCT values like \0xA6, \xA6 or \012
|
||||
if [[ "$AA" =~ "^(x|X)[0-9a-fA-F]{1,2}"
|
||||
|| "$AA" =~ "^[0-7]{1,3}"
|
||||
|| "$AA" =~ "^u[0-9a-fA-F]{1,4}"
|
||||
|| "$AA" =~ "^U[0-9a-fA-F]{1,8}"
|
||||
]]; then
|
||||
(( k += $#MATCH ))
|
||||
(( i += $#MATCH ))
|
||||
else
|
||||
if (( $#arg > $i+1 )) && [[ $arg[$i+1] == [xXuU] ]]; then
|
||||
# \x not followed by hex digits is probably an error
|
||||
style=unknown-token
|
||||
fi
|
||||
(( k += 1 )) # Color following char too.
|
||||
(( i += 1 )) # Skip parsing the escaped char.
|
||||
fi
|
||||
;;
|
||||
*) continue ;;
|
||||
|
||||
esac
|
||||
-hsmw-add-highlight $j $k $style
|
||||
done
|
||||
}
|
||||
|
||||
# Called with a single positional argument.
|
||||
# Perform filename expansion (tilde expansion) on the argument and set $REPLY to the expanded value.
|
||||
# Does not perform filename generation (globbing).
|
||||
-hsmw-highlight-expand-path()
|
||||
{
|
||||
(( $# == 1 )) || print -r -- >&2 "hsmw-highlight: BUG: -hsmw-highlight-expand-path: called without argument"
|
||||
|
||||
# The $~1 syntax normally performs filename generation, but not when it's on the right-hand side of ${x:=y}.
|
||||
setopt localoptions nonomatch
|
||||
unset REPLY
|
||||
: ${REPLY:=${(Q)~1}}
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Main highlighter initialization
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
-hsmw-highlight-init() {
|
||||
__hsmw_highlight_main__command_type_cache=()
|
||||
}
|
||||
|
||||
-hsmw-add-highlight()
|
||||
{
|
||||
local -i start end
|
||||
local highlight
|
||||
start=$1
|
||||
end=$2
|
||||
shift 2
|
||||
for highlight; do
|
||||
if (( $+HSMW_HIGHLIGHT_STYLES[$highlight] )); then
|
||||
reply+=("$start $end $HSMW_HIGHLIGHT_STYLES[$highlight]")
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
__HSMW_MH_SOURCED=1
|
||||
|
||||
# vim:ft=zsh
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env zsh
|
||||
# Write your bootstrap code here
|
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env zunit
|
||||
@setup {
|
||||
load "../fast-highlight"
|
||||
}
|
||||
|
||||
@test 'ls /usr/bin' {
|
||||
PREBUFFER=""
|
||||
BUFFER="ls /usr/bin"
|
||||
run -fast-highlight-process "$PREBUFFER" "$BUFFER" 0 \; print -rl -- \$reply
|
||||
|
||||
assert "$lines[1]" same_as "0 2 fg=green"
|
||||
assert "$lines[2]" same_as "3 11 fg=magenta,underline"
|
||||
}
|
||||
|
||||
# vim:ft=zsh:sw=4:sts=4:et
|
|
@ -0,0 +1,124 @@
|
|||
#!/usr/bin/env zunit
|
||||
@setup {
|
||||
load "../fast-highlight"
|
||||
setopt interactive_comments
|
||||
-fast-highlight-fill-option-variables
|
||||
}
|
||||
|
||||
@test 'ls /usr/bin' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER="ls /usr/bin"
|
||||
evl -fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 2 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}command]}"
|
||||
assert "$reply[2]" same_as "3 11 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path-to-dir]}"
|
||||
assert "$reply[3]" same_as ""
|
||||
}
|
||||
|
||||
@test 'ls /bin/df' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER="ls /bin/df"
|
||||
evl -fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 2 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}command]}"
|
||||
assert "$reply[2]" same_as "3 10 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]}"
|
||||
assert "$reply[3]" same_as ""
|
||||
}
|
||||
|
||||
|
||||
@test 'ls /bin/ls\\n # a comment\\nls /usr/bin' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER=$'ls /bin/df\n # a comment\nls /usr/bin'
|
||||
evl -fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 2 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}command]}"
|
||||
assert "$reply[2]" same_as "3 10 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]}"
|
||||
assert "$reply[3]" same_as "12 23 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}comment]}"
|
||||
assert "$reply[4]" same_as "24 26 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}command]}"
|
||||
assert "$reply[5]" same_as "27 35 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path-to-dir]}"
|
||||
assert "$reply[6]" same_as ""
|
||||
}
|
||||
|
||||
|
||||
@test 'exec {FD}< <( ls /bin )' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER=$'exec {FD}< <( ls /bin )'
|
||||
evl -fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 4 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}precommand]}"
|
||||
assert "$reply[2]" same_as "5 9 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}exec-descriptor]}"
|
||||
assert "$reply[3]" same_as ""
|
||||
}
|
||||
|
||||
|
||||
@test 'case x in x) a;; (y) ;; esac' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER=$'case x in\nx) a;;\n(y)\n;;\nesac'
|
||||
evl -fast-highlight-process "$PREBUFFER" "$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 4 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}reserved-word]}"
|
||||
assert "$reply[2]" same_as "5 6 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-input]}"
|
||||
assert "$reply[3]" same_as "7 9 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-parentheses]}"
|
||||
assert "$reply[4]" same_as "10 11 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-condition]}"
|
||||
assert "$reply[5]" same_as "11 12 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-parentheses]}"
|
||||
assert "$reply[6]" same_as "13 14 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}unknown-token]}"
|
||||
assert "$reply[7]" same_as "17 18 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-parentheses]}"
|
||||
assert "$reply[8]" same_as "18 19 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-condition]}"
|
||||
assert "$reply[9]" same_as "19 20 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}case-parentheses]}"
|
||||
assert "$reply[10]" same_as "24 28 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}reserved-word]}"
|
||||
assert "$reply[11]" same_as ""
|
||||
}
|
||||
|
||||
@test '-fast-highlight-process "$PREBUFFER" "$BUFFER" 0' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER='-fast-highlight-process "$PREBUFFER" "$BUFFER" 0'
|
||||
evl -fast-highlight-process "\$PREBUFFER" "\$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 23 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}function]}"
|
||||
assert "$reply[2]" same_as "24 36 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}"
|
||||
assert "$reply[3]" same_as "25 35 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}back-or-dollar-double-quoted-argument]}"
|
||||
assert "$reply[4]" same_as "37 46 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}"
|
||||
assert "$reply[5]" same_as "38 45 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}back-or-dollar-double-quoted-argument]}"
|
||||
assert "$reply[6]" same_as ""
|
||||
}
|
||||
|
||||
@test 'tr : \\\\n <<<$PATH' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER='command tr : \\n <<<test$PATH'
|
||||
evl -fast-highlight-process "\$PREBUFFER" "\$BUFFER" 0
|
||||
|
||||
assert "$reply[1]" same_as "0 7 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}precommand]}"
|
||||
assert "$reply[2]" same_as "8 10 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}command]}"
|
||||
assert "$reply[3]" same_as "16 19 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}here-string-tri]}"
|
||||
# BUG?: the text spans over non-text (i.e. var) part
|
||||
assert "$reply[4]" same_as "19 28 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}here-string-text]}"
|
||||
assert "$reply[5]" same_as "23 28 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}here-string-var]}"
|
||||
assert "$reply[6]" same_as ""
|
||||
}
|
||||
|
||||
@test 'local var1; (( var + var1 + $var + $var1 + 123 ))' {
|
||||
reply=()
|
||||
PREBUFFER=""
|
||||
BUFFER='local var1; (( var + var1 + $var + $var1 + 123 ))'
|
||||
evl -fast-highlight-process "\$PREBUFFER" "\$BUFFER" 0
|
||||
|
||||
# Should actually be `reserved-word', but the type -w call returns `builtin'…
|
||||
assert "$reply[1]" same_as "0 5 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}builtin]}"
|
||||
assert "$reply[2]" same_as "12 14 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}"
|
||||
assert "$reply[3]" same_as "15 18 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}matherr]}"
|
||||
assert "$reply[4]" same_as "21 25 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathvar]}"
|
||||
assert "$reply[5]" same_as "28 32 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}matherr]}"
|
||||
assert "$reply[6]" same_as "35 40 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}back-or-dollar-double-quoted-argument]}"
|
||||
assert "$reply[7]" same_as "43 46 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]}"
|
||||
assert "$reply[8]" same_as "47 49 ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}"
|
||||
assert "$reply[9]" same_as ""
|
||||
}
|
||||
|
||||
# vim:ft=zsh:sw=4:sts=4:et
|
|
@ -0,0 +1,81 @@
|
|||
[base]
|
||||
default = none
|
||||
unknown-token = 124,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = bg:19
|
||||
here-string-var = 185,bg:19
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:17
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 146
|
||||
subcommand = 146
|
||||
alias = 109
|
||||
suffix-alias = 109
|
||||
global-alias = bg:19
|
||||
builtin = 109
|
||||
function = 109
|
||||
command = 109
|
||||
precommand = 109
|
||||
hashed-command = 109
|
||||
single-sq-bracket = 109
|
||||
double-sq-bracket = 109
|
||||
double-paren = 146
|
||||
|
||||
[paths]
|
||||
path = 208
|
||||
pathseparator =
|
||||
path-to-dir = 208,underline
|
||||
globbing = 220
|
||||
globbing-ext = 225
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 115
|
||||
bracket-level-2 = 177
|
||||
bracket-level-3 = 220
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 185
|
||||
double-hyphen-option = 185
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 147
|
||||
double-quoted-argument = 147
|
||||
dollar-quoted-argument = 147
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 185
|
||||
; backslash or $... in "..." (i.e. variable in string)
|
||||
back-or-dollar-double-quoted-argument = 185
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 109
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = blue,bold
|
||||
mathnum = 208
|
||||
matherr = 124
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = 208
|
||||
; operator
|
||||
foroper = 147
|
||||
; separator
|
||||
forsep = 109
|
||||
|
||||
[case]
|
||||
case-input = 109
|
||||
case-parentheses = 116
|
||||
case-condition = bg:19
|
|
@ -0,0 +1,84 @@
|
|||
; default theme, also embedded in the source of fast-syntax-highlighting
|
||||
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = red,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = 18
|
||||
here-string-var = cyan,bg:18
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = 12
|
||||
incorrect-subtle = red
|
||||
subtle-separator = green
|
||||
subtle-bg = bg:18
|
||||
secondary = free
|
||||
; recursive-base =
|
||||
|
||||
[command-point]
|
||||
reserved-word = yellow
|
||||
subcommand = yellow
|
||||
alias = green
|
||||
suffix-alias = green
|
||||
global-alias = bg:blue
|
||||
builtin = green
|
||||
function = green
|
||||
command = green
|
||||
precommand = green
|
||||
hashed-command = green
|
||||
single-sq-bracket = green
|
||||
double-sq-bracket = green
|
||||
double-paren = yellow
|
||||
|
||||
[paths]
|
||||
path = magenta
|
||||
pathseparator =
|
||||
path-to-dir = magenta,underline
|
||||
globbing = blue,bold
|
||||
globbing-ext = 13
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = green,bold
|
||||
bracket-level-2 = yellow,bold
|
||||
bracket-level-3 = cyan,bold
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = cyan
|
||||
double-hyphen-option = cyan
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = yellow
|
||||
double-quoted-argument = yellow
|
||||
dollar-quoted-argument = yellow
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = cyan
|
||||
; backslash or $... in "..."
|
||||
back-or-dollar-double-quoted-argument = cyan
|
||||
|
||||
[other]
|
||||
variable = 113
|
||||
assign = none
|
||||
assign-array-bracket = green
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = blue,bold
|
||||
mathnum = magenta
|
||||
matherr = red
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = magenta
|
||||
; operator
|
||||
foroper = yellow
|
||||
; separator
|
||||
forsep = yellow,bold
|
||||
|
||||
[case]
|
||||
case-input = green
|
||||
case-parentheses = yellow
|
||||
case-condition = bg:blue
|
|
@ -0,0 +1,81 @@
|
|||
[base]
|
||||
default = none
|
||||
unknown-token = 124,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = underline
|
||||
here-string-var = 65,underline
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:18
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 186
|
||||
subcommand = 186
|
||||
alias = 101
|
||||
suffix-alias = 101
|
||||
global-alias = bg:55
|
||||
builtin = 101
|
||||
function = 101
|
||||
command = 101
|
||||
precommand = 101
|
||||
hashed-command = 101
|
||||
single-sq-bracket = 101
|
||||
double-sq-bracket = 101
|
||||
double-paren = 186
|
||||
|
||||
[paths]
|
||||
path = 107
|
||||
pathseparator =
|
||||
path-to-dir = 107,underline
|
||||
globbing = 114
|
||||
globbing-ext = 118
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = green,bold
|
||||
bracket-level-2 = yellow,bold
|
||||
bracket-level-3 = cyan,bold
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 65
|
||||
double-hyphen-option = 65
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 186
|
||||
double-quoted-argument = 186
|
||||
dollar-quoted-argument = 186
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 65
|
||||
; backslash or $... in "..."
|
||||
back-or-dollar-double-quoted-argument = 65
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 101
|
||||
history-expansion = 114
|
||||
|
||||
[math]
|
||||
mathvar = 114
|
||||
mathnum = 107
|
||||
matherr = 124
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = 107
|
||||
; operator
|
||||
foroper = 186
|
||||
; separator
|
||||
forsep = 109
|
||||
|
||||
[case]
|
||||
case-input = 101
|
||||
case-parentheses = 65
|
||||
case-condition = underline
|
|
@ -0,0 +1,81 @@
|
|||
[base]
|
||||
default = none
|
||||
unknown-token = red,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = bg:19
|
||||
here-string-var = 110,bg:19
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:18
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 150
|
||||
subcommand = 150
|
||||
alias = 180
|
||||
suffix-alias = 180
|
||||
global-alias = bg:19
|
||||
builtin = 180
|
||||
function = 180
|
||||
command = 180
|
||||
precommand = 180
|
||||
hashed-command = 180
|
||||
single-sq-bracket = 180
|
||||
double-sq-bracket = 180
|
||||
double-paren = 150
|
||||
|
||||
[paths]
|
||||
path = 166
|
||||
pathseparator =
|
||||
path-to-dir = 166,underline
|
||||
globbing = 112
|
||||
globbing-ext = 118
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 130
|
||||
bracket-level-2 = 70
|
||||
bracket-level-3 = 69
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 110
|
||||
double-hyphen-option = 110
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 150
|
||||
double-quoted-argument = 150
|
||||
dollar-quoted-argument = 150
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 110
|
||||
; backslash or $... in "..." (i.e. variable inside a string)
|
||||
back-or-dollar-double-quoted-argument = 110
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 180
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = blue,bold
|
||||
mathnum = 166
|
||||
matherr = red
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = 150
|
||||
; operator
|
||||
foroper = 150
|
||||
; separator
|
||||
forsep = 109
|
||||
|
||||
[case]
|
||||
case-input = 180
|
||||
case-parentheses = 116
|
||||
case-condition = bg:19
|
|
@ -0,0 +1,163 @@
|
|||
; X-JMnemonic theme for Fast-Syntax-Highlighting:
|
||||
; https://github.com/zdharma/fast-syntax-highlighting
|
||||
; Version: 1.1
|
||||
;
|
||||
; Copyright (c) 2018 Sebastian Gniazdowski
|
||||
;
|
||||
; Based on: https://www.syntaxenvy.com/0753499
|
||||
;
|
||||
; When I first saw the above theme upon syntaxenvy.com generated it randomly,
|
||||
; I've had a quick, bold association with the Johnny Mnemonic movie. I don't
|
||||
; know why, but I've decided to name the theme like this and who knows, maybe
|
||||
; someone will decipher the connection one day. The theme looks suprisingly
|
||||
; well IMO and maybe it's the effect of having this movie property/connection.
|
||||
;
|
||||
; This theme is a descent of the 40 work hours (or more) non-public theme X-Paragon,
|
||||
; which was created to say `thanks' to the patrons at Patreon.com/psprint. It should
|
||||
; carry the same quality.
|
||||
;
|
||||
; The palette - naive and CIE L*a*b conversion:
|
||||
;
|
||||
; main:
|
||||
; #5e6466 -> 59 -> CIELab: 241
|
||||
; comment:
|
||||
; #434749 -> 16 -> CIELab: 238
|
||||
; keyword:
|
||||
; #b77c4b -> 137 -> CIELab: 173
|
||||
; number, string:
|
||||
; #5794a2 -> 67 -> CIELab: 66
|
||||
; title, section, name, selector-id:
|
||||
; #778ce0 -> 104 -> CIELab: 104
|
||||
; attribute, variable, type:
|
||||
; #d55383 -> 168 -> CIELab: 168
|
||||
; symbol, link:
|
||||
; #e66493 -> 168 -> CIELab: 168
|
||||
; builtin, deletion:
|
||||
; #bd5ac0 -> 133 -> CIELab: 170
|
||||
; formula-bg:
|
||||
; #363a3b -> 16 -> CIELab: 237
|
||||
;
|
||||
; Token.Literal: "#dc5be0" -> CIELab: 170 (Orchid; naive: 170)
|
||||
; Token.Operator: "#677dcf" -> CIELab: 68 (SteelBlue3; naive: 68)
|
||||
;
|
||||
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = 196
|
||||
secondary = sv-orple
|
||||
recursive-base = 183
|
||||
|
||||
[background]
|
||||
correct-subtle = bg:18
|
||||
incorrect-subtle = bg:238
|
||||
subtle-bg = bg:17
|
||||
global-alias = bg:20
|
||||
|
||||
;;
|
||||
;; COLOR-GROUPS
|
||||
;;
|
||||
|
||||
[gray]
|
||||
comment = 243
|
||||
|
||||
|
||||
|
||||
[pastel]
|
||||
here-string-tri = 217
|
||||
|
||||
|
||||
|
||||
[no-color]
|
||||
assign = none
|
||||
back-quoted-argument = none
|
||||
redirection = none
|
||||
variable = none
|
||||
|
||||
|
||||
|
||||
|
||||
[magenta-3]
|
||||
dollar-quoted-argument = 173
|
||||
double-quoted-argument = 173
|
||||
history-expansion = 173
|
||||
globbing-ext = 173
|
||||
precommand = 173
|
||||
|
||||
[light-salmon-3]
|
||||
builtin = 137
|
||||
subcommand = 137
|
||||
single-quoted-argument = 137
|
||||
|
||||
[steel-blue-3]
|
||||
command = 68
|
||||
double-sq-bracket = 68
|
||||
double-paren = 68
|
||||
single-sq-bracket = 68
|
||||
|
||||
[steel-blue]
|
||||
reserved-word = 67
|
||||
|
||||
|
||||
|
||||
[medium-purple]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 104
|
||||
commandseparator = 104
|
||||
single-hyphen-option = 104
|
||||
|
||||
[dark-khaki]
|
||||
double-hyphen-option = 143
|
||||
|
||||
|
||||
|
||||
[hot-pink-3]
|
||||
alias = 168
|
||||
exec-descriptor = 168
|
||||
function = 168
|
||||
hashed-command = 168
|
||||
here-string-var = 168
|
||||
suffix-alias = 168
|
||||
|
||||
[pale-green-3]
|
||||
assign-array-bracket = 114
|
||||
; variable $... or backslash in "..." (i.e. variable in string)
|
||||
back-or-dollar-double-quoted-argument = 114
|
||||
globbing = 114
|
||||
here-string-text = 114
|
||||
|
||||
|
||||
|
||||
[orchid]
|
||||
path = 170
|
||||
path-to-dir = 170,underline
|
||||
pathseparator =
|
||||
|
||||
|
||||
|
||||
;;
|
||||
;; FUNCTIONALITY-GROUPS
|
||||
;;
|
||||
|
||||
[brackets]
|
||||
paired-bracket = black,bg:216
|
||||
bracket-level-1 = 117
|
||||
bracket-level-2 = 217
|
||||
bracket-level-3 = 220
|
||||
|
||||
[math]
|
||||
mathvar = 68
|
||||
mathnum = 173
|
||||
matherr = 124
|
||||
|
||||
[for-loop]
|
||||
forvar = 68
|
||||
fornum = 173
|
||||
; operator
|
||||
foroper = 133
|
||||
; separator
|
||||
forsep = 104
|
||||
|
||||
[case]
|
||||
case-input = 168
|
||||
case-parentheses = 217
|
||||
case-condition = bg:25
|
|
@ -0,0 +1,83 @@
|
|||
; Light theme with colors of a Sahara oasis
|
||||
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = red,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = bg:19
|
||||
here-string-var = 153,bg:19
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:18
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 150
|
||||
subcommand = 150
|
||||
alias = 185
|
||||
suffix-alias = 185
|
||||
global-alias = bg:19
|
||||
builtin = 185
|
||||
function = 185
|
||||
command = 185
|
||||
precommand = 185
|
||||
hashed-command = 185
|
||||
single-sq-bracket = 185
|
||||
double-sq-bracket = 185
|
||||
double-paren = 150
|
||||
|
||||
[paths]
|
||||
path = 187
|
||||
pathseparator =
|
||||
path-to-dir = 187,underline
|
||||
globbing = 180
|
||||
globbing-ext = 184
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 178
|
||||
bracket-level-2 = 148
|
||||
bracket-level-3 = 141
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 152
|
||||
double-hyphen-option = 152
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 151
|
||||
double-quoted-argument = 151
|
||||
dollar-quoted-argument = 151
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 153
|
||||
; backslash or $... in "..." (i.e. variable inside a string)
|
||||
back-or-dollar-double-quoted-argument = 153
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 185
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = blue,bold
|
||||
mathnum = 187
|
||||
matherr = red
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = 187
|
||||
; operator
|
||||
foroper = 151
|
||||
; separator
|
||||
forsep = 109
|
||||
|
||||
[case]
|
||||
case-input = 185
|
||||
case-parentheses = 116
|
||||
case-condition = bg:19
|
|
@ -0,0 +1,82 @@
|
|||
; 144, 187, 110, 203
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = 196
|
||||
commandseparator = 150
|
||||
redirection = none
|
||||
here-string-tri = yellow
|
||||
here-string-text = bg:19
|
||||
here-string-var = 186,bg:19
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:17
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 144
|
||||
subcommand = 144
|
||||
alias = 187
|
||||
suffix-alias = 187
|
||||
global-alias = bg:19
|
||||
builtin = 150
|
||||
function = 187
|
||||
command = 187
|
||||
precommand = 187
|
||||
hashed-command = 187
|
||||
single-sq-bracket = 150
|
||||
double-sq-bracket = 150
|
||||
double-paren = 144
|
||||
|
||||
[paths]
|
||||
path = 110
|
||||
pathseparator =
|
||||
path-to-dir = 110,underline
|
||||
globbing = 220
|
||||
globbing-ext = 225
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 115
|
||||
bracket-level-2 = 177
|
||||
bracket-level-3 = 220
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 185
|
||||
double-hyphen-option = 185
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 110
|
||||
double-quoted-argument = 110
|
||||
dollar-quoted-argument = 110
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 186
|
||||
; backslash or $... in "..." (i.e. variable in string)
|
||||
back-or-dollar-double-quoted-argument = 186
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 187
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = 150
|
||||
mathnum = 110
|
||||
matherr = 196
|
||||
|
||||
[for-loop]
|
||||
forvar = 71
|
||||
fornum = 110
|
||||
; operator
|
||||
foroper = 203
|
||||
; separator
|
||||
forsep = 147
|
||||
|
||||
[case]
|
||||
case-input = 187
|
||||
case-parentheses = 116
|
||||
case-condition = bg:19
|
|
@ -0,0 +1,100 @@
|
|||
; https://www.syntaxenvy.com/0073437
|
||||
;
|
||||
; comment:
|
||||
; #363355 -> 61
|
||||
; keyword:
|
||||
; #dda69f -> 181 (138)
|
||||
; number, string:
|
||||
; #ca887e -> 174 (173)
|
||||
; title, section, name, selector-id:
|
||||
; #b3afd9 -> 146 (146)
|
||||
; attribute, variable, type:
|
||||
; #be85c0 -> 139 (140)
|
||||
; symbol, link:
|
||||
; #d6a2d8 -> 182 (182)
|
||||
; builtin, deletion:
|
||||
; #969c77 -> 108 (108)
|
||||
; formula-bg:
|
||||
; #211f37 -> 16 (17)
|
||||
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = 124
|
||||
commandseparator = 146
|
||||
redirection = none
|
||||
here-string-tri = 138
|
||||
here-string-text = bg:25
|
||||
here-string-var = 140,bg:25
|
||||
exec-descriptor = 140
|
||||
comment = 61
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:17
|
||||
secondary = clean
|
||||
recursive-base = 186
|
||||
|
||||
[command-point]
|
||||
reserved-word = 138
|
||||
subcommand = 182
|
||||
alias = 140
|
||||
suffix-alias = 140
|
||||
global-alias = bg:17
|
||||
builtin = 173
|
||||
function = 140
|
||||
command = 108
|
||||
precommand = 138
|
||||
hashed-command = 140
|
||||
single-sq-bracket = 173
|
||||
double-sq-bracket = 173
|
||||
double-paren = 138
|
||||
|
||||
[paths]
|
||||
path = 182
|
||||
pathseparator =
|
||||
path-to-dir = 182,underline
|
||||
globbing = 138
|
||||
globbing-ext = 141
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 173
|
||||
bracket-level-2 = 177
|
||||
bracket-level-3 = 220
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 140
|
||||
double-hyphen-option = 140
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 173
|
||||
double-quoted-argument = 173
|
||||
dollar-quoted-argument = 173
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 146
|
||||
; backslash or $... in "..." (i.e. variable in string)
|
||||
back-or-dollar-double-quoted-argument = 140
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 182
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = 140
|
||||
mathnum = 173
|
||||
matherr = 124
|
||||
|
||||
[for-loop]
|
||||
forvar = 140
|
||||
fornum = 173
|
||||
; operator
|
||||
foroper = 147
|
||||
; separator
|
||||
forsep = 182
|
||||
|
||||
[case]
|
||||
case-input = 140
|
||||
case-parentheses = 17
|
||||
case-condition = bg:25
|
|
@ -0,0 +1,100 @@
|
|||
; https://www.syntaxenvy.com/0854668
|
||||
;
|
||||
; comment:
|
||||
; #5b4e3f -> 58
|
||||
; keyword:
|
||||
; #a1f2b2 -> 157
|
||||
; number, string:
|
||||
; #91cf9e -> 115 (114)
|
||||
; title, section, name, selector-id:
|
||||
; #dadff0 -> 189
|
||||
; attribute, variable, type:
|
||||
; #debb91 -> 180
|
||||
; symbol, link:
|
||||
; #f1dcc6 -> 224
|
||||
; builtin, deletion:
|
||||
; #95cbc1 -> 115
|
||||
; formula:
|
||||
; #3f352a -> 16
|
||||
|
||||
[base]
|
||||
default = none
|
||||
unknown-token = 124
|
||||
commandseparator = 189
|
||||
redirection = none
|
||||
here-string-tri = 157
|
||||
here-string-text = bg:25
|
||||
here-string-var = 180,bg:25
|
||||
exec-descriptor = 180
|
||||
comment = 58
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:17
|
||||
secondary = zdharma
|
||||
recursive-base = 183
|
||||
|
||||
[command-point]
|
||||
reserved-word = 157
|
||||
subcommand = 224
|
||||
alias = 180
|
||||
suffix-alias = 180
|
||||
global-alias = bg:58
|
||||
builtin = 115
|
||||
function = 180
|
||||
command = 180
|
||||
precommand = 157
|
||||
hashed-command = 180
|
||||
single-sq-bracket = 115
|
||||
double-sq-bracket = 115
|
||||
double-paren = 157
|
||||
|
||||
[paths]
|
||||
path = 224
|
||||
pathseparator =
|
||||
path-to-dir = 224,underline
|
||||
globbing = 157
|
||||
globbing-ext = 159
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 115
|
||||
bracket-level-2 = 177
|
||||
bracket-level-3 = 220
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 180
|
||||
double-hyphen-option = 180
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 114
|
||||
double-quoted-argument = 114
|
||||
dollar-quoted-argument = 114
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 189
|
||||
; backslash or $... in "..." (i.e. variable in string)
|
||||
back-or-dollar-double-quoted-argument = 180
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 224
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = 180
|
||||
mathnum = 114
|
||||
matherr = 124
|
||||
|
||||
[for-loop]
|
||||
forvar = 180
|
||||
fornum = 114
|
||||
; operator
|
||||
foroper = 147
|
||||
; separator
|
||||
forsep = 224
|
||||
|
||||
[case]
|
||||
case-input = 180
|
||||
case-parentheses = 58
|
||||
case-condition = bg:25
|
|
@ -0,0 +1,81 @@
|
|||
[base]
|
||||
default = none
|
||||
unknown-token = red,bold
|
||||
commandseparator = none
|
||||
redirection = none
|
||||
here-string-tri = 141
|
||||
here-string-text = bg:19
|
||||
here-string-var = 177,bg:19
|
||||
exec-descriptor = yellow,bold
|
||||
comment = black,bold
|
||||
correct-subtle = bg:55
|
||||
incorrect-subtle = bg:52
|
||||
subtle-bg = bg:17
|
||||
secondary = safari
|
||||
recursive-base = 186
|
||||
|
||||
[command-point]
|
||||
reserved-word = 146
|
||||
reserved-word = 146
|
||||
alias = 63
|
||||
suffix-alias = 63
|
||||
global-alias = bg:19
|
||||
builtin = 63
|
||||
function = 63
|
||||
command = 63
|
||||
precommand = 63
|
||||
hashed-command = 63
|
||||
single-sq-bracket = 63
|
||||
double-sq-bracket = 63
|
||||
double-paren = 146
|
||||
|
||||
[paths]
|
||||
path = 154
|
||||
pathseparator =
|
||||
path-to-dir = 154,underline
|
||||
globbing = 114
|
||||
globbing-ext = 153
|
||||
|
||||
[brackets]
|
||||
paired-bracket = bg:blue
|
||||
bracket-level-1 = 117
|
||||
bracket-level-2 = 141
|
||||
bracket-level-3 = 90
|
||||
|
||||
[arguments]
|
||||
single-hyphen-option = 177
|
||||
double-hyphen-option = 177
|
||||
back-quoted-argument = none
|
||||
single-quoted-argument = 146
|
||||
double-quoted-argument = 146
|
||||
dollar-quoted-argument = 146
|
||||
|
||||
[in-string]
|
||||
; backslash in $'...'
|
||||
back-dollar-quoted-argument = 177
|
||||
; backslash or $... in "..."
|
||||
back-or-dollar-double-quoted-argument = 177
|
||||
|
||||
[other]
|
||||
variable = none
|
||||
assign = none
|
||||
assign-array-bracket = 63
|
||||
history-expansion = blue,bold
|
||||
|
||||
[math]
|
||||
mathvar = blue,bold
|
||||
mathnum = 154
|
||||
matherr = red
|
||||
|
||||
[for-loop]
|
||||
forvar = none
|
||||
fornum = 154
|
||||
; operator
|
||||
foroper = 146
|
||||
; separator
|
||||
forsep = 109
|
||||
|
||||
[case]
|
||||
case-input = 63
|
||||
case-parentheses = 141
|
||||
case-condition = bg:19
|
|
@ -0,0 +1,29 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
local __first_call="$1" __wrd="${2%%=*}" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
if (( __first_call )) || [[ "$2" = -* ]]; then
|
||||
return 1
|
||||
else
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif (( $+aliases[(e)$__wrd] )) || (( ${+galiases[(e)$__wrd]} )); then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos+${#__wrd}-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
elif (( $+functions[(e)$__wrd] )) || (( $+builtins[(e)$__wrd] )) || (( $+commands[(e)$__wrd] )) || (( $reswords[(Ie)$__wrd] )); then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos+${#__wrd}-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
if [[ "$__wrd" != "$2" ]]; then
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
|
@ -0,0 +1,104 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Tracks autoload command - highlights function names if they exist somewhere
|
||||
# in $fpath. Also warns that the autoloaded function is already defined.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars
|
||||
integer __idx1 __idx2
|
||||
local -a __results __deserialized __noshsplit
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-autoload-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-autoload-counter-all]=1
|
||||
FAST_HIGHLIGHT[chroma-autoload-message]=""
|
||||
#FAST_HIGHLIGHT[chroma-autoload-message-shown]=""
|
||||
[[ -z ${FAST_HIGHLIGHT[chroma-autoload-message-shown-at]} ]] && FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=0
|
||||
FAST_HIGHLIGHT[chroma-autoload-elements]=""
|
||||
__style=${FAST_THEME_NAME}command
|
||||
|
||||
} || {
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
(( FAST_HIGHLIGHT[chroma-autoload-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-autoload-counter-all] ))
|
||||
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = [-+]* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-autoload-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-autoload-counter] ))
|
||||
|
||||
if [[ $__wrd != (\$|\"\$)* && $__wrd != (/|\"/|\'/)* && $__wrd != \`* ]]; then
|
||||
__results=( ${^fpath}/$__wrd(N) )
|
||||
__deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-fpath_peq-elements]}}" )
|
||||
__results+=( ${^__deserialized}/$__wrd(N) )
|
||||
[[ "${#__results}" -gt 0 ]] && {
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
__deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-autoload-elements]}}" )
|
||||
[[ -z "${__deserialized[1]}" && ${#__deserialized} -eq 1 ]] && __deserialized=()
|
||||
# Cannot use ${abc:+"$abc"} trick with ${~...}, so handle most
|
||||
# cases of the possible shwordsplit through an additional array
|
||||
__noshsplit=( ${~__wrd} )
|
||||
__deserialized+=( "${(j: :)__noshsplit}" )
|
||||
FAST_HIGHLIGHT[chroma-autoload-elements]="${(j: :)${(q@)__deserialized}}"
|
||||
# Make the function defined for big-loop's *main-type mechanism
|
||||
__fast_highlight_main__command_type_cache[${(j: :)__noshsplit}]="function"
|
||||
} || __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
|
||||
if (( ${+functions[${(Q)__wrd}]} )); then
|
||||
FAST_HIGHLIGHT[chroma-autoload-message]+="Warning: Function ${(Q)__wrd} already defined (e.g. loaded)"$'\n'
|
||||
fi
|
||||
fi
|
||||
|
||||
# Display only when processing last autoload argument
|
||||
if (( ${#${(z)BUFFER}} == FAST_HIGHLIGHT[chroma-autoload-counter-all] )); then
|
||||
# Display only if already shown message differs or when it timeouts
|
||||
if [[ ${FAST_HIGHLIGHT[chroma-autoload-message]} != ${FAST_HIGHLIGHT[chroma-autoload-message-shown]} ||
|
||||
$(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-autoload-message-shown-at] )) -gt 7
|
||||
]]; then
|
||||
FAST_HIGHLIGHT[chroma-autoload-message-shown]=${FAST_HIGHLIGHT[chroma-autoload-message]}
|
||||
FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=$EPOCHSECONDS
|
||||
zle -M "${FAST_HIGHLIGHT[chroma-autoload-message]}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code
|
||||
# can do it itself and skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,22 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
if (( __first_call )) || [[ "$__wrd" = -* ]]; then
|
||||
return 1
|
||||
else
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
if [[ -d "${XDG_CONFIG_HOME:-$HOME/.config}/autorandr/$__wrd" ]] then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
fi
|
||||
fi
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
|
@ -0,0 +1,108 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars __val __style2
|
||||
integer __idx1 __idx2
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-awk-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-awk-f-seen]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
[[ "$__wrd" = "-f" ]] && FAST_HIGHLIGHT[chroma-awk-f-seen]=1
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-awk-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-awk-counter] ))
|
||||
|
||||
# First non-option token is the pattern (regex), we will
|
||||
# highlight it.
|
||||
if (( FAST_HIGHLIGHT[chroma-awk-counter] == 1 && FAST_HIGHLIGHT[chroma-awk-f-seen] == 0 )); then
|
||||
if print -r -- "${(Q)__wrd}" | gawk --source 'BEGIN { exit } END { exit 0 }' -f - >/dev/null 2>&1; then
|
||||
__style2="${FAST_THEME_NAME}subtle-bg"
|
||||
else
|
||||
__style2="${FAST_THEME_NAME}incorrect-subtle"
|
||||
fi
|
||||
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style2]}")
|
||||
|
||||
# Highlight keywords
|
||||
FSH_LIST=()
|
||||
: "${__wrd//(#m)(BEGIN|END|FIELDWIDTHS|RS|ARGC|ARGV|ENVIRON|NF|NR|IGNORECASE|FILENAME|if|then|else|while|toupper|tolower|function|print|sub)/$(( fsh_sy_h_append($MBEGIN, $MEND) ))}";
|
||||
for __val in "${FSH_LIST[@]}" ; do
|
||||
[[ ${__wrd[${__val%%;;*}]} = [a-zA-Z0-9_] || ${__wrd[${__val##*;;}+1]} = [a-zA-Z0-9_] ]] && continue
|
||||
__idx1=$(( __start_pos + ${__val%%;;*} ))
|
||||
__idx2=__idx1+${__val##*;;}-${__val%%;;*}+1
|
||||
(( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}-1, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}reserved-word]},${FAST_HIGHLIGHT_STYLES[$__style2]}")
|
||||
done
|
||||
|
||||
# Highlight regex characters
|
||||
__chars="*+\\)(\{\}[]^"
|
||||
__idx1=__start_pos
|
||||
__idx2=__start_pos
|
||||
while [[ "$__wrd" = (#b)[^$__chars]#([\\][\\])#((+|\*|\[|\]|\)|\(|\^|\}|\{)|[\\](+|\*|\[|\]|\)|\(|\^|\{|\}))(*) ]]; do
|
||||
if [[ -n "${match[3]}" ]]; then
|
||||
__idx1+=${mbegin[3]}-1
|
||||
__idx2=__idx1+${mend[3]}-${mbegin[3]}+1
|
||||
(( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]},${FAST_HIGHLIGHT_STYLES[$__style2]}")
|
||||
__idx1=__idx2
|
||||
else
|
||||
__idx1+=${mbegin[5]}-1
|
||||
fi
|
||||
__wrd="${match[5]}"
|
||||
done
|
||||
elif (( FAST_HIGHLIGHT[chroma-awk-counter] >= 2 || FAST_HIGHLIGHT[chroma-awk-f-seen] == 1 )); then
|
||||
FAST_HIGHLIGHT[chroma-awk-f-seen]=0
|
||||
# Handle paths, etc. normally - just pass-through to the big
|
||||
# highlighter (the main FSH highlighter, used before chromas).
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,90 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `docker'. It verifies command line, by denoting
|
||||
# wrong and good arguments by color. Currently implemented: verification of
|
||||
# image IDs passed to: docker image rm <ID>.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
local -a __lines_list
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables
|
||||
FAST_HIGHLIGHT[chroma-docker-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-docker-got-subcommand]=0
|
||||
FAST_HIGHLIGHT[chroma-docker-subcommand]=""
|
||||
FAST_HIGHLIGHT[chrome-docker-got-msg1]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-docker-got-subcommand]} -eq 0 ]]; then
|
||||
__style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
else
|
||||
if (( FAST_HIGHLIGHT[chroma-docker-got-subcommand] == 0 )); then
|
||||
FAST_HIGHLIGHT[chroma-docker-got-subcommand]=1
|
||||
FAST_HIGHLIGHT[chroma-docker-subcommand]="$__wrd"
|
||||
__style=${FAST_THEME_NAME}subcommand
|
||||
(( FAST_HIGHLIGHT[chroma-docker-counter] += 1 ))
|
||||
else
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__arg="${__arg//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-docker-subcommand]}" = "image" ]]; then
|
||||
[[ "$__wrd" != -* ]] && {
|
||||
(( FAST_HIGHLIGHT[chroma-docker-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-docker-counter] ))
|
||||
|
||||
if (( __idx1 == 2 )); then
|
||||
__style=${FAST_THEME_NAME}subcommand
|
||||
elif (( __idx1 == 3 )); then
|
||||
.fast-run-command "docker images -q" chroma-docker-list ""
|
||||
[[ -n "${__lines_list[(r)$__wrd]}" ]] && {
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
} || {
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
}
|
||||
fi
|
||||
} || __style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,120 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Example chroma function. It colorizes first two arguments as `builtin' style,
|
||||
# third and following arguments as `globbing' style. First two arguments may
|
||||
# be "strings", they will be passed through to normal higlighter (by returning 1).
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
#
|
||||
# Overall functioning is: when command "example" is occured, this function
|
||||
# is called with $1 == 1, it ("example") is the first token ($2), then for any
|
||||
# following token, this function is called with $1 == 0, until end of command
|
||||
# is occured (i.e. till enter is pressed or ";" is put into source, or the
|
||||
# command line simply ends).
|
||||
#
|
||||
# Other tips are:
|
||||
# - $CURSOR holds cursor position
|
||||
# - $BUFFER holds whole command line buffer
|
||||
# - $LBUFFER holds command line buffer that is left from the cursor, i.e. it's a
|
||||
# BUFFER substring 1 .. $CURSOR
|
||||
# - $RBUFFER is the same as LBUFFER but holds part of BUFFER right to the cursor
|
||||
#
|
||||
# The function receives $BUFFER but via sequence of tokens, which are shell words,
|
||||
# e.g. "a b c" is a shell word, while a b c are 3 shell words.
|
||||
#
|
||||
# FAST_HIGHLIGHT is a friendly hash array which allows to store strings without
|
||||
# creating global parameters (variables). If you need hash, just use it first
|
||||
# declaring, under some distinct name like: typeset -gA CHROMA_EXPLE_DICT.
|
||||
# Remember to reset the hash and others at __first_call == 1, so that you have
|
||||
# a fresh state for new command.
|
||||
|
||||
# Keep chroma-takever state meaning: until ;, handle highlighting via chroma.
|
||||
# So the below 8192 assignment takes care that next token will be routed to chroma.
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global string variables.
|
||||
FAST_HIGHLIGHT[chroma-example-counter]=0
|
||||
|
||||
# Set style for region_highlight entry. It is used below in
|
||||
# '[[ -n "$__style" ]] ...' line, which adds highlight entry,
|
||||
# like "10 12 fg=green", through `reply' array.
|
||||
#
|
||||
# Could check if command `example' exists and set `unknown-token'
|
||||
# style instead of `command'
|
||||
__style=${FAST_THEME_NAME}command
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
# Count non-option tokens
|
||||
(( FAST_HIGHLIGHT[chroma-example-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-example-counter] ))
|
||||
|
||||
# Colorize 1..2 as builtin, 3.. as glob
|
||||
if (( FAST_HIGHLIGHT[chroma-example-counter] <= 2 )); then
|
||||
if [[ "$__wrd" = \"* ]]; then
|
||||
# Pass through, fsh main code will do the highlight!
|
||||
return 1
|
||||
else
|
||||
__style=${FAST_THEME_NAME}builtin
|
||||
fi
|
||||
else
|
||||
__style=${FAST_THEME_NAME}globbing
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
# If 1 will be added to __start_pos, this will highlight "oken".
|
||||
# If 1 will be subtracted from __end_pos, this will highlight "toke".
|
||||
# $PREBUFFER is for specific situations when users does command \<ENTER>
|
||||
# i.e. when multi-line command using backslash is entered.
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code can do
|
||||
# it itself (and it does in other chromas) and skip setting __style to
|
||||
# this way disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves.
|
||||
# _start_pos=$_end_pos advainces pointers in command line buffer.
|
||||
#
|
||||
# To pass through means to `return 1'. The highlighting of
|
||||
# this single token is then done by fast-syntax-highlighting's
|
||||
# main code and chroma doesn't have to do anything.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,40 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
local __first_call="$1" __wrd="${(Q)2}" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
|
||||
if (( __first_call )); then
|
||||
FAST_HIGHLIGHT[chroma-fast-theme-first]=0
|
||||
return 1
|
||||
elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif (( ${FAST_HIGHLIGHT[chroma-fast-theme-first]} )) || [[ $__wrd = -* ]]; then
|
||||
return 1
|
||||
else
|
||||
FAST_HIGHLIGHT[chroma-fast-theme-first]=1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = */* || "$__wrd" = (XDG|LOCAL|HOME|OPT):* ]]; then
|
||||
__wrd="${${__wrd/(#s)XDG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini"
|
||||
__wrd="${${__wrd/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini"
|
||||
__wrd="${${__wrd/(#s)HOME:/$HOME/.fsh/}%.ini}.ini"
|
||||
__wrd="${${__wrd/(#s)OPT://opt/local/share/fsh/}%.ini}.ini"
|
||||
__wrd=${~__wrd} # allow user to quote ~
|
||||
else
|
||||
__wrd="$FAST_BASE_DIR/themes/$__wrd.ini"
|
||||
fi
|
||||
|
||||
if [[ -f $__wrd ]]; then
|
||||
__style=${FAST_THEME_NAME}path
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
|
@ -0,0 +1,61 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# This chroma does a narrow, obscure but prestigious parsing of fpath+=( elem1
|
||||
# elem2 ... ) construct to provide *the* *future* contents of $fpath to
|
||||
# -autoload.ch, so that it can detect functions in those provided directories
|
||||
# `elem1', `elem2', etc. and highlight the functions with `correct-subtle'
|
||||
# instead of `incorrect-subtle'. Basically all thit is for command-lines like:
|
||||
#
|
||||
# % fpath+=( `pwd` ); autoload my-fun-from-PWD
|
||||
|
||||
# Keep chroma-takever state meaning: until ; or similar (see $__arg_type below)
|
||||
# The 8192 sum takes care that the next token will be routed to this chroma
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local -a deserialized
|
||||
|
||||
(( __first_call )) && {
|
||||
case $__wrd in
|
||||
(fpath=\()
|
||||
FAST_HIGHLIGHT[fpath_peq_mode]=1
|
||||
;;
|
||||
(fpath+=\()
|
||||
FAST_HIGHLIGHT[fpath_peq_mode]=2
|
||||
;;
|
||||
(FPATH=)
|
||||
FAST_HIGHLIGHT[fpath_peq_mode]=4
|
||||
;;
|
||||
(FPATH+=)
|
||||
FAST_HIGHLIGHT[fpath_peq_mode]=8
|
||||
;;
|
||||
esac
|
||||
if (( FAST_HIGHLIGHT[fpath_peq_mode] & 5 )); then
|
||||
FAST_HIGHLIGHT[chroma-fpath_peq-elements]="! ${FAST_HIGHLIGHT[chroma-fpath_peq-elements]}"
|
||||
fi
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
[[ "$__wrd" != ")" ]] && {
|
||||
deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-fpath_peq-elements]}}" )
|
||||
[[ -z "${deserialized[1]}" && ${#deserialized} -eq 1 ]] && deserialized=()
|
||||
# Support ~ and $VAR, for [a-zA-Z_][a-ZA-Z0-9_]# characters in "VAR"
|
||||
deserialized+=( "${(Q)${${(j: :)__wrd}//(#b)((\$([0-9]##|[a-zA-Z_][a-zA-Z0-9_]#))|(\$\{([0-9]##|[a-zA-Z_][a-zA-Z0-9_]#)\})|(#s)~)/${(P)${${${${match[1]##\$\{(#c0,1)}%\}}:#\~}:-HOME}}}}" )
|
||||
FAST_HIGHLIGHT[chroma-fpath_peq-elements]="${(j: :)${(q@)deserialized}}"
|
||||
}
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,954 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `git'. It colorizes the part of command
|
||||
# line that holds `git' invocation.
|
||||
|
||||
(( FAST_HIGHLIGHT[-git.ch-chroma-def] )) && return 1
|
||||
|
||||
FAST_HIGHLIGHT[-git.ch-chroma-def]=1
|
||||
|
||||
typeset -gA fsh__git__chroma__def
|
||||
fsh__git__chroma__def=(
|
||||
##
|
||||
## No subcommand
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:NULL "NULL_0_opt"
|
||||
NULL_0_opt "(-C|--exec-path=|--git-dir=|--work-tree=|--namespace=|--super-prefix=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| -c
|
||||
<<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP
|
||||
<<>> __style=\${FAST_THEME_NAME}optarg-string // NO-OP
|
||||
|| (--version|--help|--html-path|--man-path|--info-path|-p|--paginate|
|
||||
-P|--no-pager|--no-replace-objects|--bare)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
|
||||
"subcommands" "::→chroma/-git-get-subcommands" # run a function (the :: causes this) and use `reply'
|
||||
#"subcommands" "(fetch|pull)" # run a function (the :: causes this) and use `reply'
|
||||
|
||||
"subcmd-hook" "→chroma/-git-check-if-alias"
|
||||
|
||||
"subcommands-blacklist" "mv,other"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `FETCH'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:fetch "FETCH_MULTIPLE_0_opt^ // FETCH_ALL_0_opt^ // FETCH_0_opt //
|
||||
REMOTE_GR_1_arg // REF_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
# Special options (^ - has directives, currently - an :add and :del directive)
|
||||
"FETCH_MULTIPLE_0_opt^" "
|
||||
--multiple
|
||||
<<>> __style=\${FAST_THEME_NAME}double-hyphen-option // NO-OP
|
||||
|| --multiple:add
|
||||
<<>> REMOTE_GR_#_arg
|
||||
|| --multiple:del
|
||||
<<>> REMOTE_GR_1_arg // REF_#_arg" # when --multiple is passed, then
|
||||
# there is no refspec argument, only remotes-ids
|
||||
# follow unlimited # of them, hence the # in the
|
||||
# REMOTE_GR_#_arg
|
||||
|
||||
# Special options (^ - has directives - an :del-directive)
|
||||
"FETCH_ALL_0_opt^" "
|
||||
--all
|
||||
<<>> __style=\${FAST_THEME_NAME}double-hyphen-option // NO-OP
|
||||
|| --all:del
|
||||
<<>> REMOTE_GR_1_arg // REF_#_arg" # --all can be only followed by options
|
||||
|
||||
# FETCH_0_opt. FETCH-options (FETCH is an identifier) at position 0 ->
|
||||
# -> before any argument
|
||||
FETCH_0_opt "
|
||||
(--depth=|--deepen=|--shallow-exclude=|--shallow-since=|--receive-pack=|
|
||||
--refmap=|--recurse-submodules=|-j|--jobs=|--submodule-prefix=|
|
||||
--recurse-submodules-default=|-o|--server-option=|--upload-pack|
|
||||
--negotiation-tip=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (--help|--all|-a|--append|--unshallow|--update-shallow|--dry-run|-f|--force|
|
||||
-k|--keep|--multiple|-p|--prune|-n|--no-tags|-t|--tags|--no-recurse-submodules|
|
||||
-u|--update-head-ok|-q|--quiet|-v|--verbose|--progress|
|
||||
-4|--ipv4|-6|--ipv6)
|
||||
<<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP"
|
||||
# Above: note the two <<>>-separated blocks for options that have
|
||||
# some arguments – the second pair of action/handler is being
|
||||
# run when an option argument is occurred (first one: the option
|
||||
# itself). If there is only one <<>>-separated block, then the option
|
||||
# is set to be argument-less. The argument is a) -o/--option argument
|
||||
# and b) -o/--option=argument.
|
||||
|
||||
REMOTE_GR_1_arg "NO-OP // ::→chroma/-git-verify-remote-or-group" # This definition is generic, reused later
|
||||
"REF_#_arg" "NO-OP // ::→chroma/-git-verify-ref" # This too
|
||||
"REMOTE_GR_#_arg" "NO-OP // ::→chroma/-git-verify-remote-or-group" # and this too
|
||||
# The hash `#' above denotes: an argument at any position
|
||||
# It will nicely match any following (above the first explicitly
|
||||
# numbered ones) arguments passed when using --multiple
|
||||
|
||||
# A generic action
|
||||
NO_MATCH_\#_opt "* <<>> __style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP"
|
||||
NO_MATCH_\#_arg "__style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## PUSH
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:push "PUSH_0_opt // REMOTE_1_arg // REF_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
PUSH_0_opt "
|
||||
(--receive-pack=|--exec=|--repo=|--push-option=|--signed=|
|
||||
--force-with-lease=|--signed=|--recurse-submodules=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (--help|--all|--mirror|--tags|--follow-tags|--atomic|-n|--dry-run|
|
||||
--porcelain|--delete|--tags|--follow-tags|--signed|--no-signed|
|
||||
--atomic|--no-atomic|-o|--push-option|--force-with-lease|
|
||||
--no-force-with-lease|-f|--force|-u|--set-upstream|--thin|
|
||||
--no-thin|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules|
|
||||
--verify|--no-verify|-4|--ipv4|-6|--ipv6)
|
||||
<<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP"
|
||||
|
||||
REMOTE_1_arg "NO-OP // ::→chroma/-git-verify-remote" # This definition is generic, reused later
|
||||
|
||||
### }}}
|
||||
|
||||
##
|
||||
## PULL
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:pull "PULL_0_opt // REMOTE_1_arg // REF_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
PULL_0_opt "
|
||||
(--recurse-submodules=|-S|--gpg-sign=|--log=|-s|--strategy=|-X|
|
||||
--strategy-option=|--rebase=|--depth=|--deepen=|--shallow-exclude=|
|
||||
--shallow-since=|--negotiation-tip|--upload-pack|-o|--server-option=|
|
||||
--no-recurse-submodules=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (--help|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules|
|
||||
--commit|--no-commit|--edit|--no-edit|--ff|--no-ff|--ff-only|
|
||||
--log|--no-log|--signoff|--no-signoff|--stat|-n|--no-stat|--squash|
|
||||
--no-squash|--verify-signatures|--no-verify-signatures|--summary|
|
||||
--no-summary|--allow-unrelated-histories|-r|--rebase|--no-rebase|
|
||||
--autostash|--no-autostash|--all|-a|--append|--unshallow|
|
||||
--update-shallow|-f|--force|-k|--keep|--no-tags|-u|--update-head-ok|
|
||||
--progress|-4|--ipv4|-6|--ipv6|--recurse-submodules)
|
||||
<<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## COMMIT
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:commit "COMMIT_#_opt // FILE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
"COMMIT_#_opt" "
|
||||
(-m|--message=|-am)
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-action
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action
|
||||
|| (--help|-a|--all|-p|--patch|--reset-author|--short|--branch|
|
||||
--porcelain|--long|-z|--null|-s|--signoff|-n|--no-verify|
|
||||
--allow-empty|--allow-empty-message|-e|--edit|--no-edit|
|
||||
--amend|--no-post-rewrite|-i|--include|-o|--only|--untracked-files|
|
||||
-v|--verbose|-q|--quiet|--dry-run|--status|--no-status|--no-gpg-sign)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (-C|--reuse-message=|-c|--reedit-message=|--fixup=|--squash=|
|
||||
-F|--file=|--author=|--date=|-t|--template=|--cleanup=|
|
||||
-u|--untracked-files=|-S|--gpg-sign=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action"
|
||||
|
||||
# A generic action
|
||||
"FILE_#_arg" "NO-OP // ::→chroma/-git-verify-file"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## MERGE
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:merge "MERGE_0_opt // COMMIT_#_arg"
|
||||
MERGE_0_opt
|
||||
"(-m)
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-action
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action
|
||||
(-S|--gpg-sign=|--log=|-e|--strategy=|-X|--strategy-option=|-F|
|
||||
--file)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (--help|--commit|--no-commit|-e|--edit|--no-edit|--ff|--no-ff|--ff-only|
|
||||
--log|--no-log|--signoff|--no-signoff|-n|--stat|--no-stat|--squash|
|
||||
--no-squash|--verify-signatures|--no-verify-signatures|--summary|
|
||||
--no-summary|-q|--quiet|-v|--verbose|--progress|--no-progress|
|
||||
--allow-unrelated-histories|--rerere-autoupdate|--no-rerere-autoupdate|
|
||||
--abort|--continue)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
COMMIT_\#_arg "NO-OP // ::→chroma/-git-verify-commit"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## RESET
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:reset "RESET_0_opt^ // RESET_0_opt // RESET_#_arg // NO_MATCH_#_opt"
|
||||
"RESET_0_opt^" "
|
||||
(--soft|--mixed|--hard|--merge|--keep)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (--soft|--mixed|--hard|--merge|--keep):del
|
||||
<<>> RESET_0_opt // RESET_#_arg
|
||||
|| (--soft|--mixed|--hard|--merge|--keep):add
|
||||
<<>> RESET_1_arg // NO_MATCH_#_arg
|
||||
"
|
||||
|
||||
RESET_0_opt "
|
||||
(-q|-p|--patch)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
RESET_1_arg "NO-OP // ::→chroma/-git-verify-commit"
|
||||
|
||||
"RESET_#_arg" "NO-OP // ::→chroma/-git-RESET-verify-commit-or-file"
|
||||
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## REVERT
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:revert "REVERT_SEQUENCER_0_opt^ // REVERT_0_opt // REVERT_#_arg // NO_MATCH_#_opt"
|
||||
REVERT_0_opt "
|
||||
(-m|--mainline|-S|--gpg-sign=|--strategy=|-X|--strategy-option=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (-e|--edit|--no-edit|-n|--no-commit|-s|--signoff)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
"REVERT_SEQUENCER_0_opt^" "
|
||||
(--continue|--quit|--abort)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (--continue|--quit|--abort):del
|
||||
<<>> REVERT_0_opt // REVERT_#_arg
|
||||
|| (--continue|--quit|--abort):add
|
||||
<<>> NO_MATCH_#_arg"
|
||||
|
||||
"REVERT_#_arg" "NO-OP // ::→chroma/-git-verify-commit"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## DIFF
|
||||
##
|
||||
## TODO: When a second argument is also a path and it points to a directory, then
|
||||
## git appends the previous file name to it – good to implement this too
|
||||
## {{{
|
||||
|
||||
subcmd:diff "DIFF_NO_INDEX_0_opt^ // DIFF_0_opt // COMMIT_FILE_DIR_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
"DIFF_NO_INDEX_0_opt^" "
|
||||
--no-index
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| --no-index:del
|
||||
<<>> COMMIT_FILE_DIR_#_arg
|
||||
|| --no-index:add
|
||||
<<>> FILE_1_arg // FILE_2_arg // NO_MATCH_#_arg"
|
||||
DIFF_0_opt "
|
||||
(-U|--unified=|--anchored=|--diff-algorithm=|--stat=|--dirstat|
|
||||
--submodule=|--color=|--color-moved=|--color-moved-ws=|--word-diff=|
|
||||
--word-diff-regex=|--color-words=|--ws-error-highlight=|--abbrev=|
|
||||
-B|--break-rewrites=|-M|--find-renames=|-C|--find-copies=|-l|
|
||||
--diff-filter=|-S|-G|--find-object=|--relative=|-O|--relative=|
|
||||
--inter-hunk-context=|--ignore-submodules=|--src-prefix=|--dst-prefix=|
|
||||
--line-prefix=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (-p|--patch|-u|-s|--no-patch|--raw|--patch-with-raw|--indent-heuristic|
|
||||
--no-indent-heuristic|--minimal|--patience|--histogram|--stat|
|
||||
--compact-summary|--numstat|--shortstat|--dirstat|--summary|
|
||||
--patch-with-stat|-z|--name-only|--name-status|--submodule|--no-color|
|
||||
--color-moved|--word-diff|--color-words|--no-renames|--check|
|
||||
--full-index|--binary|--abbrev|--break-rewrites|--find-renames|
|
||||
--find-copies|--find-copies-harder|-D|--pickaxe-all|--pickaxe-regex|
|
||||
--irreversible-delete|-R|--relative|-a|--text|--ignore-cr-at-eol|
|
||||
--ignore-space-at-eol|-b|--ignore-space-change|-w|--ignore-all-space|
|
||||
--ignore-blank-lines|-W|--function-context|--exit-code|--quiet|
|
||||
--ext-diff|--no-ext-diff|--textconv|--no-textconv|--ignore-submodules|
|
||||
--no-prefix|--ita-invisible-in-index|-1|--base|-2|--ours|-3|--theirs|
|
||||
-0|--cached)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
# A generic action
|
||||
"COMMIT_FILE_DIR_#_arg" "NO-OP // ::→chroma/-git-verify-commit-or-file-or-dir"
|
||||
|
||||
# A generic action
|
||||
"FILE_1_arg" "NO-OP // ::→chroma/-git-verify-file"
|
||||
|
||||
# A generic action
|
||||
"FILE_2_arg" "NO-OP // ::→chroma/-git-verify-file"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## ADD
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:add "ADD_0_opt // FILE_OR_DIR_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
ADD_0_opt "
|
||||
--chmod=
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (-v|--verbose|-f|--force|-i|--interactive|-n|--dry-run|
|
||||
-p|--patch|-e|--edit|--all|--no-all|-A|--all|--no-all|
|
||||
--ignore-removal|--no-ignore-removal|-u|--update|-N|
|
||||
--intent-to-add|--refresh|--ignore-errors|--ignore-missing|
|
||||
--renormalize|--no-warn-embedded-repo)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
FILE_OR_DIR_#_arg "NO-OP // ::→chroma/-git-verify-file-or-dir"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## CHECKOUT
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:checkout "CHECKOUT_BRANCH_0_opt^ //
|
||||
CHECKOUT_0_opt // FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg // FILE_#_arg //
|
||||
FILE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
"CHECKOUT_BRANCH_0_opt^" "
|
||||
(-b|-B|--orphan)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (-b|-B|--orphan):del
|
||||
<<>> FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg // FILE_#_arg // FILE_#_arg
|
||||
|| (-b|-B|--orphan):add
|
||||
<<>> NEW_BRANCH_1_arg // COMMIT_2_arg // NO_MATCH_#_arg"
|
||||
|
||||
NEW_BRANCH_1_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name"
|
||||
|
||||
COMMIT_2_arg "NO-OP // ::→chroma/-git-verify-commit"
|
||||
|
||||
CHECKOUT_0_opt "
|
||||
--conflict=
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (-q|--quiet|--progress|--no-progress|-f|--force|--ours|--theirs|
|
||||
-b|-B|-t|--track|--no-track|-l|--detach|--orphan|
|
||||
--ignore-skip-worktree-bits|-m|--merge|-p|--patch|
|
||||
--ignore-other-worktrees|--no-ignore-other-worktrees)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
# A generic action
|
||||
COMMIT_1_arg "NO-OP // ::→chroma/-git-verify-commit"
|
||||
|
||||
# Unused
|
||||
FILE_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::→chroma/-git-file-or-ubranch-or-commit-verify"
|
||||
FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::→chroma/-git-file-or-dir-or-ubranch-or-commit-verify"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## REMOTE
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:remote "REMOTE_0_opt // REMOTE_ADD_1_arg // REMOTE_RENAME_1_arg // REMOTE_REMOVE_1_arg //
|
||||
REMOTE_SET_HEAD_1_arg // REMOTE_SET_BRANCHES_1_arg //
|
||||
REMOTE_GET_URL_1_arg // REMOTE_SET_URL_1_arg // REMOTE_SHOW_1_arg //
|
||||
REMOTE_PRUNE_1_arg // REMOTE_UPDATE_1_arg"
|
||||
|
||||
REMOTE_0_opt "(-v|--verbose)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_ADD_1_arg "add ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_ADD_OPTS_1_opt // REMOTE_A_NAME_2_arg //
|
||||
REMOTE_A_URL_3_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_RENAME_1_arg "rename ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_2_arg // REMOTE_A_NAME_3_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_REMOVE_1_arg "remove ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_SET_HEAD_1_arg "set-head ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_2_arg // BRANCH_3_arg //
|
||||
REMOTE_SET_HEAD_OPTS_1_opt // REMOTE_SET_HEAD_OPTS_2_opt //
|
||||
NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_SET_BRANCHES_1_arg "set-branches ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_SET_BRANCHES_OPTS_1_opt // REMOTE_2_arg //
|
||||
BRANCH_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
REMOTE_GET_URL_1_arg "get-url ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_GET_URL_OPTS_1_opt // REMOTE_2_arg //
|
||||
NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_SET_URL_1_arg "set-url ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_SET_URL_OPTS_1_opt^ //
|
||||
REMOTE_2_arg // REMOTE_A_URL_3_arg // REMOTE_A_URL_4_arg //
|
||||
NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
REMOTE_SHOW_1_arg "show ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_SHOW_OPTS_1_opt // REMOTE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
REMOTE_PRUNE_1_arg "prune ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_PRUNE_OPTS_1_opt // REMOTE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
REMOTE_UPDATE_1_arg "update ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>>
|
||||
add:REMOTE_UPDATE_OPTS_1_opt // REMOTE_GR_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
REMOTE_ADD_OPTS_1_opt "
|
||||
(-t|-m|--mirror=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (-f|--tags|--no-tags)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_SET_HEAD_OPTS_1_opt "
|
||||
(-a|--auto|-d|--delete)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_SET_HEAD_OPTS_2_opt "
|
||||
(-a|--auto|-d|--delete)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_SET_BRANCHES_OPTS_1_opt "
|
||||
--add
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_GET_URL_OPTS_1_opt "
|
||||
(--push|--all)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
"REMOTE_SET_URL_OPTS_1_opt^" "
|
||||
--push|--add|--delete
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (--add|--delete):del
|
||||
<<>> REMOTE_A_URL_4_arg"
|
||||
|
||||
REMOTE_SHOW_OPTS_1_opt "
|
||||
-n
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_PRUNE_OPTS_1_opt "
|
||||
(-n|--dry-run)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_UPDATE_OPTS_1_opt "
|
||||
(-p|--prune)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
REMOTE_A_NAME_2_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name"
|
||||
REMOTE_A_NAME_3_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name"
|
||||
REMOTE_A_URL_3_arg "NO-OP // ::→chroma/main-chroma-std-verify-url"
|
||||
REMOTE_A_URL_4_arg "NO-OP // ::→chroma/main-chroma-std-verify-url"
|
||||
BRANCH_3_arg "NO-OP // ::→chroma/-git-verify-branch"
|
||||
BRANCH_\#_arg "NO-OP // ::→chroma/-git-verify-branch"
|
||||
REMOTE_2_arg "NO-OP // ::→chroma/-git-verify-remote"
|
||||
REMOTE_\#_arg "NO-OP // ::→chroma/-git-verify-remote"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## LOG
|
||||
##
|
||||
|
||||
subcmd:log "LOG_0_opt // LOG_1_arg // FILE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
LOG_0_opt "
|
||||
(--decorate=|--decorate-refs=|--decorate-refs-exclude=|-L|-n|--max-count=|
|
||||
--skip=|--since=|--after=|--until=|--before=|--author=|--committer=|
|
||||
--grep-reflog=|--grep=|--min-parents=|--max-parents=|--branches=|--tags=|
|
||||
--remotes=|--glob=|--exclude=|--no-walk=|--pretty=|--format=|--encoding=|
|
||||
--expand-tabs=|--notes=|--show-notes=|--date=|--show-linear-break=|-U|
|
||||
--unified=|--anchored=|--diff-algorithm=|--stat=|--dirstat=|--submodule=|
|
||||
--color=|--color-moved=|--color-moved-ws=|--word-diff=|--word-diff-regex=|
|
||||
--color-words=|--ws-error-highlight=|--abbrev=|-B|--break-rewrites=|-M|
|
||||
--find-renames=|-C|--find-copies=|-l|--diff-filter=|-S|-G|--find-object=|
|
||||
--relative=|-O|--relative=|--inter-hunk-context=|--ignore-submodules=|
|
||||
--src-prefix=|--dst-prefix=|--line-prefix=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|
||||
|| (--follow|--decorate|--no-decorate|--source|--use-mailmap|--full-diff|
|
||||
--log-size|--all-match|--invert-grep|-i|--regexp-ignore-case|--basic-regexp|
|
||||
-E|--extended-regexp|-F|--fixed-strings|-P|--perl-regexp|--remove-empty|
|
||||
--merges|--no-merges|--no-min-parents|--no-max-parents|--first-parent|
|
||||
--not|--all|--branches|--tags|--remotes|--reflog|--single-worktree|
|
||||
--ignore-missing|--bisect|--stdin|--cherry-mark|--cherry-pick|--left-only|
|
||||
--right-only|--cherry|-g|--walk-reflogs|--merge|--boundary|--simplify-by-decoration|
|
||||
--full-history|--dense|--sparse|--simplify-merges|--ancestry-path|--date-order|
|
||||
--author-date-order|--topo-order|--reverse|--no-walk|--do-walk|--pretty|
|
||||
--abbrev-commit|--no-abbrev-commit|--oneline|--expand-tabs|--no-expand-tabs|
|
||||
--notes|--no-notes|--show-notes|--no-standard-notes|--show-signature|
|
||||
--relative-date|--parents|--children|--left-right|--graph|--show-linear-break|
|
||||
-c|--cc|-m|-r|-t|-p|-u|--patch|-s|--no-patch|--raw|--patch-with-raw|
|
||||
--indent-heuristic|--no-indent-heuristic|--minimal|--patience|--histogram|
|
||||
--stat|--compact-summary|--numstat|--shortstat|--dirstat|--summary|
|
||||
--patch-with-stat|-z|--name-only|--name-status|--submodule|--color|--no-color|
|
||||
--color-moved|--word-diff|--color-words|--no-renames|--check|--full-index|
|
||||
--binary|--abbrev|--break-rewrites|--find-renames|
|
||||
--find-copies|--find-copies-harder|-D|--irreversible-delete|
|
||||
--pickaxe-all|--pickaxe-regex|-R|--relative|-a|--text|--ignore-cr-at-eol|
|
||||
--ignore-space-at-eol|-b|--ignore-space-change|-w|--ignore-all-space|
|
||||
--ignore-blank-lines|-W|--function-context|--ext-diff|--no-ext-diff|
|
||||
--textconv|--no-textconv|--ignore-submodules|--no-prefix|
|
||||
--ita-invisible-in-index)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
LOG_1_arg "NO-OP // ::→chroma/-git-verify-rev-range-or-file"
|
||||
|
||||
##
|
||||
## TAG
|
||||
##
|
||||
|
||||
subcmd:tag "TAG_D_0_opt^ // TAG_L_0_opt^ // TAG_V_0_opt^ // TAG_0_opt^"
|
||||
|
||||
"TAG_0_opt^" "
|
||||
(-u|--local-user=|--cleanup=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| -m
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-action
|
||||
<<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action
|
||||
|| (-F|--file)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/-git-verify-file
|
||||
|| (-a|--annotate|-s|--sign|-f|-e|--edit)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| (-u|--local-user=|--cleanup=|-m|-F|--file|-a|--annotate|-s|--sign|
|
||||
-f|-e|--edit):add
|
||||
<<>> TAG_NEW_1_arg // COMMIT_2_arg // NO_MATCH_#_arg //
|
||||
NO_MATCH_#_opt"
|
||||
|
||||
TAG_NEW_1_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name"
|
||||
|
||||
TAG_1_arg "NO-OP // ::→chroma/-git-verify-tag-name"
|
||||
|
||||
"TAG_D_0_opt^" "
|
||||
(-d)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| -d:add
|
||||
<<>> TAG_#_arg // NO_MATCH_#_opt
|
||||
|| -d:del
|
||||
<<>> TAG_0_opt // TAG_NEW_1_arg // COMMIT_2_arg"
|
||||
|
||||
"TAG_#_arg" "NO-OP // ::→chroma/-git-verify-tag-name"
|
||||
|
||||
"TAG_L_0_opt^" "
|
||||
(-l)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| -l:add
|
||||
<<>> TAG_L_0_opt // TAG_PAT_#_arg // NO_MATCH_#_opt
|
||||
|| -l:del
|
||||
<<>> TAG_0_opt // TAG_NEW_1_arg // COMMIT_2_arg"
|
||||
|
||||
TAG_L_0_opt "
|
||||
(-n|--contains|--no-contains|--points-at|--column=|--sort=|--format=|
|
||||
--color=)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action
|
||||
|| (--column|--no-column|--create-reflog|--merged|--no-merged|--color|-i)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
"TAG_PAT_#_arg" "NO-OP // ::→chroma/main-chroma-std-verify-pattern"
|
||||
|
||||
"TAG_V_0_opt^" "
|
||||
(-v)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
|| -v:add
|
||||
<<>> TAG_V_0_opt // TAG_#_arg // NO_MATCH_#_opt
|
||||
|| -v:del
|
||||
<<>> TAG_0_opt // TAG_NEW_1_arg // COMMIT_2_arg"
|
||||
|
||||
TAG_V_0_opt "
|
||||
--format=
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action"
|
||||
|
||||
##
|
||||
## All remaining subcommands
|
||||
##
|
||||
## {{{
|
||||
|
||||
"subcmd:*" "CATCH_ALL_#_opt"
|
||||
"CATCH_ALL_#_opt" "* <<>> NO-OP // ::→chroma/main-chroma-std-aopt-SEMI-action"
|
||||
|
||||
## }}}
|
||||
)
|
||||
|
||||
# Called after entering just "git" on the command line
|
||||
→chroma/-git-first-call() {
|
||||
# Called for the first time - new command
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables
|
||||
FAST_HIGHLIGHT[chroma-git-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-git-got-subcommand]=0
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]=""
|
||||
FAST_HIGHLIGHT[chrome-git-got-msg1]=0
|
||||
FAST_HIGHLIGHT[chrome-git-got-anymsg]=0
|
||||
FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]=0
|
||||
FAST_HIGHLIGHT[chroma-git-checkout-new]=0
|
||||
FAST_HIGHLIGHT[chroma-git-fetch-multiple]=0
|
||||
FAST_HIGHLIGHT[chroma-git-branch-change]=0
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0
|
||||
FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=0
|
||||
FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=0
|
||||
return 1
|
||||
}
|
||||
|
||||
→chroma/-git-check-if-alias() {
|
||||
local _wrd="$1"
|
||||
local -a _result
|
||||
|
||||
typeset -ga fsh__chroma__git__aliases
|
||||
_result=( ${(M)fsh__chroma__git__aliases[@]:#${_wrd}[[:space:]]##*} )
|
||||
→chroma/main-chroma-print "Got is-alias-_result: $_result"
|
||||
[[ -n "$_result" ]] && \
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="${${${_result#* }## ##}%% *}"
|
||||
}
|
||||
|
||||
# A hook that returns the list of git's
|
||||
# available subcommands in $reply
|
||||
→chroma/-git-get-subcommands() {
|
||||
local __svalue
|
||||
integer __ivalue
|
||||
LANG=C .fast-run-command "git help -a" chroma-${FAST_HIGHLIGHT[chroma-current]}-subcmd-list "" $(( 15 * 60 ))
|
||||
if [[ "${__lines_list[1]}" = See* ]]; then
|
||||
# (**)
|
||||
# git >= v2.20, the aliases in the `git help -a' command
|
||||
__lines_list=( ${${${${(M)__lines_list[@]:#([[:space:]](#c3,3)[a-zA-Z0-9_]*|Command aliases)}##[[:space:]]##}//(#s)Command\ aliases(#e)/Command_aliases}} )
|
||||
__svalue="+${__lines_list[(I)Command_aliases]}"
|
||||
__lines_list[1,__svalue-1]=( ${(@)__lines_list[1,__svalue-1]%%[[:space:]]##*} )
|
||||
else
|
||||
# (**)
|
||||
# git < v2.20, add aliases through extra code
|
||||
__lines_list=( ${(s: :)${(M)__lines_list[@]:# [a-z]*}} )
|
||||
|
||||
__svalue=${#__lines_list}
|
||||
# This allows to check if the command is an alias - we want to
|
||||
# highlight the aliased command just like the target command of
|
||||
# the alias
|
||||
.fast-run-command "+git config --get-regexp 'alias.*'" chroma-${FAST_HIGHLIGHT[chroma-current]}-alias-list "[[:space:]]#alias." $(( 15 * 60 ))
|
||||
fi
|
||||
|
||||
__tmp=${#__lines_list}
|
||||
typeset -ga fsh__chroma__git__aliases
|
||||
fsh__chroma__git__aliases=( ${__lines_list[__svalue+1,__tmp]} )
|
||||
[[ ${__lines_list[__svalue]} != "Command_aliases" ]] && (( ++ __svalue, __ivalue=0, 1 )) || (( __ivalue=1 ))
|
||||
__lines_list[__svalue,__tmp]=( ${(@)__lines_list[__svalue+__ivalue,__tmp]%%[[:space:]]##*} )
|
||||
reply=( "${__lines_list[@]}" )
|
||||
}
|
||||
|
||||
# A generic handler
|
||||
→chroma/-git-verify-remote() {
|
||||
local _wrd="$4"
|
||||
.fast-run-git-command "git remote" "chroma-git-remotes-$PWD" "" 10
|
||||
[[ -n ${__lines_list[(r)$_wrd]} ]] && {
|
||||
__style=${FAST_THEME_NAME}correct-subtle; return 0
|
||||
} || {
|
||||
[[ $_wrd != *:* ]] && { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; }
|
||||
}
|
||||
}
|
||||
|
||||
# A generic handler - checks if given ref is correct
|
||||
→chroma/-git-verify-ref() {
|
||||
local _wrd="$4"
|
||||
_wrd="${_wrd%%:*}"
|
||||
.fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-refs-$PWD" "refs/heads" 10
|
||||
[[ -n ${__lines_list[(r)$_wrd]} ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 1; }
|
||||
}
|
||||
|
||||
# A generic handler - checks if given remote or group is correct
|
||||
→chroma/-git-verify-remote-or-group() {
|
||||
→chroma/-git-verify-remote "$@" && return 0
|
||||
# The check for a group is to follow below
|
||||
integer _start="$2" _end="$3"
|
||||
local _scmd="$1" _wrd="$4"
|
||||
}
|
||||
|
||||
# A generic handler - checks whether the file exists
|
||||
→chroma/-git-verify-file() {
|
||||
integer _start="$2" _end="$3" __pos __start __end
|
||||
local _wrd="$4" bg
|
||||
|
||||
[[ -f $_wrd ]] && {
|
||||
(( __start=_start, __end=_end, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*}
|
||||
((1))
|
||||
} || {
|
||||
(( __start=_start, __end=_end, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*}
|
||||
}
|
||||
|
||||
[[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \
|
||||
${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \
|
||||
${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}
|
||||
]] && \
|
||||
for (( __pos = 1; __pos <= (_end-_start); __pos++ )) {
|
||||
[[ ${_wrd[__pos]} == "/" ]] && {
|
||||
[[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && {
|
||||
(( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \
|
||||
reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}")
|
||||
((1))
|
||||
} || {
|
||||
(( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \
|
||||
reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# A generic handler - checks whether the file exists
|
||||
→chroma/-git-verify-file-or-dir() {
|
||||
integer _start="$2" _end="$3" __pos __start __end retval
|
||||
local _wrd="$4" bg
|
||||
|
||||
__style=
|
||||
[[ -f $_wrd || -d $_wrd ]] && {
|
||||
(( __start=_start, __end=_end, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*}
|
||||
((1))
|
||||
} || {
|
||||
(( __start=_start, __end=_end, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*}
|
||||
retval=1
|
||||
}
|
||||
|
||||
[[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \
|
||||
${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \
|
||||
${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}
|
||||
]] && \
|
||||
for (( __pos = 1; __pos <= (_end-_start); __pos++ )) {
|
||||
[[ ${_wrd[__pos]} == "/" ]] && {
|
||||
[[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && {
|
||||
(( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \
|
||||
reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}")
|
||||
((1))
|
||||
} || {
|
||||
(( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \
|
||||
reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}")
|
||||
}
|
||||
}
|
||||
}
|
||||
return $retval
|
||||
}
|
||||
|
||||
→chroma/-git-verify-branch() {
|
||||
local _wrd="$4"
|
||||
.fast-run-git-command "git for-each-ref --format='%(refname:short)'" "chroma-git-branches-$PWD" "refs/heads" 10
|
||||
if [[ -n ${__lines_list[(r)$_wrd]} ]] {
|
||||
__style=${FAST_THEME_NAME}correct-subtle; return 0
|
||||
} elif [[ -n ${__lines_list[(r)origin/$_wrd]} ]] {
|
||||
__style=${FAST_THEME_NAME}correct-subtle; return 0
|
||||
} else {
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle; return 1
|
||||
}
|
||||
}
|
||||
|
||||
→chroma/-git-verify-also-unfetched-ref() {
|
||||
local _wrd="$4"
|
||||
.fast-run-git-command "git config --get checkout.defaultRemote" \
|
||||
"chroma-git-defaultRemote-$PWD" "" 10
|
||||
local remote="${__lines_list[1]:-origin}"
|
||||
.fast-run-git-command "git rev-list --count --no-walk
|
||||
--glob=\"refs/remotes/$remote/$_wrd\"" \
|
||||
"chroma-git-unfetched-ref-$PWD" "" 10
|
||||
|
||||
(( __lines_list[1] )) && { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 1; }
|
||||
}
|
||||
|
||||
# A generic handler
|
||||
→chroma/-git-file-or-ubranch-or-commit-verify() {
|
||||
→chroma/-git-verify-commit "$@" && return
|
||||
→chroma/-git-verify-file "$@" && return
|
||||
→chroma/-git-verify-branch "$@" && return
|
||||
→chroma/-git-verify-also-unfetched-ref "$@"
|
||||
}
|
||||
|
||||
# A generic handler
|
||||
→chroma/-git-file-or-dir-or-ubranch-or-commit-verify() {
|
||||
→chroma/-git-verify-commit "$@" && return
|
||||
→chroma/-git-verify-file-or-dir "$@" && return
|
||||
→chroma/-git-verify-branch "$@" && return
|
||||
→chroma/-git-verify-also-unfetched-ref "$@"
|
||||
}
|
||||
|
||||
# A generic handler
|
||||
→chroma/-git-verify-correct-branch-name() {
|
||||
local _wrd="$4"
|
||||
→chroma/-git-verify-commit "$@" && \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 0; }
|
||||
|
||||
→chroma/-git-verify-remote "$@" && \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 0; }
|
||||
|
||||
[[ "$_wrd" != ./* && "$_wrd" != *..* && "$_wrd" != *[~\^\ $'\t']* &&
|
||||
"$_wrd" != */ && "$_wrd" != *.lock && "$_wrd" != *\\* ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 1; }
|
||||
}
|
||||
|
||||
# A generic handler that checks if given commit reference is correct
|
||||
→chroma/-git-verify-commit() {
|
||||
local _wrd="$4"
|
||||
__lines_list=()
|
||||
.fast-run-git-command --status "git rev-parse --verify --quiet \"$_wrd\"" \
|
||||
"chroma-git-commits-$PWD-$_wrd" "" $(( 1.5 * 60 ))
|
||||
if (( __lines_list[1] == 0 )); then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
return 0
|
||||
fi
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
return 1
|
||||
}
|
||||
|
||||
# A generic handler that checks if given commit reference
|
||||
# is correct or if it's a file that exists
|
||||
→chroma/-git-verify-commit-or-file() {
|
||||
→chroma/-git-verify-commit "$@" && return
|
||||
→chroma/-git-verify-file "$@"
|
||||
}
|
||||
|
||||
# A generic handler that checks if given commit reference
|
||||
# is correct or if it's a file or directives that exists
|
||||
→chroma/-git-verify-commit-or-file-or-dir() {
|
||||
→chroma/-git-verify-commit "$@" && return
|
||||
→chroma/-git-verify-file-or-dir "$@"
|
||||
}
|
||||
|
||||
# A generic handler that checks if given revision range
|
||||
# is correct or if a file of that name exists
|
||||
→chroma/-git-verify-rev-range-or-file() {
|
||||
local _wrd="$4"
|
||||
|
||||
→chroma/-git-verify-commit "$@" && return 0
|
||||
|
||||
if [[ "$_wrd" = *..* ]]; then
|
||||
(( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] )) && {
|
||||
→chroma/-git-verify-file "$@" && return 0
|
||||
__style=${FAST_THEME_NAME}unknown-token
|
||||
return 1
|
||||
}
|
||||
|
||||
__style=""
|
||||
return 0
|
||||
fi
|
||||
|
||||
→chroma/-git-verify-file "$@" && \
|
||||
{ FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; }
|
||||
|
||||
__style=""
|
||||
return 1
|
||||
}
|
||||
|
||||
→chroma/-git-verify-tag-name() {
|
||||
local _wrd="$4"
|
||||
.fast-run-git-command "git tag" "chroma-git-tags-$PWD" "" $(( 2*60 ))
|
||||
[[ -n ${__lines_list[(r)$_wrd]} ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
}
|
||||
|
||||
# A handler for the commit's -m/--message options.Currently
|
||||
# does the same what →chroma/main-chroma-std-aopt-action does
|
||||
→chroma/-git-commit-msg-opt-action() {
|
||||
→chroma/main-chroma-std-aopt-action "$@"
|
||||
}
|
||||
|
||||
# A handler for the commit's -m/--message options' argument
|
||||
→chroma/-git-commit-msg-opt-ARG-action() {
|
||||
integer _start="$2" _end="$3"
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
(( __start >= 0 )) || return
|
||||
|
||||
# Match the message body in case of an --message= option
|
||||
if [[ "$_wrd" = (#b)(--message=)(*) && -n "${match[2]}" ]]; then
|
||||
_wrd="${(Q)${match[2]//\`/x}}"
|
||||
# highlight --message=>>something<<
|
||||
reply+=("$(( __start+10 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}")
|
||||
elif [[ "$_wrd" != --message ]]; then
|
||||
# highlight the message's body
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}")
|
||||
fi
|
||||
|
||||
integer length=${FAST_HIGHLIGHT[git-cmsg-len]:-50}
|
||||
|
||||
if (( ${#_wrd} > length )); then
|
||||
for (( __idx1 = 1, __idx2 = 1; __idx1 <= length; ++ __idx1, ++ __idx2 )); do
|
||||
# Use __arg from the fast-highlight-process's scope
|
||||
while [[ "${__arg[__idx2]}" != "${_wrd[__idx1]}" ]]; do
|
||||
(( ++ __idx2 ))
|
||||
(( __idx2 > __asize )) && { __idx2=-1; break; }
|
||||
done
|
||||
(( __idx2 == -1 )) && break
|
||||
done
|
||||
if (( __idx2 != -1 )); then
|
||||
if [[ -n "${match[1]}" ]]; then
|
||||
reply+=("$(( __start+__idx2 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
else
|
||||
reply+=("$(( __start+__idx2-1 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# A RESET handler
|
||||
# TODO: differentiate tree-ish from commit
|
||||
→chroma/-git-RESET-verify-commit-or-file() {
|
||||
→chroma/-git-verify-commit "$@" && {
|
||||
→chroma/-git-verify-file "$@" && {
|
||||
# TODO: with -p/--patch, the <paths> are optional,
|
||||
# and this argument will be taken as a commit in a
|
||||
# specific circumstances
|
||||
FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1
|
||||
return 0
|
||||
}
|
||||
|
||||
(( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] ||
|
||||
FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit] )) && \
|
||||
{ __style=${FAST_THEME_NAME}unknown-token; return 1; }
|
||||
|
||||
FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=1
|
||||
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
→chroma/-git-verify-file "$@" && \
|
||||
{ FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; }
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,89 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars
|
||||
integer __idx1 __idx2
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-grep-counter]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-grep-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-grep-counter] ))
|
||||
|
||||
# First non-option token is the pattern (regex), we will
|
||||
# highlight it.
|
||||
if (( FAST_HIGHLIGHT[chroma-grep-counter] == 1 )); then
|
||||
[[ "$__wrd" = \"* ]] && __style=${FAST_THEME_NAME}double-quoted-argument
|
||||
[[ "$__wrd" = \'* ]] && __style=${FAST_THEME_NAME}single-quoted-argument
|
||||
[[ "$__wrd" = \$\'* ]] && __style=${FAST_THEME_NAME}dollar-quoted-argument
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
__style=""
|
||||
|
||||
__chars="*+\\)([]^\$"
|
||||
__idx1=__start_pos
|
||||
__idx2=__start_pos
|
||||
while [[ "$__wrd" = (#b)[^$__chars]#([\\][\\])#((+|\*|\[|\]|\)|\(|\^|\$)|[\\](+|\*|\[|\]|\)|\(|\^|\$))(*) ]]; do
|
||||
if [[ -n "${match[3]}" ]]; then
|
||||
__idx1+=${mbegin[3]}-1
|
||||
__idx2=__idx1+${mend[3]}-${mbegin[3]}+1
|
||||
(( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}for-loop-operator]}")
|
||||
__idx1=__idx2
|
||||
else
|
||||
__idx1+=${mbegin[5]}-1
|
||||
fi
|
||||
__wrd="${match[5]}"
|
||||
done
|
||||
elif (( FAST_HIGHLIGHT[chroma-grep-counter] == 2 )); then
|
||||
# Handle paths, etc. normally - just pass-through to the big
|
||||
# highlighter (the main FSH highlighter, used before chromas).
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,51 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
if (( __first_call )); then
|
||||
chroma/-git.ch $*
|
||||
return 1
|
||||
fi
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" != -* ]] && (( FAST_HIGHLIGHT[chroma-git-got-subcommand] == 0 )); then
|
||||
.fast-run-command "git config --get-regexp 'alias.*'" chroma-git-alias-list "" $(( 5 * 60 ))
|
||||
# Grep for line: alias.{user-entered-subcmd}[[:space:]], and remove alias. prefix
|
||||
__lines_list=( ${${(M)__lines_list[@]:#alias.${__wrd}[[:space:]]##*}#alias.} )
|
||||
|
||||
if (( ${#__lines_list} > 0 )); then
|
||||
# (*)
|
||||
# First remove alias name (#*[[:space:]]) and the space after it, then
|
||||
# remove any leading spaces from what's left (##[[:space:]]##), then
|
||||
# remove everything except the first word that's in the left line
|
||||
# (%%[[:space:]]##*, i.e.: "everything from right side up to any space")
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="${${${__lines_list[1]#*[[:space:]]}##[[:space:]]##}%%[[:space:]]##*}"
|
||||
else
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="$__wrd"
|
||||
fi
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "browse" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "ci-status" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "compare" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "create" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "delete" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "fork" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "issue" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "pr" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "pull-request" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "release" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "sync" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-got-subcommand]=1
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}")
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1 ))
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$4
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
chroma/-git.ch $*
|
|
@ -0,0 +1,117 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (C) 2019 by Philippe Troin (F-i-f on GitHub)
|
||||
# All rights reserved.
|
||||
#
|
||||
# The only licensing for this file follows.
|
||||
#
|
||||
# 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.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
setopt local_options extendedglob warn_create_global typeset_silent
|
||||
|
||||
# Keep chroma-takever state meaning: until ;, handle highlighting via chroma.
|
||||
# So the below 8192 assignment takes care that next token will be routed to chroma.
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style option_start=0 option_end=0 number_start=0 number_end=0
|
||||
local -a match mbegin mend
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global string variables.
|
||||
FAST_HIGHLIGHT[ionice-option-argument]=0
|
||||
|
||||
# Set style for region_highlight entry. It is used below in
|
||||
# '[[ -n "$__style" ]] ...' line, which adds highlight entry,
|
||||
# like "10 12 fg=green", through `reply' array.
|
||||
#
|
||||
# Could check if command `example' exists and set `unknown-token'
|
||||
# style instead of `command'
|
||||
__style=${FAST_THEME_NAME}precommand
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if (( FAST_HIGHLIGHT[ionice-option-argument] )); then
|
||||
(( FAST_HIGHLIGHT[ionice-option-argument] = 0 ))
|
||||
[[ $__wrd == [0-9]# ]] && __style=${FAST_THEME_NAME}mathnum || __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
else
|
||||
case $__wrd in
|
||||
--(class(data|)|(u|p(g|))id))
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
FAST_HIGHLIGHT[ionice-option-argument]=1
|
||||
;;
|
||||
-[cnpPu])
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
FAST_HIGHLIGHT[ionice-option-argument]=1
|
||||
;;
|
||||
--*)
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
;;
|
||||
-*)
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
;;
|
||||
*)
|
||||
this_word=1
|
||||
next_word=2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
# If 1 will be added to __start_pos, this will highlight "oken".
|
||||
# If 1 will be subtracted from __end_pos, this will highlight "toke".
|
||||
# $PREBUFFER is for specific situations when users does command \<ENTER>
|
||||
# i.e. when multi-line command using backslash is entered.
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code can do
|
||||
# it itself (and it does in other chromas) and skip setting __style to
|
||||
# this way disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves.
|
||||
# _start_pos=$_end_pos advainces pointers in command line buffer.
|
||||
#
|
||||
# To pass through means to `return 1'. The highlighting of
|
||||
# this single token is then done by fast-syntax-highlighting's
|
||||
# main code and chroma doesn't have to do anything.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,59 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
#
|
||||
# The `lab' tool after which this chroma is modeled after:
|
||||
# https://github.com/zaquestion/lab
|
||||
#
|
||||
(( next_word = 2 | 8192 ))
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
if (( __first_call )); then
|
||||
chroma/-git.ch $*
|
||||
return 1
|
||||
fi
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" != -* ]] && (( FAST_HIGHLIGHT[chroma-git-got-subcommand] == 0 )); then
|
||||
.fast-run-command "git config --get-regexp 'alias.*'" chroma-git-alias-list "" $(( 5 * 60 ))
|
||||
# Grep for line: alias.{user-entered-subcmd}[[:space:]], and remove alias. prefix
|
||||
__lines_list=( ${${(M)__lines_list[@]:#alias.${__wrd}[[:space:]]##*}#alias.} )
|
||||
|
||||
if (( ${#__lines_list} > 0 )); then
|
||||
# (*)
|
||||
# First remove alias name (#*[[:space:]]) and the space after it, then
|
||||
# remove any leading spaces from what's left (##[[:space:]]##), then
|
||||
# remove everything except the first word that's in the left line
|
||||
# (%%[[:space:]]##*, i.e.: "everything from right side up to any space")
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="${${${__lines_list[1]#*[[:space:]]}##[[:space:]]##}%%[[:space:]]##*}"
|
||||
else
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="$__wrd"
|
||||
fi
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "browse" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "ci" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "mr" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "project" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "snippet" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "ci-status" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "compare" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "create" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "delete" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "fork" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "issue" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "pr" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "pull-request" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "release" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "sync" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-got-subcommand]=1
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}")
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1 ))
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$4
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
chroma/-git.ch $*
|
|
@ -0,0 +1,105 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `make'.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
local -a __lines_list reply2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables.
|
||||
FAST_HIGHLIGHT[chroma-make-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-make-skip-two]=0
|
||||
FAST_HIGHLIGHT[chroma-make-custom-dir]="./"
|
||||
FAST_HIGHLIGHT[chroma-make-custom-file]="Makefile"
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-dir-opt]=0
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-file-opt]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* || "$__wrd" = *=* ]]; then
|
||||
[[ "$__wrd" = *=* ]] && {
|
||||
__style=${FAST_THEME_NAME}variable
|
||||
} || {
|
||||
__style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
}
|
||||
|
||||
if [[ "$__wrd" = (-I|-o|-W) ]]; then
|
||||
FAST_HIGHLIGHT[chroma-make-skip-two]=1
|
||||
elif [[ "$__wrd" = "-C" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-dir-opt]=1
|
||||
elif [[ "$__wrd" = "-f" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-file-opt]=1
|
||||
fi
|
||||
else
|
||||
if (( FAST_HIGHLIGHT[chroma-make-skip-two] )); then
|
||||
FAST_HIGHLIGHT[chroma-make-skip-two]=0
|
||||
elif (( FAST_HIGHLIGHT[chroma-make-got-custom-dir-opt] )); then
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-dir-opt]=0
|
||||
FAST_HIGHLIGHT[chroma-make-custom-dir]="$__wrd"
|
||||
elif (( FAST_HIGHLIGHT[chroma-make-got-custom-file-opt] )); then
|
||||
FAST_HIGHLIGHT[chroma-make-got-custom-file-opt]=0
|
||||
FAST_HIGHLIGHT[chroma-make-custom-file]="$__wrd"
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-make-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-make-counter] ))
|
||||
if (( FAST_HIGHLIGHT[chroma-make-counter] == 1 )); then
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
|
||||
if [[ -f "${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}" ]] && \
|
||||
.fast-make-targets < "${FAST_HIGHLIGHT[chroma-make-custom-dir]%/}/${FAST_HIGHLIGHT[chroma-make-custom-file]}"
|
||||
then
|
||||
if [[ "${reply2[(r)$__wrd]}" ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
else
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Pass-through to the big-loop outside
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,138 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (C) 2019 by Philippe Troin (F-i-f on GitHub)
|
||||
# All rights reserved.
|
||||
#
|
||||
# The only licensing for this file follows.
|
||||
#
|
||||
# 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.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
setopt local_options extendedglob warn_create_global typeset_silent
|
||||
|
||||
# Keep chroma-takever state meaning: until ;, handle highlighting via chroma.
|
||||
# So the below 8192 assignment takes care that next token will be routed to chroma.
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style option_start=0 option_end=0 number_start=0 number_end=0
|
||||
local -a match mbegin mend
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global string variables.
|
||||
FAST_HIGHLIGHT[nice-arg-count]=0
|
||||
FAST_HIGHLIGHT[nice-increment-argument]=0
|
||||
|
||||
# Set style for region_highlight entry. It is used below in
|
||||
# '[[ -n "$__style" ]] ...' line, which adds highlight entry,
|
||||
# like "10 12 fg=green", through `reply' array.
|
||||
#
|
||||
# Could check if command `example' exists and set `unknown-token'
|
||||
# style instead of `command'
|
||||
__style=${FAST_THEME_NAME}precommand
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if (( FAST_HIGHLIGHT[nice-increment-argument] )); then
|
||||
(( FAST_HIGHLIGHT[nice-increment-argument] = 0 ))
|
||||
[[ $__wrd = (-|+|)[0-9]## ]] \
|
||||
&& __style=${FAST_THEME_NAME}mathnum \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
else
|
||||
case $__wrd in
|
||||
-(-|+|)[0-9]##)
|
||||
(( option_start = __start_pos-${#PREBUFFER} ,
|
||||
option_end = option_start+1 ,
|
||||
number_start = option_end ,
|
||||
number_end = __end_pos-${#PREBUFFER} ))
|
||||
option_style=${FAST_THEME_NAME}single-hyphen-option
|
||||
;;
|
||||
(#b)(--adjustment)(=(-|+|)[0-9]#|))
|
||||
(( option_start = __start_pos-${#PREBUFFER} ,
|
||||
option_end = option_start+mend[1] ))
|
||||
option_style=${FAST_THEME_NAME}double-hyphen-option
|
||||
[[ -z $match[2] ]] \
|
||||
&& (( FAST_HIGHLIGHT[nice-increment-argument] = 1 )) \
|
||||
|| (( option_end += 1 ,
|
||||
number_start = option_start+mbegin[2]-mbegin[1]+1 ,
|
||||
number_end = __end_pos-${#PREBUFFER} ))
|
||||
;;
|
||||
-n)
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
FAST_HIGHLIGHT[nice-increment-argument]=1
|
||||
;;
|
||||
--*)
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
;;
|
||||
-*)
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
;;
|
||||
*)
|
||||
this_word=1
|
||||
next_word=2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
(( option_start > 0 && option_end )) \
|
||||
&& reply+=("$option_start $option_end ${FAST_HIGHLIGHT_STYLES[$option_style]}")
|
||||
(( number_start > 0 && number_end )) \
|
||||
&& reply+=("$number_start $number_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]}")
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
# If 1 will be added to __start_pos, this will highlight "oken".
|
||||
# If 1 will be subtracted from __end_pos, this will highlight "toke".
|
||||
# $PREBUFFER is for specific situations when users does command \<ENTER>
|
||||
# i.e. when multi-line command using backslash is entered.
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code can do
|
||||
# it itself (and it does in other chromas) and skip setting __style to
|
||||
# this way disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves.
|
||||
# _start_pos=$_end_pos advainces pointers in command line buffer.
|
||||
#
|
||||
# To pass through means to `return 1'. The highlighting of
|
||||
# this single token is then done by fast-syntax-highlighting's
|
||||
# main code and chroma doesn't have to do anything.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,58 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
typeset -A subcommands
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" subcommand
|
||||
subcommands=(
|
||||
help "_"
|
||||
general "help status hostname permissions logging _"
|
||||
networking "help on off connectivity _"
|
||||
radio "help all wifi wwan _"
|
||||
connection "help show up down add modify clone edit delete monitor reload load import export _"
|
||||
device "help status show set connect reapply modify disconnect delete monitor wifi lldp _"
|
||||
agent "help secret polkit all _"
|
||||
monitor "help _"
|
||||
_ "_"
|
||||
)
|
||||
|
||||
if (( __first_call )); then
|
||||
FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]=""
|
||||
FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]=""
|
||||
return 1
|
||||
elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif [[ "$2" = -* ]]; then
|
||||
return 1
|
||||
elif [[ -z ${FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]} ]]; then
|
||||
for subcommand in ${(@k)subcommands}; do
|
||||
[[ $subcommand = $__wrd* ]] && break || subcommand="_"
|
||||
done
|
||||
if [[ $subcommand = _ ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
else
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}")
|
||||
fi
|
||||
FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]="$subcommand"
|
||||
elif [[ -z ${FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]} ]]; then
|
||||
for subcommand in ${(s. .)subcommands[${FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]}]}; do
|
||||
[[ "$subcommand" = $__wrd* ]] && break || subcommand="_"
|
||||
done
|
||||
if [[ $subcommand = _ ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
else
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}")
|
||||
fi
|
||||
FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]="$subcommand"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
|
@ -0,0 +1,37 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
|
||||
if (( __first_call )); then
|
||||
FAST_HIGHLIGHT[chroma-node-file]=1
|
||||
elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif [[ "$__wrd" = -- ]]; then
|
||||
FAST_HIGHLIGHT[chroma-node-file]=2
|
||||
elif (( FAST_HIGHLIGHT[chroma-node-file] != 2 )) && [[ "$__wrd" = -* ]]; then
|
||||
if [[ "$__wrd" = -*e* || "$__wrd" = --eval ]]; then
|
||||
FAST_HIGHLIGHT[chroma-node-file]=0
|
||||
fi
|
||||
elif (( FAST_HIGHLIGHT[chroma-node-file] )); then
|
||||
if [[ "$__wrd" = debug || "$__wrd" = inspect ]]; then
|
||||
__style=${FAST_THEME_NAME}subcommand
|
||||
else
|
||||
FAST_HIGHLIGHT[chroma-node-file]=0
|
||||
if [[ -f ${~__wrd} || -f ${~__wrd}.js || -f ${~__wrd}/index.js ]]; then
|
||||
__style=${FAST_THEME_NAME}path
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
fi
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
|
@ -0,0 +1,383 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (c) 2018 plexigras
|
||||
#
|
||||
# The old chroma function for command `git'. It colorizes the part of command
|
||||
# line that holds `git' invocation.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
local -a __lines_list chroma_git_remote_subcommands
|
||||
chroma_git_remote_subcommands=(add rename remove set-head set-branches get-url set-url set-url set-url show prune update)
|
||||
|
||||
if (( __first_call )); then
|
||||
# Called for the first time - new command
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables
|
||||
FAST_HIGHLIGHT[chroma-git-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-git-got-subcommand]=0
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]=""
|
||||
FAST_HIGHLIGHT[chrome-git-got-msg1]=0
|
||||
FAST_HIGHLIGHT[chrome-git-got-anymsg]=0
|
||||
FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]=0
|
||||
FAST_HIGHLIGHT[chroma-git-checkout-new]=0
|
||||
FAST_HIGHLIGHT[chroma-git-fetch-multiple]=0
|
||||
FAST_HIGHLIGHT[chroma-git-branch-change]=0
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0
|
||||
return 1
|
||||
else
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = "--" ]]; then
|
||||
FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]=1
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
elif [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-git-got-subcommand]} -eq 0 ]]; then
|
||||
# Options occuring before a subcommand
|
||||
if (( FAST_HIGHLIGHT[chroma-git-option-with-argument-active] == 0 )); then
|
||||
if [[ "$__wrd" = -[^[:space:]-]#C ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=2
|
||||
elif [[ "$__wrd" = -[^[:space:]-]#c ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=1
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
else
|
||||
# If at e.g. '>' or destination/source spec (of the redirection)
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
# If at main git option taking argument in a separate word (-C and -c)
|
||||
elif (( FAST_HIGHLIGHT[chroma-git-option-with-argument-active] > 0 && \
|
||||
0 == FAST_HIGHLIGHT[chroma-git-got-subcommand] ))
|
||||
then
|
||||
# Remember the value
|
||||
__idx2=${FAST_HIGHLIGHT[chroma-git-option-with-argument-active]}
|
||||
# Reset the is-argument mark-field
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0
|
||||
|
||||
(( __idx2 == 2 )) && return 1
|
||||
# Other options' args (i.e. arg of -c) aren't routed to the big-loop
|
||||
# as they aren't paths and aren't handled in any special way there
|
||||
elif (( FAST_HIGHLIGHT[chroma-git-got-subcommand] == 0 )); then
|
||||
FAST_HIGHLIGHT[chroma-git-got-subcommand]=1
|
||||
|
||||
# Check if the command is an alias - we want to highlight the
|
||||
# aliased command just like the target command of the alias
|
||||
.fast-run-command "git config --get-regexp 'alias.*'" chroma-git-alias-list "" $(( 10 * 60 ))
|
||||
# Grep for line: alias.{user-entered-subcmd}[[:space:]], and remove alias. prefix
|
||||
__lines_list=( ${${(M)__lines_list[@]:#alias.${__wrd}[[:space:]]##*}#alias.} )
|
||||
|
||||
if (( ${#__lines_list} > 0 )); then
|
||||
# (*)
|
||||
# First remove alias name (#*[[:space:]]) and the space after it, then
|
||||
# remove any leading spaces from what's left (##[[:space:]]##), then
|
||||
# remove everything except the first word that's in the left line
|
||||
# (%%[[:space:]]##*, i.e.: "everything from right side up to any space")
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="${${${__lines_list[1]#*[[:space:]]}##[[:space:]]##}%%[[:space:]]##*}"
|
||||
else
|
||||
FAST_HIGHLIGHT[chroma-git-subcommand]="$__wrd"
|
||||
fi
|
||||
if (( __start_pos >= 0 )); then
|
||||
# if subcommand exists
|
||||
LANG=C .fast-run-command "git help -a" chroma-git-subcmd-list "" $(( 10 * 60 ))
|
||||
# (s: :) will split on every space, but because the expression
|
||||
# isn't double-quoted, the empty elements will be eradicated
|
||||
# Some further knowledge-base: s-flag is special, it skips
|
||||
# empty elements and creates an array (not a concatenated
|
||||
# string) even when double-quoted. The normally needed @-flag
|
||||
# that logically breaks the concaetnated string back into array
|
||||
# in case of double-quoting has additional effect for s-flag:
|
||||
# it finally blocks empty-elements eradication.
|
||||
if [[ "${__lines_list[1]}" = See* ]]; then
|
||||
# (**)
|
||||
# git >= v2.20
|
||||
__lines_list=( ${(M)${${${(M)__lines_list[@]:# [[:blank:]]#[a-z]*}##[[:blank:]]##}%%[[:blank:]]##*}:#${FAST_HIGHLIGHT[chroma-git-subcommand]}} )
|
||||
else
|
||||
# (**)
|
||||
# git < v2.20
|
||||
__lines_list=( ${(M)${(s: :)${(M)__lines_list[@]:# [a-z]*}}:#${FAST_HIGHLIGHT[chroma-git-subcommand]}} )
|
||||
fi
|
||||
|
||||
# Above we've checked:
|
||||
# 1) If given subcommand is an alias (*)
|
||||
# 2) If the command, or command pointed by the alias, exists (**)
|
||||
# 3) There's little problem, git v2.20 outputs aliases in git help -a,
|
||||
# which means that alias will be recognized as correct if it will
|
||||
# point at another alias or on itself. That's a minor problem, a
|
||||
# TODO for future planned optimization for v2.20 Git
|
||||
# 4) Notice that the above situation is better than the previous - the
|
||||
# alias is being verified to point to a valid git subcommand
|
||||
# That's all that's needed to decide on the correctnes:
|
||||
if (( ${#__lines_list} > 0 )); then
|
||||
__style=${FAST_THEME_NAME}subcommand
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
fi
|
||||
# The counter includes the subcommand itself
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1 ))
|
||||
else
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__arg="${__arg//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "push" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "pull" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "fetch" ]] \
|
||||
&& (( ${FAST_HIGHLIGHT[chroma-git-fetch-multiple]} == 0 )); then
|
||||
# if not option
|
||||
if [[ "$__wrd" != -* || "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" -eq 1 ]]; then
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-git-counter] ))
|
||||
if (( __idx1 == 2 )); then
|
||||
.fast-run-git-command "git remote" "chroma-git-remotes" ""
|
||||
else
|
||||
__wrd="${__wrd%%:*}"
|
||||
.fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-branches" "refs/heads"
|
||||
fi
|
||||
# if remote/ref exists
|
||||
if [[ -n ${__lines_list[(r)$__wrd]} ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos+${#__wrd}-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
# if ref (__idx1 == 3) does not exist and subcommand is push
|
||||
elif (( __idx1 != 2 )) && [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "push" ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos+${#__wrd}-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
# if not existing remote name, because not an URL (i.e. no colon)
|
||||
elif [[ $__idx1 -eq 2 && $__wrd != *:* ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos+${#__wrd}-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
# if option
|
||||
else
|
||||
if [[ "$__wrd" = "--multiple" && "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "fetch" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-fetch-multiple]=1
|
||||
__style=${FAST_THEME_NAME}double-hyphen-option
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
elif (( ${FAST_HIGHLIGHT[chroma-git-fetch-multiple]} )) \
|
||||
&& [[ "$__wrd" != -* || "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" -eq 1 ]]; then
|
||||
.fast-run-git-command "git remote" "chroma-git-remotes" ""
|
||||
if [[ -n ${__lines_list[(r)$__wrd]} ]]; then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
fi
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "commit" ]]; then
|
||||
match[1]=""
|
||||
match[2]=""
|
||||
# if previous argument is -m or current argument is --message=something
|
||||
if (( FAST_HIGHLIGHT[chrome-git-got-msg1] == 1 && ! FAST_HIGHLIGHT[chrome-git-got-anymsg] )) \
|
||||
|| [[ "$__wrd" = (#b)(--message=)(*) && "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" = 0 ]]; then
|
||||
FAST_HIGHLIGHT[chrome-git-got-msg1]=0
|
||||
FAST_HIGHLIGHT[chrome-git-got-anymsg]=1
|
||||
if [[ -n "${match[1]}" ]]; then
|
||||
__wrd="${(Q)${match[2]//\`/x}}"
|
||||
# highlight (--message=)something
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__start_pos-${#PREBUFFER}+10, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}")
|
||||
# highlight --message=(something)
|
||||
(( __start=__start_pos-${#PREBUFFER}+10, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}")
|
||||
else
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}")
|
||||
fi
|
||||
local __firstline=${__wrd%%$'\n'*}
|
||||
if (( ${#__firstline} > 50 )); then
|
||||
for (( __idx1 = 1, __idx2 = 1; __idx1 <= 50; ++ __idx1, ++ __idx2 )); do
|
||||
while [[ "${__arg[__idx2]}" != "${__firstline[__idx1]}" ]]; do
|
||||
(( ++ __idx2 ))
|
||||
(( __idx2 > __asize )) && { __idx2=-1; break; }
|
||||
done
|
||||
(( __idx2 == -1 )) && break
|
||||
done
|
||||
if (( __idx2 != -1 )); then
|
||||
if [[ -n "${match[1]}" ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}+__idx2, __end=__end_pos-${#PREBUFFER}-$#__wrd+$#__firstline-1, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
else
|
||||
(( __start=__start_pos-${#PREBUFFER}+__idx2-1, __end=__end_pos-${#PREBUFFER}-$#__wrd+$#__firstline-1, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# if before --
|
||||
elif [[ "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" = 0 ]]; then
|
||||
if [[ "$__wrd" = -[^[:space:]-]#m ]]; then
|
||||
FAST_HIGHLIGHT[chrome-git-got-msg1]=1
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
# if after -- is file
|
||||
elif [[ -e "$__wrd" ]]; then
|
||||
__style=${FAST_THEME_NAME}path
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "checkout" ]] \
|
||||
|| [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "revert" ]] \
|
||||
|| [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "merge" ]] \
|
||||
|| [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "diff" ]] \
|
||||
|| [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "reset" ]] \
|
||||
|| [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "rebase" ]]; then
|
||||
|
||||
# if doing `git checkout -b ...'
|
||||
if [[ "$__wrd" = -[^[:space:]-]#b && "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "checkout" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-checkout-new]=1
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
# if command is not checkout -b something
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-checkout-new]}" = 0 ]]; then
|
||||
# if not option
|
||||
if [[ "$__wrd" != -* || "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" = 1 ]]; then
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-git-counter] ))
|
||||
if (( __idx1 == 2 )) || \
|
||||
[[ "$__idx1" = 3 && "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "diff" ]]; then
|
||||
# if is ref
|
||||
if command git rev-parse --verify --quiet "$__wrd" >/dev/null 2>&1; then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
# if is file and subcommand is checkout or diff
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "checkout" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "reset" \
|
||||
|| "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "diff" ]] && [[ -e ${~__wrd} ]]; then
|
||||
__style=${FAST_THEME_NAME}path
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "checkout" && \
|
||||
"1" = "$(command git rev-list --count --no-walk --glob="refs/remotes/${$(git \
|
||||
config --get checkout.defaultRemote):-*}/$__wrd")" ]]
|
||||
then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
fi
|
||||
# if option
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
# if option
|
||||
elif [[ "${FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]}" = 0 && "$__wrd" = -* ]]; then
|
||||
return 1
|
||||
fi
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "remote" && "$__wrd" != -* ]]; then
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-git-counter] ))
|
||||
if [[ "$__idx1" = 2 ]]; then
|
||||
if (( ${chroma_git_remote_subcommands[(I)$__wrd]} )); then
|
||||
FAST_HIGHLIGHT[chroma-git-remote-subcommand]="$__wrd"
|
||||
__style=${FAST_THEME_NAME}subcommand
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
elif [[ "$__idx1" = 3 && "$FAST_HIGHLIGHT[chroma-git-remote-subcommand]" = "add" ]]; then
|
||||
.fast-run-git-command "git remote" "chroma-git-remotes" ""
|
||||
if [[ -n ${__lines_list[(r)$__wrd]} ]]; then
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
elif [[ "$__idx1" = 3 && -n "$FAST_HIGHLIGHT[chroma-git-remote-subcommand]" ]]; then
|
||||
.fast-run-git-command "git remote" "chroma-git-remotes" ""
|
||||
if [[ -n ${__lines_list[(r)$__wrd]} ]]; then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
fi
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "branch" ]]; then
|
||||
if [[ "$__wrd" = --delete \
|
||||
|| "$__wrd" = --edit-description \
|
||||
|| "$__wrd" = --set-upstream-to=* \
|
||||
|| "$__wrd" = --unset-upstream \
|
||||
|| "$__wrd" = -[^[:space:]-]#d \
|
||||
|| "$__wrd" = -[^[:space:]-]#D ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-branch-change]=1
|
||||
return 1
|
||||
elif [[ "$__wrd" != -* ]]; then
|
||||
.fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-branches" "refs/heads"
|
||||
if [[ -n ${__lines_list[(r)$__wrd]} ]]; then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
elif (( FAST_HIGHLIGHT[chroma-git-branch-change] )); then
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
elif [[ "${FAST_HIGHLIGHT[chroma-git-subcommand]}" = "tag" ]]; then
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-git-option-with-argument-active]}" -le 0 ]]; then
|
||||
if [[ "$__wrd" = -[^[:space:]-]#(u|m) ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=1
|
||||
elif [[ "$__wrd" = -[^[:space:]-]#F ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=2
|
||||
elif [[ "$__wrd" = -[^[:space:]-]#d ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=3
|
||||
elif [[ "$__wrd" = (--contains|--no-contains|--points-at|--merged|--no-merged) ]]; then
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=4
|
||||
fi
|
||||
if [[ "$__wrd" != -* ]]; then
|
||||
(( FAST_HIGHLIGHT[chroma-git-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-git-counter] ))
|
||||
if [[ ${FAST_HIGHLIGHT[chroma-git-counter]} -eq 2 ]]; then
|
||||
.fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-branches" "refs/heads"
|
||||
.fast-run-git-command "+git tag" "chroma-git-tags" ""
|
||||
[[ -n ${__lines_list[(r)$__wrd]} ]] && __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
elif [[ ${FAST_HIGHLIGHT[chroma-git-counter]} -eq 3 ]]; then
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
case "${FAST_HIGHLIGHT[chroma-git-option-with-argument-active]}" in
|
||||
(1)
|
||||
__style=${FAST_THEME_NAME}optarg-string
|
||||
;;
|
||||
(2)
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0
|
||||
return 1;
|
||||
;;
|
||||
(3)
|
||||
.fast-run-git-command "git tag" "chroma-git-tags" ""
|
||||
[[ -n ${__lines_list[(r)$__wrd]} ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
(4)
|
||||
if git rev-parse --verify --quiet "$__wrd" >/dev/null 2>&1; then
|
||||
__style=${FAST_THEME_NAME}correct-subtle
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
if [[ -n "$__style" ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
fi
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,80 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `perl'. It highlights code passed to perl
|
||||
# with -e option - does syntax check by calling `perl -ce', then highlights
|
||||
# as correct or incorrect code.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables.
|
||||
FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-perl-got-subcommand]} -eq 0 ]]; then
|
||||
__style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
|
||||
if [[ "$__wrd" = "-e" || ("$__wrd" = -*e* && "$__wrd" != --*) ]]; then
|
||||
FAST_HIGHLIGHT[chrome-perl-got-eswitch]=1
|
||||
fi
|
||||
else
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__arg="${__arg//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
if (( FAST_HIGHLIGHT[chrome-perl-got-eswitch] == 1 )); then
|
||||
FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0
|
||||
if perl -ce "$__wrd" >/dev/null 2>&1; then
|
||||
# Add correct-subtle style
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
else
|
||||
# Add incorrect-subtle style
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
else
|
||||
# Pass-through to the big-loop outside
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,17 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
|
||||
local __first_call="$1" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
(( __first_call )) && {
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}precommand]}")
|
||||
(( next_word = (next_word & ~2) | 4 | 1 ))
|
||||
} || {
|
||||
return 1
|
||||
}
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
return 0
|
|
@ -0,0 +1,86 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Highlights the special sequences like "%s" in string passed to `printf'.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __val
|
||||
integer __idx1 __idx2
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-printf-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-printf-counter-all]=1
|
||||
FAST_HIGHLIGHT[chroma-printf-message]=""
|
||||
FAST_HIGHLIGHT[chroma-printf-skip-two]=0
|
||||
return 1
|
||||
# Following call (not first one).
|
||||
} || {
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
(( FAST_HIGHLIGHT[chroma-printf-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-printf-counter-all] ))
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
if [[ "$__wrd" = "-v" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-printf-skip-two]=1
|
||||
fi
|
||||
return 1
|
||||
else
|
||||
# Count non-option tokens.
|
||||
if (( FAST_HIGHLIGHT[chroma-printf-skip-two] )); then
|
||||
FAST_HIGHLIGHT[chroma-printf-skip-two]=0
|
||||
return 1
|
||||
else
|
||||
(( FAST_HIGHLIGHT[chroma-printf-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-printf-counter] ))
|
||||
if [[ "$__idx1" -eq 1 ]]; then
|
||||
[[ "$__wrd" = \"* ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}")
|
||||
[[ "$__wrd" = \'* ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}single-quoted-argument]}")
|
||||
FSH_LIST=() # use fsh_sy_h_append function to write to FSH_LIST
|
||||
: "${__wrd//(#m)\%[\#\+\ 0-]#[0-9]#([.][0-9]#)(#c0,1)[diouxXfFeEgGaAcsb]/$(( fsh_sy_h_append($MBEGIN, $MEND) ))}";
|
||||
for __val in "${FSH_LIST[@]}" ; do
|
||||
__idx1=$(( __start_pos + ${__val%%;;*} ))
|
||||
__idx2=__idx1+${__val##*;;}-${__val%%;;*}+1
|
||||
(( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}-1, __start >= 0 )) && \
|
||||
reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]}")
|
||||
done
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code
|
||||
# can do it itself and skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,81 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `ruby'. It highlights code passed to ruby
|
||||
# with -e option - does syntax check by calling `ruby -ce', then highlights
|
||||
# as correct or incorrect code.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global variables.
|
||||
FAST_HIGHLIGHT[chrome-ruby-got-eswitch]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-ruby-got-subcommand]} -eq 0 ]]; then
|
||||
__style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
|
||||
if [[ "$__wrd" = "-e" || ("$__wrd" = -*e* && "$__wrd" != --*) ]]; then
|
||||
FAST_HIGHLIGHT[chrome-ruby-got-eswitch]=1
|
||||
fi
|
||||
else
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__arg="${__arg//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
if (( FAST_HIGHLIGHT[chrome-ruby-got-eswitch] == 1 )); then
|
||||
FAST_HIGHLIGHT[chrome-ruby-got-eswitch]=0
|
||||
if ruby -ce "$__wrd" >/dev/null 2>&1; then
|
||||
# Add correct-subtle style
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}")
|
||||
else
|
||||
# Add incorrect-subtle style
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}")
|
||||
fi
|
||||
else
|
||||
# Pass-through to the big-loop outside
|
||||
return 1
|
||||
fi
|
||||
FAST_HIGHLIGHT[chrome-ruby-got-eswitch]=0
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,87 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Tracks scp command and emits message when one tries to pass port to hostspec.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars
|
||||
integer __idx1 __idx2
|
||||
local -a __results
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-scp-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-scp-counter-all]=1
|
||||
FAST_HIGHLIGHT[chroma-scp-message]=""
|
||||
FAST_HIGHLIGHT[chroma-scp-skip-two]=0
|
||||
return 1
|
||||
} || {
|
||||
(( FAST_HIGHLIGHT[chroma-scp-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-scp-counter-all] ))
|
||||
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
if [[ "$__wrd" = (-c|-F|-i|-l|-o|-P|-S) ]]; then
|
||||
FAST_HIGHLIGHT[chroma-scp-skip-two]=1
|
||||
fi
|
||||
else
|
||||
# Count non-option tokens.
|
||||
if (( FAST_HIGHLIGHT[chroma-scp-skip-two] )); then
|
||||
FAST_HIGHLIGHT[chroma-scp-skip-two]=0
|
||||
else
|
||||
(( FAST_HIGHLIGHT[chroma-scp-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-scp-counter] ))
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-scp-counter]}" -eq 1 ]]; then
|
||||
if [[ "$__arg" = [^:]##:[0-9]## ]]; then
|
||||
FAST_HIGHLIGHT[chroma-scp-message]+="Format of hostname incorrect, use -P to pass port number"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( ${#${(z)BUFFER}} <= FAST_HIGHLIGHT[chroma-scp-counter-all] )); then
|
||||
[[ -n "${FAST_HIGHLIGHT[chroma-scp-message]}" ]] && zle -M "${FAST_HIGHLIGHT[chroma-scp-message]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code
|
||||
# can do it itself and skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,72 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for `sh' shell. It colorizes string passed with -c option.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call=$1 __wrd=$2 __start_pos=$3 __end_pos=$4
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
local -a __lines_list
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command
|
||||
FAST_HIGHLIGHT[chrome-git-got-c]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ $__arg_type = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
__wrd=${${${(Q)__wrd}#[\"\']}%[\"\']}
|
||||
if [[ $__wrd = -* && $__wrd != -*c* ]]; then
|
||||
__style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option}
|
||||
else
|
||||
if (( FAST_HIGHLIGHT[chrome-git-got-c] == 1 )); then
|
||||
for (( __idx1 = 1, __idx2 = 1; __idx2 <= __asize; ++ __idx1 )); do
|
||||
[[ ${__arg[__idx2]} = ${__wrd[__idx1]} ]] && break
|
||||
while [[ ${__arg[__idx2]} != ${__wrd[__idx1]} ]]; do
|
||||
(( ++ __idx2 ))
|
||||
(( __idx2 > __asize )) && { __idx2=0; break; }
|
||||
done
|
||||
(( __idx2 == 0 )) && break
|
||||
[[ ${__arg[__idx2]} = ${__wrd[__idx1]} ]] && break
|
||||
done
|
||||
|
||||
FAST_HIGHLIGHT[chrome-git-got-c]=0
|
||||
(( _start_pos-__PBUFLEN >= 0 )) && \
|
||||
-fast-highlight-process "$PREBUFFER" "${__wrd}" "$(( __start_pos + __idx2 - 1 ))"
|
||||
elif [[ $__wrd = -*c* ]]; then
|
||||
FAST_HIGHLIGHT[chrome-git-got-c]=1
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
[[ -n $__style ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,75 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma for `source' builtin - verifies if file to be sourced compiles
|
||||
# correctly.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars __home=${XDG_CACHE_HOME:-$HOME/.cache}/fsh
|
||||
integer __idx1 __idx2
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-src-counter]=0
|
||||
__style=${FAST_THEME_NAME}builtin
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-src-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-src-counter] ))
|
||||
|
||||
if (( FAST_HIGHLIGHT[chroma-src-counter] == 1 )); then
|
||||
command mkdir -p "$__home"
|
||||
command cp -f "${__wrd}" "$__home" 2>/dev/null && {
|
||||
zcompile "$__home"/"${__wrd:t}" 2>/dev/null 1>&2 && __style=${FAST_THEME_NAME}correct-subtle || __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
}
|
||||
elif (( FAST_HIGHLIGHT[chroma-src-counter] == 2 )); then
|
||||
# Handle paths, etc. normally - just pass-through to the big
|
||||
# highlighter (the main FSH highlighter, used before chromas).
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does) and skip setting __style
|
||||
# to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,156 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (C) 2019 by Philippe Troin (F-i-f on GitHub)
|
||||
#
|
||||
# Tracks ssh command and emits message when one tries to pass port to hostspec.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
emulate -LR zsh
|
||||
setopt extended_glob warn_create_global typeset_silent
|
||||
|
||||
# This chroma guards that port number isn't passed in hostname (no :{port} occurs).
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style check_port=0 host_start_offset host_style user_style possible_host
|
||||
local -a match mbegin mend completions_user completions_host
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-ssh-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-ssh-counter-all]=1
|
||||
FAST_HIGHLIGHT[chroma-ssh-message]=""
|
||||
FAST_HIGHLIGHT[chroma-ssh-skip-two]=0
|
||||
return 1
|
||||
} || {
|
||||
# Following call, i.e. not the first one.
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
(( FAST_HIGHLIGHT[chroma-ssh-counter-all] += 1 ))
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
if [[ "$__wrd" = (-b|-c|-D|-E|-e|-F|-I|-i|-J|-L|-l|-m|-O|-o|-p|Q|R|-S|-W|-w) ]]; then
|
||||
FAST_HIGHLIGHT[chroma-ssh-skip-two]=1
|
||||
fi
|
||||
else
|
||||
if (( FAST_HIGHLIGHT[chroma-ssh-skip-two] )); then
|
||||
FAST_HIGHLIGHT[chroma-ssh-skip-two]=0
|
||||
else
|
||||
# Count non-option tokens.
|
||||
(( FAST_HIGHLIGHT[chroma-ssh-counter] += 1 ))
|
||||
if [[ "${FAST_HIGHLIGHT[chroma-ssh-counter]}" -eq 1 ]]; then
|
||||
if [[ $__arg = (#b)(([^@]#)(@)|)(*) ]]
|
||||
then
|
||||
[[ -n $match[2] ]] \
|
||||
&& {
|
||||
user_style=
|
||||
() {
|
||||
# Zstyle clobbers reply for sure
|
||||
zstyle -a ":completion:*:users" users completions_users
|
||||
}
|
||||
(( ! $#completions_users )) && completions_users=(${(k)userdirs})
|
||||
if (( $#completions_users )); then
|
||||
[[ $match[2] = ${~${:-(${(j:|:)completions_users})}} ]] \
|
||||
&& user_style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| user_style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
[[ -n $user_style ]] \
|
||||
&& (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}-(mend[5]-mend[2]), __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$user_style]}")
|
||||
}
|
||||
[[ -n $match[3] ]] \
|
||||
&& (( __start=__start_pos-${#PREBUFFER}+(mbegin[3]-mbegin[1]), __end=__end_pos-${#PREBUFFER}-(mend[5]-mend[3]), __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subtle-separator]}")
|
||||
|
||||
host_style=
|
||||
case $match[4] in
|
||||
(<->|<0-255>.<0-255>.<0-255>.<0-255>)
|
||||
host_style=${FAST_THEME_NAME}mathnum
|
||||
check_port=1
|
||||
;;
|
||||
(([0-9a-fA-F][0-9a-fA-F:]#|)::([0-9a-fA-F:]#[0-9a-fA-F]|)|[0-9a-fA-F]##:[0-9a-fA-F:]#[0-9a-fA-F])
|
||||
host_style=${FAST_THEME_NAME}mathnum
|
||||
;;
|
||||
(*)
|
||||
check_port=1
|
||||
;;
|
||||
esac
|
||||
possible_host=$match[4]
|
||||
(( host_start_offset = mbegin[4] - mbegin[1], host_end_offset = 0 ))
|
||||
|
||||
if (( check_port )) && [[ $possible_host = (#b)(*)(:[0-9]##) ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}+(host_start_offset+mbegin[2]-mbegin[1]), __end=__end_pos-host_end_offset-${#PREBUFFER}, __start >= 0,
|
||||
host_end_offset+=mend[2]-mend[1] )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") \
|
||||
&& possible_host=$match[1] \
|
||||
&& FAST_HIGHLIGHT[chroma-ssh-message]+="Format of hostname incorrect, use -p to pass port number"
|
||||
|
||||
fi
|
||||
|
||||
if [[ -z $host_style ]]; then
|
||||
() {
|
||||
# Zstyle clobbers reply for sure
|
||||
local mbegin mend match reply
|
||||
zstyle -a ":completion:*:hosts" hosts completions_host
|
||||
}
|
||||
(( ! $#completions_host && $+_cache_hosts )) && completions_host=($_cache_hosts[*])
|
||||
if (( $#completions_host )); then
|
||||
[[ $possible_host = ${~${:-(${(j:|:)completions_host})}} ]] \
|
||||
&& host_style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| host_style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -n $host_style ]] \
|
||||
&& (( __start=__start_pos-${#PREBUFFER}+host_start_offset, __end=__end_pos-${#PREBUFFER}-host_end_offset, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$host_style]}")
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
fi
|
||||
|
||||
(( next_word = 1 ))
|
||||
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( ${#${(z)BUFFER}} <= FAST_HIGHLIGHT[chroma-ssh-counter-all] )); then
|
||||
[[ -n "${FAST_HIGHLIGHT[chroma-ssh-message]}" ]] && zle -M "${FAST_HIGHLIGHT[chroma-ssh-message]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code
|
||||
# can do it itself and skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,25 @@
|
|||
# vim:ft=zsh:et:sw=4
|
||||
(( next_word = 2 | 8192 ))
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
|
||||
if (( __first_call )); then
|
||||
FAST_HIGHLIGHT[chroma-subcommand]=""
|
||||
return 1
|
||||
elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif [[ "$2" = -* ]]; then
|
||||
return 1
|
||||
elif [[ -z "${FAST_HIGHLIGHT[chroma-subcommand]}" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-subcommand]="$__wrd"
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}")
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
|
@ -0,0 +1,250 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
# Copyright (C) 2019 by Philippe Troin (F-i-f on GitHub)
|
||||
# All rights reserved.
|
||||
#
|
||||
# The only licensing for this file follows.
|
||||
#
|
||||
# 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.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
→chroma/-subversion.ch/parse-revision() {
|
||||
setopt local_options extendedglob warn_create_global typeset_silent
|
||||
local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end
|
||||
case $__wrd in
|
||||
(r|)[0-9]##) __style=${FAST_THEME_NAME}mathnum ;;
|
||||
(HEAD|BASE|COMITTED|PREV)) __style=${FAST_THEME_NAME}correct-subtle ;;
|
||||
'{'[^}]##'}') __style=${FAST_THEME_NAME}subtle-bg ;;
|
||||
*) __style=${FAST_THEME_NAME}incorrect-subtle ;;
|
||||
esac
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
}
|
||||
|
||||
→chroma/-subversion.ch/parse-target() {
|
||||
setopt local_options extendedglob warn_create_global typeset_silent
|
||||
local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end
|
||||
if [[ $__wrd == *@[^/]# ]]
|
||||
then
|
||||
local place=${__wrd%@[^/]#}
|
||||
local rev=$__wrd[$(($#place+2)),$#__wrd]
|
||||
if [[ -e $place ]]; then
|
||||
local __style
|
||||
[[ -d $place ]] && __style="${FAST_THEME_NAME}path-to-dir" || __style="${FAST_THEME_NAME}path"
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}-$#rev-1, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
fi
|
||||
(( __start=__start_pos-${#PREBUFFER}+$#place, __end=__end_pos-${#PREBUFFER}-$#rev, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}for-loop-separator]}")
|
||||
→chroma/-subversion.ch/parse-revision $rev $((__start_pos+$#place+1)) $__end_pos
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
setopt local_options extendedglob warn_create_global
|
||||
|
||||
# Keep chroma-takever state meaning: until ;, handle highlighting via chroma.
|
||||
# So the below 8192 assignment takes care that next token will be routed to chroma.
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
integer __idx1 __idx2
|
||||
|
||||
(( __first_call )) && {
|
||||
# Called for the first time - new command.
|
||||
# FAST_HIGHLIGHT is used because it survives between calls, and
|
||||
# allows to use a single global hash only, instead of multiple
|
||||
# global string variables.
|
||||
FAST_HIGHLIGHT[subversion-command]=$__wrd
|
||||
FAST_HIGHLIGHT[subversion-option-argument]=
|
||||
FAST_HIGHLIGHT[subversion-subcommand]=
|
||||
FAST_HIGHLIGHT[subversion-subcommand-arguments]=0
|
||||
|
||||
# Set style for region_highlight entry. It is used below in
|
||||
# '[[ -n "$__style" ]] ...' line, which adds highlight entry,
|
||||
# like "10 12 fg=green", through `reply' array.
|
||||
#
|
||||
# Could check if command `example' exists and set `unknown-token'
|
||||
# style instead of `command'
|
||||
__style=${FAST_THEME_NAME}command
|
||||
|
||||
} || {
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
case $FAST_HIGHLIGHT[subversion-command]/$FAST_HIGHLIGHT[subversion-subcommand] in
|
||||
svn/)
|
||||
case $__wrd in
|
||||
--username|-u) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--password|-p) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--config-(dir|option)) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
esac
|
||||
;;
|
||||
svn/?*)
|
||||
case $__wrd in
|
||||
--accept) FAST_HIGHLIGHT[subversion-option-argument]=accept;;
|
||||
--change|-c) FAST_HIGHLIGHT[subversion-option-argument]=revision;;
|
||||
--changelist|--cl) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--(set-|)depth) FAST_HIGHLIGHT[subversion-option-argument]=depth;;
|
||||
--diff(3|)-cmd) FAST_HIGHLIGHT[subversion-option-argument]=cmd;;
|
||||
--editor-cmd) FAST_HIGHLIGHT[subversion-option-argument]=cmd;;
|
||||
--encoding) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--file) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--limit|-l) FAST_HIGHLIGHT[subversion-option-argument]=number;;
|
||||
--message|-m) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--native-eol) FAST_HIGHLIGHT[subversion-option-argument]=eol;;
|
||||
--new|--old) FAST_HIGHLIGHT[subversion-option-argument]=target;;
|
||||
--revision|-r) FAST_HIGHLIGHT[subversion-option-argument]=revision-pair;;
|
||||
--show-revs) FAST_HIGHLIGHT[subversion-option-argument]=show-revs;;
|
||||
--strip) FAST_HIGHLIGHT[subversion-option-argument]=number;;
|
||||
--with-revprop) FAST_HIGHLIGHT[subversion-option-argument]=revprop;;
|
||||
esac
|
||||
;;
|
||||
svnadmin/*)
|
||||
case $__wrd in
|
||||
--config-dir) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--fs-type) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--memory-cache-size|-M) FAST_HIGHLIGHT[subversion-option-argument]=number;;
|
||||
--parent-dir) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
--revision|-r) FAST_HIGHLIGHT[subversion-option-argument]=revision-pair;;
|
||||
esac
|
||||
;;
|
||||
svndumpfilter/*)
|
||||
case $__wrd in
|
||||
--targets) FAST_HIGHLIGHT[subversion-option-argument]=any;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
elif [[ -n $FAST_HIGHLIGHT[subversion-option-argument] ]]; then
|
||||
case $FAST_HIGHLIGHT[subversion-option-argument] in
|
||||
any)
|
||||
FAST_HIGHLIGHT[subversion-option-argument]=
|
||||
return 1
|
||||
;;
|
||||
accept)
|
||||
[[ $__wrd = (p(|ostpone)|e(|dit)|l(|aunch)|base|working|recommended|[mt][cf]|(mine|theirs)-(conflict|full)) ]] \
|
||||
&& __style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
depth)
|
||||
[[ $__wrd = (empty|files|immediates|infinity) ]] \
|
||||
&& __style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
number)
|
||||
[[ $__wrd = [0-9]## ]] \
|
||||
&& __style=${FAST_THEME_NAME}mathnum \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
eol)
|
||||
[[ $__wrd = (CR(|LF)|LF) ]] \
|
||||
&& __style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
show-revs)
|
||||
[[ $__wrd = (merged|eligible) ]] \
|
||||
&& __style=${FAST_THEME_NAME}correct-subtle \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
;;
|
||||
revision)
|
||||
→chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos
|
||||
;;
|
||||
revision-pair)
|
||||
local -a match mbegin mend
|
||||
if [[ $__wrd = (#b)(\{[^}]##\}|[^:]##)(:)(*) ]]; then
|
||||
→chroma/-subversion.ch/parse-revision $match[1] $__start_pos $(( __end_pos - ( mend[3]-mend[2] ) - 1 ))
|
||||
→chroma/-subversion.ch/parse-revision $match[3] $(( __start_pos + ( mbegin[3]-mbegin[1] ) )) $__end_pos
|
||||
(( __start=__start_pos-${#PREBUFFER}+(mbegin[2]-mbegin[1]), __end=__end_pos-${#PREBUFFER}-(mend[3]-mend[2]), __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}for-loop-separator]}")
|
||||
else
|
||||
→chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos
|
||||
fi
|
||||
;;
|
||||
target)
|
||||
→chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $?
|
||||
;;
|
||||
cmd)
|
||||
this_word=1
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
FAST_HIGHLIGHT[subversion-option-argument]=
|
||||
elif [[ -z $FAST_HIGHLIGHT[subversion-subcommand] ]]
|
||||
then
|
||||
FAST_HIGHLIGHT[subversion-subcommand]=$__wrd
|
||||
local subcmds
|
||||
case $FAST_HIGHLIGHT[subversion-command] in
|
||||
svn) subcmds='(add|auth|blame|praise|annotate|ann|cat|changelist|cl|checkout|co|cleanup|commit|ci|copy|cp|delete|del|remove|rm|diff|di|export|help|\?|h|import|info|list|ls|lock|log|merge|mergeinfo|mkdir|move|mv|rename|ren|patch|propdel|pdel|pd|propedit|pedit|pe|propget|pget|pg|proplist|plist|pl|propset|pset|ps|relocate|resolve|resolved|revert|status|stat|st|switch|sw|unlock|update|up|upgrade|x-shelf-diff|x-shelf-drop|x-shelf-list|x-shelves|x-shelf-list-by-paths|x-shelf-log|x-shelf-save|x-shelve|x-unshelve)' ;;
|
||||
svnadmin) subcmds="(crashtest|create|delrevprop|deltify|dump|dump-revprops|freeze|help|\?|h|hotcopy|info|list-dblogs|list-unused-dblogs|load|load-revprops|lock|lslocks|lstxns|pack|recover|rmlocks|rmtxns|setlog|setrevprop|setuuid|unlock|upgrade|verify)";;
|
||||
svndumpfilter) subcmds='(include|exclude|help|\?)';;
|
||||
esac
|
||||
[[ $FAST_HIGHLIGHT[subversion-subcommand] = $~subcmds ]] \
|
||||
&& __style=${FAST_THEME_NAME}subcommand \
|
||||
|| __style=${FAST_THEME_NAME}incorrect-subtle
|
||||
FAST_HIGHLIGHT[subversion-subcommand-arguments]=0
|
||||
else
|
||||
(( FAST_HIGHLIGHT[subversion-subcommand-arguments]+=1 ))
|
||||
if [[ ( $FAST_HIGHLIGHT[subversion-subcommand] == (checkout|co|export|log|merge|switch|sw) && $FAST_HIGHLIGHT[subversion-subcommand-arguments] -eq 1 ) \
|
||||
|| $FAST_HIGHLIGHT[subversion-subcommand] == (blame|praise|annotate|ann|cat|copy|cp|diff|info|list|ls|mergeinfo) ]]; then
|
||||
→chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $?
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
# If 1 will be added to __start_pos, this will highlight "oken".
|
||||
# If 1 will be subtracted from __end_pos, this will highlight "toke".
|
||||
# $PREBUFFER is for specific situations when users does command \<ENTER>
|
||||
# i.e. when multi-line command using backslash is entered.
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code can do
|
||||
# it itself (and it does in other chromas) and skip setting __style to
|
||||
# this way disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves.
|
||||
# _start_pos=$_end_pos advainces pointers in command line buffer.
|
||||
#
|
||||
# To pass through means to `return 1'. The highlighting of
|
||||
# this single token is then done by fast-syntax-highlighting's
|
||||
# main code and chroma doesn't have to do anything.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,51 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma for vim, shows last opened files under prompt.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __chars
|
||||
integer __idx1 __idx2
|
||||
local -a __viminfo
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
(( ${+commands[vim]} )) && __style=${FAST_THEME_NAME}command || __style=${FAST_THEME_NAME}unknown-token
|
||||
|
||||
{ __viminfo=( ${(f)"$(<$HOME/.viminfo)"} ); } >> /dev/null
|
||||
__viminfo=( "${${(M)__viminfo[@]:#>*}[@]:t}" )
|
||||
__viminfo=( "${__viminfo[@]:#COMMIT_EDITMSG}" )
|
||||
zle -M "Last opened:"$'\n'"${(F)__viminfo[1,5]}"
|
||||
} || {
|
||||
# Pass almost everything to big loop
|
||||
return 1
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above
|
||||
# code can do it itself (and it does, see other chromas) and
|
||||
# skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,138 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018-2019 Sebastian Gniazdowski
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
local THEFD check __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style
|
||||
|
||||
(( ! ${+FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]} )) && \
|
||||
FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]=0
|
||||
|
||||
(( ! ${+FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]} )) && {
|
||||
is-at-least 5.0.6 && local __res=1 || local __res=0
|
||||
FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]="$__res"
|
||||
}
|
||||
|
||||
-fast-whatis-chroma-callback() {
|
||||
emulate -L zsh
|
||||
setopt extendedglob warncreateglobal typesetsilent
|
||||
|
||||
local THEFD="$1" input check=2 nl=$'\n' __wrd __style
|
||||
|
||||
.fast-zts-read-all "$THEFD" input
|
||||
|
||||
zle -F "$THEFD"
|
||||
exec {THEFD}<&-
|
||||
|
||||
__wrd="${${input#[^$nl]#$nl}%%$nl*}"
|
||||
if [[ "$input" = test* ]]; then
|
||||
if [[ "${input%$nl}" = *[^0-9]'0' ]]; then
|
||||
if [[ "${input#test$nl}" = *nothing\ appropriate* ]]; then
|
||||
FAST_HIGHLIGHT[whatis_chroma_type]=2
|
||||
else
|
||||
FAST_HIGHLIGHT[whatis_chroma_type]=0
|
||||
fi
|
||||
else
|
||||
FAST_HIGHLIGHT[whatis_chroma_type]=1
|
||||
fi
|
||||
elif [[ "$input" = type2* ]]; then
|
||||
[[ "$input" != *nothing\ appropriate* ]] && check=1 || check=0
|
||||
elif [[ "$input" = type1* ]]; then
|
||||
[[ "${input%$nl}" = *0 ]] && check=1 || check=0
|
||||
fi
|
||||
|
||||
if (( check != 2 )); then
|
||||
FAST_HIGHLIGHT[whatis-cache-$__wrd]=$check
|
||||
if (( check )) then
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}
|
||||
elif [[ ${~__wrd} = */* && -e ${~__wrd} ]] then
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]}
|
||||
else
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}
|
||||
fi
|
||||
local -a start_end
|
||||
start_end=( ${(s:/:)${${(M)${${input#type?${nl}[^$nl]#$nl}}#*$nl}%$nl}} )
|
||||
(( start_end[1] >= 0 )) && region_highlight+=("$start_end[1] $start_end[2] $__style")
|
||||
zle -R
|
||||
fi
|
||||
|
||||
FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]=1
|
||||
return 0
|
||||
}
|
||||
|
||||
zle -N -- -fast-whatis-chroma-callback
|
||||
|
||||
if (( __first_call )) && [[ -z "${FAST_HIGHLIGHT[whatis_chroma_type]}" ]] ;then
|
||||
if ! command -v whatis > /dev/null; then
|
||||
FAST_HIGHLIGHT[whatis_chroma_type]=0
|
||||
return 1
|
||||
fi
|
||||
|
||||
exec {THEFD}< <(
|
||||
print "test"
|
||||
LANG=C whatis "osx whatis fallback check"
|
||||
print "$?"
|
||||
)
|
||||
command true # a workaround of Zsh bug
|
||||
zle -F ${${FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]:#0}:+-w} "$THEFD" -fast-whatis-chroma-callback
|
||||
fi
|
||||
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if (( __first_call )) || [[ "$__wrd" = -* ]]; then
|
||||
return 1
|
||||
elif (( ! FAST_HIGHLIGHT[whatis_chroma_type] )); then
|
||||
# Return 1 (i.e. treat the argument as a path) only if the callback have
|
||||
# had a chance to establish the whatis_chroma_type field
|
||||
(( FAST_HIGHLIGHT[whatis_chroma_callback_was_ran] )) && return 1
|
||||
else
|
||||
if [[ -z "${FAST_HIGHLIGHT[whatis-cache-$__wrd]}" ]]; then
|
||||
if (( FAST_HIGHLIGHT[whatis_chroma_type] == 2 )); then
|
||||
exec {THEFD}< <(
|
||||
print "type2"
|
||||
print "$__wrd"
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER} ))
|
||||
print "$__start/$__end"
|
||||
LANG=C whatis "$__wrd" 2>/dev/null
|
||||
)
|
||||
command true # see above
|
||||
zle -F ${${FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]:#0}:+-w} "$THEFD" -fast-whatis-chroma-callback
|
||||
else
|
||||
exec {THEFD}< <(
|
||||
print "type1"
|
||||
print "$__wrd"
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER} ))
|
||||
print "$__start/$__end"
|
||||
LANG=C whatis "$__wrd" &> /dev/null
|
||||
print "$?"
|
||||
)
|
||||
command true
|
||||
zle -F ${${FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]:#0}:+-w} "$THEFD" -fast-whatis-chroma-callback
|
||||
fi
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end $__style")
|
||||
else
|
||||
check=${FAST_HIGHLIGHT[whatis-cache-$__wrd]}
|
||||
if (( check )) then
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}
|
||||
elif [[ ${~__wrd} = */* && -e ${~__wrd} ]] then
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]}
|
||||
elif (( FAST_HIGHLIGHT[whatis_chroma_type] )); then
|
||||
__style=${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}
|
||||
fi
|
||||
[[ -n "$__style" ]] && \
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \
|
||||
reply+=("$__start $__end $__style")
|
||||
fi
|
||||
fi
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4:sts=4
|
|
@ -0,0 +1,96 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Outputs (under prompt) result of query done with `which', `type -w',
|
||||
# `whence -v', `whereis', `whatis'.
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
#
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg; the token can be eg.: "grep"
|
||||
#
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
#
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
|
||||
local __style __output __chars
|
||||
integer __idx1 __idx2
|
||||
local -a __results
|
||||
|
||||
# First call, i.e. command starts, i.e. "grep" token etc.
|
||||
(( __first_call )) && {
|
||||
FAST_HIGHLIGHT[chroma-which-counter]=0
|
||||
FAST_HIGHLIGHT[chroma-which-counter-all]=1
|
||||
FAST_HIGHLIGHT[chroma-which-message]=""
|
||||
FAST_HIGHLIGHT[chroma-which-skip-two]=0
|
||||
__style=${FAST_THEME_NAME}command
|
||||
__output=""
|
||||
|
||||
# Following call (not first one).
|
||||
} || {
|
||||
(( FAST_HIGHLIGHT[chroma-which-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-which-counter-all] ))
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
# Detected option, add style for it.
|
||||
[[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
if [[ "$__wrd" = "-x" ]]; then
|
||||
FAST_HIGHLIGHT[chroma-which-skip-two]=1
|
||||
fi
|
||||
else
|
||||
# Count non-option tokens.
|
||||
if (( FAST_HIGHLIGHT[chroma-which-skip-two] )); then
|
||||
FAST_HIGHLIGHT[chroma-which-skip-two]=0
|
||||
else
|
||||
(( FAST_HIGHLIGHT[chroma-which-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-which-counter] ))
|
||||
if [[ "$__idx1" -eq 1 ]]; then
|
||||
__chars="{"
|
||||
__output="$(command which "$__wrd" 2>/dev/null)"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"command which: $__output"
|
||||
__output="$(builtin which "$__wrd" 2>/dev/null)"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"builtin which: ${${${${__output[1,100]}//$'\n'/;}//$'\t'/ }//$__chars;/$__chars}${__output[101,101]:+...}"
|
||||
__output="$(builtin type -w "$__wrd" 2>/dev/null)"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"type -w: $__output"
|
||||
__output="$(builtin whence -v "$__wrd" 2>/dev/null)"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"whence -v: $__output"
|
||||
__output="$(command whereis "$__wrd" 2>/dev/null)"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"whereis: $__output"
|
||||
__output="$(command whatis "$__wrd" 2>/dev/null)"
|
||||
__output="${${__output%%$'\n'*}//[[:blank:]]##/ }"
|
||||
FAST_HIGHLIGHT[chroma-which-message]+=$'\n'"whatis: $__output"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( ${#${(z)BUFFER}} <= FAST_HIGHLIGHT[chroma-which-counter-all] )); then
|
||||
[[ -n "${FAST_HIGHLIGHT[chroma-which-message]}" ]] && zle -M "${FAST_HIGHLIGHT[chroma-which-message]#$'\n'}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Add region_highlight entry (via `reply' array).
|
||||
#
|
||||
# This is a common place of adding such entry, but any above code
|
||||
# can do it itself and skip setting __style to disable this code.
|
||||
[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
|
||||
# We aren't passing-through (no return 1 occured), do obligatory things ourselves.
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,378 @@
|
|||
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# Copyright (c) 2018-2019 Sebastian Gniazdowski
|
||||
#
|
||||
# Chroma function for command `git'. It colorizes the part of command
|
||||
# line that holds `git' invocation.
|
||||
|
||||
(( FAST_HIGHLIGHT[-zinit.ch-chroma-def] )) && return 1
|
||||
|
||||
FAST_HIGHLIGHT[-zinit.ch-chroma-def]=1
|
||||
|
||||
typeset -gA fsh__zinit__chroma__def
|
||||
fsh__zinit__chroma__def=(
|
||||
##
|
||||
## No subcommand
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:NULL "NULL_0_opt"
|
||||
NULL_0_opt "(-help|--help|-h)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
"subcommands" "(help|man|self-update|cd|times|zstatus|load|light|unload|snippet|ls|ice|<ice|specification>|update|status|report|delete|loaded|list|cd|create|edit|glance|stress|changes|recently|clist|completions|cdisable|cname|cenable|cname|creinstall|cuninstall|csearch|compinit|dtrace|dstart|dstop|dunload|dreport|dclear|compile|uncompile|compiled|cdlist|cdreplay|cdclear|srv|recall|env-whitelist|bindkeys|module)"
|
||||
|
||||
## }}}
|
||||
|
||||
# Generic actions
|
||||
NO_MATCH_\#_opt "* <<>> __style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP"
|
||||
NO_MATCH_\#_arg "__style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP"
|
||||
|
||||
|
||||
##
|
||||
## `ice'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:ice "ICE_#_arg // NO_MATCH_#_opt"
|
||||
|
||||
"ICE_#_arg" "NO-OP // ::→chroma/-zinit-check-ice-mod"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `snippet'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:snippet "SNIPPET_0_opt // SNIPPET_1_arg // NO_MATCH_#_opt //
|
||||
NO_MATCH_#_arg"
|
||||
|
||||
SNIPPET_0_opt "(-f|--command)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
SNIPPET_1_arg "NO-OP // ::→chroma/-zinit-verify-snippet"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `load'
|
||||
##
|
||||
## {{{
|
||||
|
||||
"subcmd:load"
|
||||
"LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
LOAD_1_arg "NO-OP // ::→chroma/-zinit-verify-plugin"
|
||||
|
||||
LOAD_2_arg "NO-OP // ::→chroma/-zinit-verify-plugin"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `compile|uncompile|stress|edit|glance|recall|status|cd|changes`
|
||||
##
|
||||
## {{{
|
||||
|
||||
"subcmd:(compile|uncompile|stress|edit|glance|recall|status|cd|changes)"
|
||||
"PLGSNP_1_arg // PLGSNP_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
PLGSNP_1_arg "NO-OP // ::→chroma/-zinit-verify-plugin-or-snippet"
|
||||
|
||||
PLGSNP_2_arg "NO-OP // ::→chroma/-zinit-verify-plugin-or-snippet"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `update'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:update "UPDATE_0_opt // PLGSNP_1_arg // PLGSNP_2_arg //
|
||||
NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
UPDATE_0_opt "
|
||||
(--all|-r|--reset|-q|--quiet|-p|--parallel)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `light'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:light "LIGHT_0_opt // LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt //
|
||||
NO_MATCH_#_arg"
|
||||
|
||||
LIGHT_0_opt "-b
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `unload'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:unload "UNLOAD_0_opt // UNLOAD_1_arg // UNLOAD_2_arg // NO_MATCH_#_opt //
|
||||
NO_MATCH_#_arg"
|
||||
|
||||
UNLOAD_0_opt "-q
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
UNLOAD_1_arg "NO-OP // ::→chroma/-zinit-verify-loaded-plugin"
|
||||
|
||||
UNLOAD_2_arg "NO-OP // ::→chroma/-zinit-verify-loaded-plugin"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `report'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:report "REPORT_0_opt // UNLOAD_1_arg // UNLOAD_2_arg // NO_MATCH_#_opt //
|
||||
NO_MATCH_#_arg"
|
||||
|
||||
REPORT_0_opt "--all
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `delete'
|
||||
##
|
||||
## {{{
|
||||
|
||||
"subcmd:delete"
|
||||
"DELETE_0_opt // PLGSNP_1_arg // PLGSNP_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
DELETE_0_opt "
|
||||
(--all|--clean|-y|--yes|-q|--quiet)
|
||||
<<>> NO-OP // ::→chroma/main-chroma-std-aopt-action"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `cenable'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:cenable "COMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
COMPLETION_1_arg "NO-OP // ::→chroma/-zinit-verify-disabled-completion"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `cdisable'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:cdisable "DISCOMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
DISCOMPLETION_1_arg "NO-OP // ::→chroma/-zinit-verify-completion"
|
||||
|
||||
## }}}
|
||||
|
||||
|
||||
##
|
||||
## `light'
|
||||
##
|
||||
## {{{
|
||||
|
||||
subcmd:uncompile "UNCOMPILE_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg"
|
||||
|
||||
UNCOMPILE_1_arg "NO-OP // ::→chroma/-zinit-verify-compiled-plugin"
|
||||
|
||||
## }}}
|
||||
|
||||
##
|
||||
## `*'
|
||||
##
|
||||
## {{{
|
||||
|
||||
"subcmd:*" "CATCH_ALL_#_opt"
|
||||
"CATCH_ALL_#_opt" "* <<>> NO-OP // ::→chroma/main-chroma-std-aopt-SEMI-action"
|
||||
|
||||
## }}}
|
||||
)
|
||||
|
||||
#→chroma/-zinit-first-call() {
|
||||
# This is being done in the proper place - in -fast-highlight-process
|
||||
#FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]=0
|
||||
#}
|
||||
|
||||
→chroma/-zinit-verify-plugin() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
[[ -d "$_wrd" ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; }
|
||||
|
||||
typeset -a plugins
|
||||
plugins=( "${ZINIT[PLUGINS_DIR]}"/*(N:t) )
|
||||
plugins=( "${plugins[@]//---//}" )
|
||||
plugins=( "${plugins[@]:#_local/zinit}" )
|
||||
plugins=( "${plugins[@]:#custom}" )
|
||||
|
||||
[[ -n "${plugins[(r)$_wrd]}" ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
return 1
|
||||
#__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
return 0
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-plugin-or-snippet() {
|
||||
→chroma/-zinit-verify-plugin "$1" "" "" "$4" || \
|
||||
→chroma/-zinit-verify-snippet "$1" "" "" "$4"
|
||||
return $?
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-loaded-plugin() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
typeset -a plugins absolute1 absolute2 absolute3 normal
|
||||
plugins=( "${ZINIT_REGISTERED_PLUGINS[@]:#_local/zinit}" )
|
||||
normal=( "${plugins[@]:#%*}" )
|
||||
absolute1=( "${(M)plugins[@]:#%*}" )
|
||||
absolute1=( "${absolute1[@]/\%\/\//%/}" )
|
||||
local hm="${HOME%/}"
|
||||
absolute2=( "${absolute1[@]/$hm/HOME}" )
|
||||
absolute3=( "${absolute1[@]/\%/}" )
|
||||
plugins=( $absolute1 $absolute2 $absolute3 $normal )
|
||||
|
||||
[[ -n "${plugins[(r)$_wrd]}" ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
return 1
|
||||
#__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-completion() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
# Find enabled completions
|
||||
typeset -a completions
|
||||
completions=( "${ZINIT[COMPLETIONS_DIR]}"/_*(N:t) )
|
||||
completions=( "${completions[@]#_}" )
|
||||
|
||||
[[ -n "${completions[(r)${_wrd#_}]}" ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-disabled-completion() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
# Find enabled completions
|
||||
typeset -a completions
|
||||
completions=( "${ZINIT[COMPLETIONS_DIR]}"/[^_]*(N:t) )
|
||||
|
||||
[[ -n "${completions[(r)${_wrd#_}]}" ]] && \
|
||||
__style=${FAST_THEME_NAME}correct-subtle || \
|
||||
return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-compiled-plugin() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
typeset -a plugins
|
||||
plugins=( "${ZINIT[PLUGINS_DIR]}"/*(N) )
|
||||
|
||||
typeset -a show_plugins p matches
|
||||
for p in "${plugins[@]}"; do
|
||||
matches=( $p/*.zwc(N) )
|
||||
if [ "$#matches" -ne "0" ]; then
|
||||
p="${p:t}"
|
||||
[[ "$p" = (_local---zinit|custom) ]] && continue
|
||||
p="${p//---//}"
|
||||
show_plugins+=( "$p" )
|
||||
fi
|
||||
done
|
||||
|
||||
[[ -n "${show_plugins[(r)$_wrd]}" ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
return 1
|
||||
}
|
||||
|
||||
→chroma/-zinit-verify-snippet() {
|
||||
local _scmd="$1" url="$4" dirname local_dir
|
||||
url="${${url#"${url%%[! $'\t']*}"}%/}"
|
||||
id_as="${FAST_HIGHLIGHT[chroma-zinit-ice-elements-id-as]:-${ZINIT_ICE[id-as]:-$url}}"
|
||||
|
||||
filename="${${id_as%%\?*}:t}"
|
||||
dirname="${${id_as%%\?*}:t}"
|
||||
local_dir="${${${id_as%%\?*}:h}/:\/\//--}"
|
||||
[[ "$local_dir" = "." ]] && local_dir="" || local_dir="${${${${${local_dir#/}//\//--}//=/--EQ--}//\?/--QM--}//\&/--AMP--}"
|
||||
local_dir="${ZINIT[SNIPPETS_DIR]}${local_dir:+/$local_dir}"
|
||||
|
||||
(( ${+ZINIT_ICE[svn]} || ${FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]} )) && {
|
||||
# TODO: handle the SVN path's specifics
|
||||
[[ -d "$local_dir/$dirname" ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
return 1
|
||||
} || {
|
||||
# TODO: handle the non-SVN path's specifics
|
||||
[[ -d "$local_dir/$dirname" ]] && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
→chroma/-zinit-check-ice-mod() {
|
||||
local _scmd="$1" _wrd="$4"
|
||||
[[ "$_wrd" = (svn(\'|\")*|svn) ]] && \
|
||||
FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]=1
|
||||
[[ "$_wrd" = (#b)(id-as(:|)(\'|\")(*)(\'|\")|id-as:(*)|id-as(*)) ]] && \
|
||||
FAST_HIGHLIGHT[chroma-zinit-ice-elements-id-as]="${match[4]}${match[6]}${match[7]}"
|
||||
|
||||
# Copy from zinit-autoload.zsh / -zplg-recall
|
||||
local -a ice_order nval_ices ext_val_ices
|
||||
ext_val_ices=( ${(@)${(@Ms.|.)ZINIT_EXTS[ice-mods]:#*\'\'*}//\'\'/} )
|
||||
|
||||
ice_order=(
|
||||
svn proto from teleid bindmap cloneopts id-as depth if wait load
|
||||
unload blockf pick bpick src as ver silent lucid notify mv cp
|
||||
atinit atclone atload atpull nocd run-atpull has cloneonly make
|
||||
service trackbinds multisrc compile nocompile nocompletions
|
||||
reset-prompt wrap-track reset sh \!sh bash \!bash ksh \!ksh csh
|
||||
\!csh aliases countdown ps-on-unload ps-on-update trigger-load
|
||||
light-mode is-snippet atdelete pack git verbose on-update-of
|
||||
subscribe param extract
|
||||
# Include all additional ices – after
|
||||
# stripping them from the possible: ''
|
||||
${(@s.|.)${ZINIT_EXTS[ice-mods]//\'\'/}}
|
||||
)
|
||||
nval_ices=(
|
||||
blockf silent lucid trackbinds cloneonly nocd run-atpull
|
||||
nocompletions sh \!sh bash \!bash ksh \!ksh csh \!csh
|
||||
aliases countdown light-mode is-snippet git verbose
|
||||
|
||||
# Include only those additional ices,
|
||||
# don't have the '' in their name, i.e.
|
||||
# aren't designed to hold value
|
||||
${(@)${(@s.|.)ZINIT_EXTS[ice-mods]}:#*\'\'*}
|
||||
|
||||
# Must be last
|
||||
svn
|
||||
)
|
||||
|
||||
if [[ "$_wrd" = (#b)(${(~j:|:)${ice_order[@]:#(${(~j:|:)nval_ices[@]:#(${(~j:|:)ext_val_ices[@]})})}})(*) ]]; then
|
||||
reply+=("$(( __start )) $(( __start+${mend[1]} )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}")
|
||||
reply+=("$(( __start+${mbegin[2]} )) $(( __end )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-string]}")
|
||||
-fast-highlight-string
|
||||
return 0
|
||||
elif [[ "$_wrd" = (#b)(${(~j:|:)nval_ices[@]}) ]]; then
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
return 0
|
||||
else
|
||||
__style=${FAST_THEME_NAME}incorrect-subtle
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,460 @@
|
|||
# Copyright (c) 2018 Sebastian Gniazdowski
|
||||
#
|
||||
# Main chroma function. It allows to create the command-dedicated chromas
|
||||
# (like -git.ch) through a definition provided by `chroma_def' array (read
|
||||
# from the upper scope).
|
||||
#
|
||||
# $1 - 0 or 1, denoting if it's first call to the chroma, or following one
|
||||
# $2 - the current token, also accessible by $__arg from the above scope -
|
||||
# basically a private copy of $__arg
|
||||
# $3 - a private copy of $_start_pos, i.e. the position of the token in the
|
||||
# command line buffer, used to add region_highlight entry (see man),
|
||||
# because Zsh colorizes by *ranges* in command line buffer
|
||||
# $4 - a private copy of $_end_pos from the above scope
|
||||
#
|
||||
|
||||
(( next_word = 2 | 8192 ))
|
||||
|
||||
→chroma/main-chroma-print() {
|
||||
(( FAST_HIGHLIGHT[DEBUG] )) && print "$@" >> /tmp/fsh-dbg
|
||||
}
|
||||
|
||||
local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __end_pos="$5"
|
||||
|
||||
# Not a well formed chroma name
|
||||
[[ -z "$__chroma_name" ]] && return 1
|
||||
|
||||
# Load the fsh_{name-of-the-chroma}_chroma_def array
|
||||
(( !FAST_HIGHLIGHT[-${__chroma_name}.ch-chroma-def] )) && →chroma/-${__chroma_name}.ch
|
||||
|
||||
→chroma/main-chroma-print -r -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
→chroma/main-chroma-print -r -- @@@@@@@ local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __end_pos="$5" @@@@@@@
|
||||
local __style __entry __value __action __handler __tmp __svalue __hspaces=$'\t ' __nl=$'\n' __ch_def_name
|
||||
integer __idx1 __idx2 __start __end __ivalue __have_value=0
|
||||
local -a __lines_list __avalue
|
||||
local -A map
|
||||
map=( "#" "_H" "^" "_D" "*" "_S" )
|
||||
|
||||
(( __start=_start_pos-__PBUFLEN, __end=_end_pos-__PBUFLEN ))
|
||||
|
||||
# Handler that highlights the options
|
||||
→chroma/main-chroma-std-aopt-action() {
|
||||
integer _start="$2" _end="$3"
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
[[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && {
|
||||
reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}")
|
||||
} || {
|
||||
[[ "$_wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
}
|
||||
}
|
||||
|
||||
# Handler that highlights the options' arguments
|
||||
→chroma/main-chroma-std-aopt-ARG-action() {
|
||||
integer _start="$2" _end="$3"
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
[[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && {
|
||||
reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}")
|
||||
} || __style=${FAST_THEME_NAME}optarg-${${${(M)_wrd:#(-|)<->}:+number}:-string}
|
||||
}
|
||||
|
||||
# This handler also highlights explicit arguments, i.e. --opt=the-explicit-arg
|
||||
→chroma/main-chroma-std-aopt-SEMI-action() {
|
||||
integer _start="$2" _end="$3"
|
||||
local _scmd="$1" _wrd="$4"
|
||||
|
||||
[[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && {
|
||||
reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}")
|
||||
reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}")
|
||||
} || {
|
||||
[[ "$_wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \
|
||||
__style=${FAST_THEME_NAME}single-hyphen-option
|
||||
}
|
||||
}
|
||||
|
||||
# A handler which verifies the token as an GIT url
|
||||
→chroma/main-chroma-std-verify-url() {
|
||||
setopt localoptions extendedglob
|
||||
local _wrd="$4"
|
||||
integer url_correct=0
|
||||
# Correct matches
|
||||
# Correct matches
|
||||
if [[ "$_wrd" = (#b)(git|http|https|ftp|ftps|file)://([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then
|
||||
url_correct=1
|
||||
elif [[ "$_wrd" = (#b)rsync://([a-zA-Z0-9._~-]##)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then
|
||||
url_correct=1
|
||||
elif [[ "$_wrd" = (#b)ssh://([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then
|
||||
url_correct=1
|
||||
elif [[ "$_wrd" = (#b)([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##):([a-zA-Z0-9./_~:-](#c0,1)[a-zA-Z0-9._~:-][a-zA-Z0-9./_~:-]#)(#c0,1) ]]; then
|
||||
url_correct=1
|
||||
elif [[ "$_wrd" = (#b)[[:alnum:]/_~:.-]## ]]; then
|
||||
url_correct=1
|
||||
fi
|
||||
|
||||
(( url_correct )) && \
|
||||
{ __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \
|
||||
{ __style=${FAST_THEME_NAME}incorrect-subtle; return 1; }
|
||||
}
|
||||
|
||||
# A handler which verifies the token as a shell wildcard
|
||||
→chroma/main-chroma-std-verify-pattern() {
|
||||
setopt localoptions extendedglob
|
||||
local _wrd="$4"
|
||||
__style=${FAST_THEME_NAME}globbing-ext
|
||||
}
|
||||
|
||||
# Creates a hash table for given option set (an *_opt field in the chroma def.)
|
||||
→chroma/main-create-OPTION-hash.ch() {
|
||||
local __subcmd="$1" __option_set_id="$2" __the_hash_name="$3" __ __e __el __the_hash_name __var_name
|
||||
local -a __split __sp __s
|
||||
|
||||
→chroma/main-chroma-print -rl "======================" " **## STARTING ##** →chroma/main-##CREATE##-option-HASH.ch // subcmd:$__subcmd // option_set_id:$__option_set_id // h-nam:$__the_hash_name"
|
||||
→chroma/main-chroma-print "[D] Got option-set: ${(j:,:)__option_set_id}"
|
||||
typeset -gA "$__the_hash_name"
|
||||
→chroma/main-chroma-print "[E] __the_hash_name ${__the_hash_name}:[$__option_set_id]"
|
||||
|
||||
# Split on ||
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[${__option_set_id}]"
|
||||
__split=( "${(P@s:||:)__ch_def_name}" )
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=()
|
||||
# Remove only leading and trailing whitespace
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
|
||||
→chroma/main-chroma-print -rl "[F] Got ||-__split: _________" ${${(@)${${__split[@]##[[:space:]]##}[@]//[${__hspaces}]##/ }[@]//[${__nl}]##/$__nl}[@]//(#s)/:::} "_________"
|
||||
for __el in $__split; do
|
||||
__sp=( "${(@s:<<>>:)__el}" )
|
||||
[[ ${#__sp} -eq 1 && -z "${__sp[1]}" ]] && __sp=()
|
||||
__sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
|
||||
→chroma/main-chroma-print -l -- "Processing an ||-part - got <<>>-split: _________" "${${__sp[@]}[@]/(#s)/-\\t}" "_________"
|
||||
__e="${__sp[1]}"
|
||||
local __e1=${${__e#\(}%\)(:add|:del|)}
|
||||
local __e2=${(M)__e##\(*\)(:add|:del)}
|
||||
# Split on | with the ( and ) and :add/:del stripped and then append
|
||||
# the :add or :del depending on what's on the input line
|
||||
__s=()
|
||||
for __ in ${(@s:|:)__e1}; do
|
||||
__s+=( $__${__e2:+${(M)__e%(:add|:del)}} )
|
||||
done
|
||||
[[ ${#__s} -eq 1 && -z "${__s[1]}" ]] && __s=()
|
||||
__s=( "${__s[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
shift __sp
|
||||
|
||||
for __ in $__s; do
|
||||
__=${__%\^}
|
||||
[[ "$__" = -*:(add|del) ]] && __var_name="${__the_hash_name}[${__}-directive]" || __var_name="${__the_hash_name}[${__}-opt-action]"
|
||||
→chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[1]}${${${#__sp}:#(0|1)}:+ +}<<"
|
||||
: ${(P)__var_name::=${__sp[1]}${${${#__sp}:#(0|1)}:+ +}}
|
||||
|
||||
if (( ${#__sp} >= 2 )); then
|
||||
__var_name="${__the_hash_name}[${__}-opt-arg-action]"
|
||||
→chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[2]}<<}"
|
||||
: ${(P)__var_name::=$__sp[2]}
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
# Processes given token
|
||||
→chroma/main-process-token.ch() {
|
||||
local __subcmd="$1" __wrd="$2" __val __var_name __main_hash_name __the_hash_name __i __size
|
||||
local -a __splitted __split __added
|
||||
|
||||
→chroma/main-chroma-print "\n******************* Starting →chroma/main-process-token <<$__wrd>>// subcmd:${(qq)__subcmd}"
|
||||
__main_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^\*])/${map[${match[1]}]}}"
|
||||
__var_name="${__main_hash_name}[subcmd:$__subcmd]"
|
||||
__splitted=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=()
|
||||
__splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
|
||||
→chroma/main-chroma-print -rl -- "[B] MAIN-PROCESS-TOKEN: got [OPTION/ARG-**S-E-T-S**] //-splitted from subcmd:$__subcmd: ${${(j:, :)__splitted}:-EMPTY-SET!}" "----- __splitted\\Deleted: -----" ${${(j:, :)${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (deleted)!} "----- Added\\Deleted: -----" ${${(j:, :)${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (added)!} -----\ Deleted:\ ----- ${(j:, :)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}} >> /tmp/reply
|
||||
|
||||
(( ! ${#__splitted} )) && {
|
||||
__var_name="${__main_hash_name}[subcmd:*]"
|
||||
__splitted=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=()
|
||||
__splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
(( ! ${#__splitted} )) && return 1
|
||||
}
|
||||
|
||||
→chroma/main-chroma-print -rl -- "---NO-HASH-CREATE-FROM-NOW-ON---"
|
||||
|
||||
if [[ -z "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" ]]; then
|
||||
→chroma/main-chroma-print -rl -- "-z OPT-WITH-ARG-ACTIVE == true"
|
||||
if [[ "$__wrd" = -* ]]; then
|
||||
→chroma/main-chroma-print "1st-PATH (-z opt-with-arg-active, non-opt-arg branch, i.e. OPTION BRANCH) [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]"
|
||||
for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do
|
||||
[[ "${__val}" != "${__val%%_([0-9]##|\#)##*}"_${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}_opt(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_opt(\*|\^|) ]] && { →chroma/main-chroma-print "DIDN'T MATCH $__val / arg counter:${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue; } || →chroma/main-chroma-print "Got candidate: $__val"
|
||||
# Create the hash cache-parameter if needed
|
||||
__the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//(#b)([\#\^\*])/${map[${match[1]}]}}//[^a-zA-Z0-9_]/_}"
|
||||
[[ "$__val" = *_opt(\*|\^|) && "${(P)+__the_hash_name}" -eq 0 ]] && →chroma/main-create-OPTION-hash.ch "$__subcmd" "$__val" "$__the_hash_name" || →chroma/main-chroma-print "Not creating, the hash already exists..."
|
||||
# Try dedicated-entry for the option
|
||||
__var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action]"
|
||||
__split=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=()
|
||||
# If no result, then try with catch-all entry
|
||||
(( ! ${#__split} )) && {
|
||||
→chroma/main-chroma-print "% no ${(q-)${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action, retrying with *-opt-action" "|__var_name|:$__var_name"
|
||||
__var_name="${__the_hash_name}[*-opt-action]"
|
||||
__split=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=()
|
||||
}
|
||||
__svalue="$__var_name"
|
||||
# Remove whitespace
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
→chroma/main-chroma-print -l -- "\`$__val' // ${#__split} // $__wrd: (ch.run #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]}), deref. of \`$__var_name'"
|
||||
if (( ${#__split} )); then
|
||||
→chroma/main-chroma-print -l -- "Got split of {\$#__split:$#__split} ${__wrd}-opt-action or *-opt-action" "${${(q-)__split[@]}[@]/(#s)/->\\t}"
|
||||
if [[ "${__split[2]}" = *[[:blank:]]+ ]]; then
|
||||
→chroma/main-chroma-print "YES handling the value (the OPT.ARGUMENT)! [${__split[2]}]"
|
||||
if [[ "$__wrd" = *=* ]]; then
|
||||
→chroma/main-chroma-print "The-immediate Arg-Acquiring, of option"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="${__wrd#*=}"
|
||||
__have_value=2
|
||||
else
|
||||
→chroma/main-chroma-print "Enable Arg-Awaiting, of option"
|
||||
→chroma/main-chroma-print "FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=\"${__svalue%-opt-action\]}-opt-arg-action]\""
|
||||
__have_value=0
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]"
|
||||
fi
|
||||
fi
|
||||
|
||||
__action="${__split[1]}"
|
||||
__handler="${__split[2]%[[:blank:]]+}"
|
||||
|
||||
# Check for directives (like :add)
|
||||
if [[ "$__val" = *_opt\^ ]]; then
|
||||
__var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}:add-directive]"
|
||||
(( ${(P)+__var_name} )) && __split=( "${(@s://:P)__var_name}" ) || __split=()
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split[1]=()
|
||||
__ivalue=${#__split}
|
||||
__var_name="${__var_name%:add-*}:del-directive]"
|
||||
(( ${(P)+__var_name} )) && __split+=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__split} -eq $(( __ivalue + 1 )) && -z "${__split[__ivalue+1]}" ]] && __split[__ivalue+1]=()
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
__tmp=${#__split}
|
||||
|
||||
# First: del-directive
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${(j: :)__split[__ivalue+1,__tmp]} "
|
||||
|
||||
→chroma/main-chroma-print -rl ":add / :del directives: __ivalue:$__ivalue, THE __SPLIT[#$__tmp]: " "${__split[@]}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]} >> /tmp/reply
|
||||
|
||||
# Second: add-directive
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${(j: :)__split[1,__ivalue]} "
|
||||
fi
|
||||
[[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" || __handler=""
|
||||
[[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(1): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; }
|
||||
[[ "$__have_value" -ne 2 && -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl "Running action (1): $__action" ; eval "() { $__action; }"; }
|
||||
[[ "$__val" != *\* ]] && break
|
||||
else
|
||||
→chroma/main-chroma-print -rl -- "NO-MATCH ROUTE TAKEN"
|
||||
fi
|
||||
done
|
||||
else
|
||||
→chroma/main-chroma-print "1st-PATH-B (-z opt-with-arg-active, non-opt-arg branch, ARGUMENT BRANCH [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]) //// added-nodes: ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}"
|
||||
for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do
|
||||
[[ "${__val}" != "${__val%%_([0-9]##|\#)*}"_"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"_arg(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_arg(\*|\^|) ]] && { →chroma/main-chroma-print "Continuing for $__val / arg counter ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue }
|
||||
# Create the hash cache-parameter if needed
|
||||
__the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//\#/H}//[^a-zA-Z0-9_]/_}"
|
||||
__action="" __handler=""
|
||||
→chroma/main-chroma-print "A hit, chosen __val:$__val!"
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[$__val]"
|
||||
__split=( "${(P@s:<<>>:)__ch_def_name}" )
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
|
||||
__sp=( "${(@s://:)__split[1]}" )
|
||||
__sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
__action="${__sp[1]#*::::: ##}"
|
||||
|
||||
# Verify if it's the expected argument
|
||||
[[ "${__sp[1]}" = *:::::* && "$__wrd" != ${~${__sp[1]%% ##:::::*}} ]] && \
|
||||
{ →chroma/main-chroma-print -r "mismatch ${__sp[1]%% ##:::::*} != $__wrd, continuing" ; continue; }
|
||||
|
||||
→chroma/main-chroma-print -l -- "Got action record for $__val, i.e. the split:" "${__sp[@]//(#s)/-\t}" "_________"
|
||||
|
||||
[[ "${__sp[2]}" = ::[^[:space:]]* ]] && __handler="${__sp[2]#::}" || { [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && →chroma/main-chroma-print "=== Error === In chroma definition: a handler entry ${(q)__sp[2]} without leading \`::'" ; }
|
||||
[[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(3): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; }
|
||||
[[ -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running action(3): $__action" ; eval "() { $__action; } \"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}\" \"$__start\" \"$__end\" \"$__wrd\""; }
|
||||
|
||||
# Check for argument directives (like :add)
|
||||
if (( ${#__split} >= 2 )); then
|
||||
for __ in "${(@)__split[2,-1]}"; do
|
||||
__splitted=( "${(@s://:)__}" )
|
||||
if [[ "${__splitted[1]}" = add:* ]]; then
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${__splitted[1]#add:} ${(j: :)__splitted[2,-1]} "
|
||||
elif [[ "${__splitted[1]}" = del:* ]]; then
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${__splitted[1]#del:} ${(j: :)__splitted[2,-1]} "
|
||||
fi
|
||||
done
|
||||
→chroma/main-chroma-print -l "ARGUMENT :add / :del directives: THE __SPLIT[#${#__split}]: " "${__split[@]//(#s)/-\\t}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}//(#s)/-\\t} "The FAST_HIGHLIGHT[chroma-*added-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}//(#s)/-\\t}
|
||||
fi
|
||||
|
||||
[[ "$__val" != *\* ]] && break
|
||||
done
|
||||
fi
|
||||
else
|
||||
→chroma/main-chroma-print -- "2nd-PATH (-n opt-with-arg-active) NON-EMPTY arg-active:\nThe actual opt-val <<< \$__wrd:$__wrd >>> store (after the \`Arg-Awaiting' in the chroma-run: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]-1 )) [current: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))])"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="$__wrd"
|
||||
__have_value=1
|
||||
fi
|
||||
|
||||
# Execute the action if not during simulated opt-argument (--opt=...)
|
||||
→chroma/main-chroma-print "** BEFORE: \`if (( __have_value ))'"
|
||||
if (( __have_value )); then
|
||||
→chroma/main-chroma-print "In the \`if (( __have_value ))' [have_value: $__have_value]"
|
||||
# Split
|
||||
__var_name="${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=""
|
||||
__split=( "${(@s://:P)__var_name}" )
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && { →chroma/main-chroma-print -rl "NULL at __var_name:$__var_name" ; __split=(); }
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
|
||||
# Remember 1st level action
|
||||
(( __have_value == 2 )) && __value="$__action" || __value=""
|
||||
|
||||
if (( ${#__split} )); then
|
||||
→chroma/main-chroma-print -l -- "Got //-split (3, for opt-ARG-action, from [$__var_name]):" "${${(q-)__split[@]}[@]/(#s)/+\\t}"
|
||||
__action="${__split[1]}"
|
||||
__handler="${__split[2]}"
|
||||
[[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}"
|
||||
|
||||
[[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(2): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; }
|
||||
[[ -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running action(2): $__action" ; eval "$__action"; }
|
||||
→chroma/main-chroma-print -rl -- "The __action value: [$__value]"
|
||||
[[ "$__have_value" -eq 2 && -n "$__value" && "$__value" != "NO-OP" ]] && { →chroma/main-chroma-print -rl "Running action (of 1, at 2): $__value" ; eval "$__value"; }
|
||||
fi
|
||||
fi
|
||||
→chroma/main-chroma-print -- "_________ Exiting →chroma/main-process-token.ch $__subcmd / $__wrd _________"
|
||||
}
|
||||
|
||||
# Iterates over the chroma def. fields and creates initial
|
||||
# fields in the fsh__${__chroma_name}__chroma__def hash
|
||||
→chroma/-pre_process_chroma_def.ch() {
|
||||
local __key __value __ke _val __the_hash_name="$1" __var_name
|
||||
local -a __split
|
||||
|
||||
→chroma/main-chroma-print -rl -- "Starting PRE_PROCESS for __the_hash_name:$__the_hash_name"
|
||||
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[subcommands]"
|
||||
local __subcmds="${(P)__ch_def_name}"
|
||||
if [[ "$__subcmds" = "::"* ]]; then
|
||||
${__subcmds#::}
|
||||
__var_name="${__the_hash_name}[subcommands]"
|
||||
: ${(P)__var_name::=(${(j:|:)reply})}
|
||||
else
|
||||
__var_name="${__the_hash_name}[subcommands]"
|
||||
: ${(P)__var_name::=$__subcmds}
|
||||
fi
|
||||
→chroma/main-chroma-print "Got SUBCOMMANDS: ${(P)__var_name}"
|
||||
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[subcmd-hook]"
|
||||
local __subcmd_hook="${(P)__ch_def_name}"
|
||||
if [[ -n "$__subcmd_hook" ]]; then
|
||||
__var_name="${__the_hash_name}[subcmd-hook]"
|
||||
: ${(P)__var_name::=$__subcmd_hook}
|
||||
fi
|
||||
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[(I)subcmd:*]"
|
||||
for __key in "${(P@)__ch_def_name}"; do
|
||||
__split=( "${(@s:|:)${${__key##subcmd:\((#c0,1)}%\)}}" )
|
||||
[[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=()
|
||||
__split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
|
||||
for __ke in "${__split[@]}"; do
|
||||
__var_name="${__the_hash_name}[subcmd:$__ke]"
|
||||
__ch_def_name="fsh__${__chroma_name}__chroma__def[$__key]"
|
||||
: ${(P)__var_name::=${(P)__ch_def_name}}
|
||||
→chroma/main-chroma-print -rl -- "Storred ${__var_name}=chroma_def[$__key], i.e. = ${(P)__ch_def_name}"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
if (( __first_call )); then
|
||||
→chroma/-${__chroma_name}-first-call
|
||||
FAST_HIGHLIGHT[chroma-current]="$__wrd"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]=0
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=0
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]=""
|
||||
FAST_HIGHLIGHT[chrome-${FAST_HIGHLIGHT[chroma-current]}-occurred-double-hyphen]=0
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=""
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]=""
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]=1
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]=""
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]=""
|
||||
__the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}"
|
||||
(( 0 == ${(P)+__the_hash_name} )) && {
|
||||
typeset -gA "$__the_hash_name"
|
||||
→chroma/-pre_process_chroma_def.ch "$__the_hash_name"
|
||||
} || →chroma/main-chroma-print "...No... [\${+$__the_hash_name} ${(P)+__the_hash_name}]"
|
||||
return 1
|
||||
else
|
||||
(( ++ FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))
|
||||
# Following call, i.e. not the first one
|
||||
|
||||
# Check if chroma should end – test if token is of type
|
||||
# "starts new command", if so pass-through – chroma ends
|
||||
[[ "$__arg_type" = 3 ]] && return 2
|
||||
|
||||
→chroma/main-chroma-print "== @@ Starting @@ #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]} Main-Chroma-call == // << __WORD:$__wrd >> ## Subcommand: ${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL} //@@// -n option-with-arg-active:${(q-)FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}"
|
||||
if [[ "$__wrd" = -* || -n "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}"
|
||||
]]; then
|
||||
→chroma/main-chroma-print "## The \`if -*' i.e. \`IF OPTION' MAIN branch"
|
||||
→chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd"
|
||||
else
|
||||
# If at e.g. '>' or destination/source spec (of the redirection)
|
||||
if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then
|
||||
return 1
|
||||
elif (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand] == 0 )) {
|
||||
__the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}"
|
||||
__var_name="${__the_hash_name}[subcommands]"
|
||||
if [[ "$__wrd" = ${(P)~__var_name} ]]; then
|
||||
→chroma/main-chroma-print "GOT-SUBCOMMAND := $__wrd, subcmd verification / OK"
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=1
|
||||
FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="$__wrd"
|
||||
__var_name="${__the_hash_name}[subcmd-hook]"
|
||||
(( ${(P)+__var_name} )) && { →chroma/main-chroma-print -r -- "Running subcmd-hook: ${(P)__var_name}" ; "${(P)__var_name}" "$__wrd"; }
|
||||
__style="${FAST_THEME_NAME}subcommand"
|
||||
else
|
||||
→chroma/main-chroma-print "subcmd verif / NOT OK; Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" >> /tmp/fsh-dbg
|
||||
(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 ))
|
||||
→chroma/main-chroma-print "UNRECOGNIZED ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"
|
||||
→chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd"
|
||||
fi
|
||||
} else {
|
||||
__wrd="${__wrd//\`/x}"
|
||||
__arg="${__arg//\`/x}"
|
||||
__wrd="${(Q)__wrd}"
|
||||
|
||||
local __tmp_def_name="fsh__${__chroma_name}__chroma__def[subcommands-blacklist]"
|
||||
if [[ ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]} = \
|
||||
(${(~j:|:)${(@s:,:)${(PA)__tmp_def_name}}})
|
||||
]] {
|
||||
return 1
|
||||
}
|
||||
|
||||
→chroma/main-chroma-print "Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))"
|
||||
(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 ))
|
||||
→chroma/main-chroma-print "ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"
|
||||
|
||||
→chroma/main-chroma-print "ELSE *-got-subcommand == 1 is TRUE"
|
||||
→chroma/main-process-token.ch "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}" "$__wrd"
|
||||
}
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Add region_highlight entry (via `reply' array)
|
||||
if [[ -n "$__style" ]]; then
|
||||
(( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \
|
||||
&& reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
|
||||
fi
|
||||
|
||||
# We aren't passing-through, do obligatory things ourselves
|
||||
(( this_word = next_word ))
|
||||
_start_pos=$_end_pos
|
||||
|
||||
return 0
|
||||
|
||||
# vim:ft=zsh:et:sw=4
|
|
@ -0,0 +1,15 @@
|
|||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
parallelism: 4
|
||||
shell: /bin/bash --login
|
||||
docker:
|
||||
- image: ericfreese/zsh-autosuggestions-test:latest
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Running tests
|
||||
command: |
|
||||
for v in $(grep "^[^#]" ZSH_VERSIONS | awk "(NR + $CIRCLE_NODE_INDEX) % $CIRCLE_NODE_TOTAL == 0"); do
|
||||
TEST_ZSH_BIN=zsh-$v make test || exit 1
|
||||
done
|
|
@ -0,0 +1,18 @@
|
|||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
indent_style = space
|
||||
|
||||
[*.rb]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### Describe the bug
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
### To Reproduce
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
<!-- If you are not able to reproduce it by running `zsh -df` and sourcing the plugin manually, it means there that the issue is caused by something in your local config file(s). Temporarily comment out or remove sections of your config and restart `zsh` until you narrow down exactly what is causing the issue. -->
|
||||
|
||||
```sh
|
||||
% zsh -df
|
||||
% source path/to/zsh-autosuggestions.zsh
|
||||
% ... # what do you do to reproduce?
|
||||
```
|
||||
|
||||
### Expected behavior
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
### Screenshots
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
### Desktop
|
||||
- OS + distribution: <!-- e.g. Arch Linux 2019.07.01 -->
|
||||
- Zsh version: <!-- `echo $ZSH_VERSION` -->
|
||||
- Plugin version: <!-- or git commit hash if installed via git -->
|
||||
|
||||
### Additional context
|
||||
<!-- Add any other context about the problem here. -->
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### Is your feature request related to a problem? Please describe.
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
### Describe the solution you'd like
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
### Describe alternatives you've considered
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
### Additional context
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|