| @ -1,293 +0,0 @@ | |||||
| #compdef git gitk | |||||
| # zsh completion wrapper for git | |||||
| # | |||||
| # Copyright (c) 2012-2020 Felipe Contreras <felipe.contreras@gmail.com> | |||||
| # | |||||
| # The recommended way to install this script is to make a copy of it as a | |||||
| # file named '_git' inside any directory in your fpath. | |||||
| # | |||||
| # For example, create a directory '~/.zsh/', copy this file to '~/.zsh/_git', | |||||
| # and then add the following to your ~/.zshrc file: | |||||
| # | |||||
| # fpath=(~/.zsh $fpath) | |||||
| # | |||||
| # You need git's bash completion script installed. By default bash-completion's | |||||
| # location will be used (e.g. pkg-config --variable=completionsdir bash-completion). | |||||
| # | |||||
| # If your bash completion script is somewhere else, you can specify the | |||||
| # location in your ~/.zshrc: | |||||
| # | |||||
| # zstyle ':completion:*:*:git:*' script ~/.git-completion.bash | |||||
| # | |||||
| zstyle -T ':completion:*:*:git:*' tag-order && \ | |||||
| zstyle ':completion:*:*:git:*' tag-order 'common-commands' | |||||
| zstyle -s ":completion:*:*:git:*" script script | |||||
| if [ -z "$script" ]; then | |||||
| local -a locations | |||||
| local e bash_completion | |||||
| bash_completion=$(pkg-config --variable=completionsdir bash-completion 2>/dev/null) || | |||||
| bash_completion='/usr/share/bash-completion/completions/' | |||||
| locations=( | |||||
| "$(dirname ${funcsourcetrace[1]%:*})"/git-completion.bash | |||||
| "$HOME/.local/share/bash-completion/completions/git" | |||||
| "$bash_completion/git" | |||||
| '/etc/bash_completion.d/git' # old debian | |||||
| ) | |||||
| for e in $locations; do | |||||
| test -f $e && script="$e" && break | |||||
| done | |||||
| fi | |||||
| local old_complete="$functions[complete]" | |||||
| functions[complete]=: | |||||
| GIT_SOURCING_ZSH_COMPLETION=y . "$script" | |||||
| functions[complete]="$old_complete" | |||||
| __gitcomp () | |||||
| { | |||||
| emulate -L zsh | |||||
| local cur_="${3-$cur}" | |||||
| case "$cur_" in | |||||
| --*=) | |||||
| ;; | |||||
| --no-*) | |||||
| local c IFS=$' \t\n' | |||||
| local -a array | |||||
| for c in ${=1}; do | |||||
| if [[ $c == "--" ]]; then | |||||
| continue | |||||
| fi | |||||
| c="$c${4-}" | |||||
| case $c in | |||||
| --*=|*.) ;; | |||||
| *) c="$c " ;; | |||||
| esac | |||||
| array+=("$c") | |||||
| done | |||||
| compset -P '*[=:]' | |||||
| compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 | |||||
| ;; | |||||
| *) | |||||
| local c IFS=$' \t\n' | |||||
| local -a array | |||||
| for c in ${=1}; do | |||||
| if [[ $c == "--" ]]; then | |||||
| c="--no-...${4-}" | |||||
| array+=("$c ") | |||||
| break | |||||
| fi | |||||
| c="$c${4-}" | |||||
| case $c in | |||||
| --*=|*.) ;; | |||||
| *) c="$c " ;; | |||||
| esac | |||||
| array+=("$c") | |||||
| done | |||||
| compset -P '*[=:]' | |||||
| compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| __gitcomp_direct () | |||||
| { | |||||
| emulate -L zsh | |||||
| compset -P '*[=:]' | |||||
| compadd -Q -S '' -- ${(f)1} && _ret=0 | |||||
| } | |||||
| __gitcomp_nl () | |||||
| { | |||||
| emulate -L zsh | |||||
| compset -P '*[=:]' | |||||
| compadd -Q -S "${4- }" -p "${2-}" -- ${(f)1} && _ret=0 | |||||
| } | |||||
| __gitcomp_file () | |||||
| { | |||||
| emulate -L zsh | |||||
| compadd -f -p "${2-}" -- ${(f)1} && _ret=0 | |||||
| } | |||||
| __gitcomp_direct_append () | |||||
| { | |||||
| __gitcomp_direct "$@" | |||||
| } | |||||
| __gitcomp_nl_append () | |||||
| { | |||||
| __gitcomp_nl "$@" | |||||
| } | |||||
| __gitcomp_file_direct () | |||||
| { | |||||
| __gitcomp_file "$1" "" | |||||
| } | |||||
| _git_zsh () | |||||
| { | |||||
| __gitcomp "v1.1" | |||||
| } | |||||
| __git_complete_command () | |||||
| { | |||||
| emulate -L zsh | |||||
| local command="$1" | |||||
| local completion_func="_git_${command//-/_}" | |||||
| if (( $+functions[$completion_func] )); then | |||||
| emulate ksh -c $completion_func | |||||
| return 0 | |||||
| else | |||||
| return 1 | |||||
| fi | |||||
| } | |||||
| __git_zsh_bash_func () | |||||
| { | |||||
| emulate -L ksh | |||||
| local command=$1 | |||||
| __git_complete_command "$command" && return | |||||
| local expansion=$(__git_aliased_command "$command") | |||||
| if [ -n "$expansion" ]; then | |||||
| words[1]=$expansion | |||||
| __git_complete_command "$expansion" | |||||
| fi | |||||
| } | |||||
| __git_zsh_cmd_common () | |||||
| { | |||||
| local -a list | |||||
| list=( | |||||
| add:'add file contents to the index' | |||||
| bisect:'find by binary search the change that introduced a bug' | |||||
| branch:'list, create, or delete branches' | |||||
| checkout:'checkout a branch or paths to the working tree' | |||||
| clone:'clone a repository into a new directory' | |||||
| commit:'record changes to the repository' | |||||
| diff:'show changes between commits, commit and working tree, etc' | |||||
| fetch:'download objects and refs from another repository' | |||||
| grep:'print lines matching a pattern' | |||||
| init:'create an empty Git repository or reinitialize an existing one' | |||||
| log:'show commit logs' | |||||
| merge:'join two or more development histories together' | |||||
| mv:'move or rename a file, a directory, or a symlink' | |||||
| pull:'fetch from and merge with another repository or a local branch' | |||||
| push:'update remote refs along with associated objects' | |||||
| rebase:'forward-port local commits to the updated upstream head' | |||||
| reset:'reset current HEAD to the specified state' | |||||
| restore:'restore working tree files' | |||||
| rm:'remove files from the working tree and from the index' | |||||
| show:'show various types of objects' | |||||
| status:'show the working tree status' | |||||
| switch:'switch branches' | |||||
| tag:'create, list, delete or verify a tag object signed with GPG') | |||||
| _describe -t common-commands 'common commands' list && _ret=0 | |||||
| } | |||||
| __git_zsh_cmd_alias () | |||||
| { | |||||
| local -a list | |||||
| list=(${${(0)"$(git config -z --get-regexp '^alias\.*')"}#alias.}) | |||||
| list=(${(f)"$(printf "%s:alias for '%s'\n" ${(f@)list})"}) | |||||
| _describe -t alias-commands 'aliases' list && _ret=0 | |||||
| } | |||||
| __git_zsh_cmd_all () | |||||
| { | |||||
| local -a list | |||||
| emulate ksh -c __git_compute_all_commands | |||||
| list=( ${=__git_all_commands} ) | |||||
| _describe -t all-commands 'all commands' list && _ret=0 | |||||
| } | |||||
| __git_zsh_main () | |||||
| { | |||||
| local curcontext="$curcontext" state state_descr line | |||||
| typeset -A opt_args | |||||
| local -a orig_words | |||||
| orig_words=( ${words[@]} ) | |||||
| _arguments -C \ | |||||
| '(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \ | |||||
| '(-p --paginate)--no-pager[do not pipe git output into a pager]' \ | |||||
| '--git-dir=-[set the path to the repository]: :_directories' \ | |||||
| '--bare[treat the repository as a bare repository]' \ | |||||
| '(- :)--version[prints the git suite version]' \ | |||||
| '--exec-path=-[path to where your core git programs are installed]:: :_directories' \ | |||||
| '--html-path[print the path where git''s HTML documentation is installed]' \ | |||||
| '--info-path[print the path where the Info files are installed]' \ | |||||
| '--man-path[print the manpath (see `man(1)`) for the man pages]' \ | |||||
| '--work-tree=-[set the path to the working tree]: :_directories' \ | |||||
| '--namespace=-[set the git namespace]' \ | |||||
| '--no-replace-objects[do not use replacement refs to replace git objects]' \ | |||||
| '(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \ | |||||
| '(-): :->command' \ | |||||
| '(-)*:: :->arg' && return | |||||
| case $state in | |||||
| (command) | |||||
| _tags common-commands alias-commands all-commands | |||||
| while _tags; do | |||||
| _requested common-commands && __git_zsh_cmd_common | |||||
| _requested alias-commands && __git_zsh_cmd_alias | |||||
| _requested all-commands && __git_zsh_cmd_all | |||||
| let _ret || break | |||||
| done | |||||
| ;; | |||||
| (arg) | |||||
| local command="${words[1]}" __git_dir | |||||
| if (( $+opt_args[--bare] )); then | |||||
| __git_dir='.' | |||||
| else | |||||
| __git_dir=${opt_args[--git-dir]} | |||||
| fi | |||||
| (( $+opt_args[--help] )) && command='help' | |||||
| words=( ${orig_words[@]} ) | |||||
| __git_zsh_bash_func $command | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| _git () | |||||
| { | |||||
| local _ret=1 | |||||
| local cur cword prev | |||||
| cur=${words[CURRENT]} | |||||
| prev=${words[CURRENT-1]} | |||||
| let cword=CURRENT-1 | |||||
| if (( $+functions[__${service}_zsh_main] )); then | |||||
| __${service}_zsh_main | |||||
| elif (( $+functions[__${service}_main] )); then | |||||
| emulate ksh -c __${service}_main | |||||
| elif (( $+functions[_${service}] )); then | |||||
| emulate ksh -c _${service} | |||||
| elif (( $+functions[_${service//-/_}] )); then | |||||
| emulate ksh -c _${service//-/_} | |||||
| fi | |||||
| let _ret && _default && _ret=0 | |||||
| return _ret | |||||
| } | |||||
| _git | |||||
| @ -1,98 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,30 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,37 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,60 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,17 +0,0 @@ | |||||
| # $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 | |||||
| @ -1,5 +0,0 @@ | |||||
| # These are supported funding model platforms | |||||
| github: psprint | |||||
| patreon: psprint | |||||
| ko_fi: psprint | |||||
| @ -1,24 +0,0 @@ | |||||
| 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 | |||||
| @ -1,13 +0,0 @@ | |||||
| 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 | |||||
| @ -1,8 +0,0 @@ | |||||
| tap: false | |||||
| directories: | |||||
| tests: tests | |||||
| output: tests/_output | |||||
| support: tests/_support | |||||
| time_limit: 0 | |||||
| fail_fast: false | |||||
| allow_risky: false | |||||
| @ -1,144 +0,0 @@ | |||||
| # 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: | |||||
|  | |||||
| **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: | |||||
|  | |||||
| `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. | |||||
|  | |||||
| **2018-06-01** | |||||
| Highlighting of command substitution (i.e. `$(...)`) with alternate theme – two themes at once! It was just white before: | |||||
|  | |||||
| 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`: | |||||
|  | |||||
| **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). | |||||
|  | |||||
| **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.: | |||||
|  | |||||
| Also, `zcalc` has a separate math mode and specialized highlighting – no more light-red colors because of | |||||
| treating `zcalc` like a regular command-line: | |||||
|  | |||||
| **2018-05-22** | |||||
| Array assignments were still boring, so I throwed in bracked colorizing: | |||||
|  | |||||
| **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=$(( ... ))`). | |||||
|  | |||||
| **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. | |||||
|  | |||||
| @ -1,166 +0,0 @@ | |||||
| # 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 | |||||
| ---- | |||||
| @ -1,441 +0,0 @@ | |||||
| <!-- START doctoc generated TOC please keep comment here to allow auto update --> | |||||
| <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> | |||||
| **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* | |||||
| - [2018-08-14, received $30](#2018-08-14-received-30) | |||||
| - [2018-08-03, received $8](#2018-08-03-received-8) | |||||
| - [2018-08-02, received $3 from Patreon](#2018-08-02-received-3-from-patreon) | |||||
| - [2018-07-31, received $7](#2018-07-31-received-7) | |||||
| - [2018-07-28, received $2](#2018-07-28-received-2) | |||||
| - [2018-07-25, received $3](#2018-07-25-received-3) | |||||
| - [2018-07-20, received $3](#2018-07-20-received-3) | |||||
| - [2018-06-17, received ~$155 (200 CAD)](#2018-06-17-received-155-200-cad) | |||||
| - [2018-06-10, received $10](#2018-06-10-received-10) | |||||
| - [2018-05-25, received $50](#2018-05-25-received-50) | |||||
| <!-- END doctoc generated TOC please keep comment here to allow auto update --> | |||||
| Below are reports about what is being done with donations, i.e. which commits | |||||
| are created thanks to them, which new features are added, etc. From the money | |||||
| I receive I buy myself coffee and organize the time to work on the requested | |||||
| features, sometimes many days in a row. | |||||
| ## 2018-08-14, received $30 | |||||
| * **Project**: **[Zplugin](https://github.com/zdharma/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 | |||||
| ``` | |||||
| @ -1,23 +0,0 @@ | |||||
| 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. | |||||
| @ -1,290 +0,0 @@ | |||||
| [](https://www.paypal.me/ZdharmaInitiative) | |||||
| [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D54B3S7C6HGME) | |||||
| [](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 [](https://kiwiirc.com/client/chat.freenode.net:+6697/#zinit) | |||||
| @ -1,76 +0,0 @@ | |||||
| # 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: | |||||
|  | |||||
| In the above screen-shot the interior of `$( ... )` uses different colors than the rest of the | |||||
| code. Example for `eval`: | |||||
|  | |||||
| 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). | |||||
| @ -1,39 +0,0 @@ | |||||
| #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 | |||||
| @ -1,77 +0,0 @@ | |||||
| # 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 | |||||
| } | |||||
| @ -1,384 +0,0 @@ | |||||
| # ------------------------------------------------------------------------------------------------- | |||||
| # 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|zle-keymap-select)}) | |||||
| # 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 | |||||
| @ -1,385 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,61 +0,0 @@ | |||||
| : ${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} | |||||
| @ -1,220 +0,0 @@ | |||||
| #!/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 | |||||
| @ -1,823 +0,0 @@ | |||||
| # ------------------------------------------------------------------------------------------------- | |||||
| # 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 | |||||
| @ -1,2 +0,0 @@ | |||||
| #!/usr/bin/env zsh | |||||
| # Write your bootstrap code here | |||||
| @ -1,15 +0,0 @@ | |||||
| #!/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 | |||||
| @ -1,124 +0,0 @@ | |||||
| #!/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 | |||||
| @ -1,81 +0,0 @@ | |||||
| [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 | |||||
| @ -1,84 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,81 +0,0 @@ | |||||
| [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 | |||||
| @ -1,81 +0,0 @@ | |||||
| [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 | |||||
| @ -1,163 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,83 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,82 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,100 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,100 +0,0 @@ | |||||
| ; 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 | |||||
| @ -1,81 +0,0 @@ | |||||
| [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 | |||||
| @ -1,29 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,104 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,22 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,108 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,90 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,120 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,40 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,61 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,954 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,89 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,51 +0,0 @@ | |||||
| # 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 $* | |||||
| @ -1,117 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,59 +0,0 @@ | |||||
| # 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 $* | |||||
| @ -1,105 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,138 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,58 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,37 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,383 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,80 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,17 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,86 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,81 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,87 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,72 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,75 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,156 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,25 +0,0 @@ | |||||
| # 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 | |||||
| @ -1,250 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,51 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,138 +0,0 @@ | |||||
| # -*- 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 | |||||
| @ -1,96 +0,0 @@ | |||||
| # -*- 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 | |||||