aboutsummaryrefslogtreecommitdiff
path: root/.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch
diff options
context:
space:
mode:
Diffstat (limited to '.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch')
-rw-r--r--.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch61
1 files changed, 61 insertions, 0 deletions
diff --git a/.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch b/.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch
new file mode 100644
index 0000000..072cee3
--- /dev/null
+++ b/.config/shell/zsh-fast-syntax-highlighting/:chroma/-fpath_peq.ch
@@ -0,0 +1,61 @@
+# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# Copyright (c) 2018 Sebastian Gniazdowski
+#
+# This chroma does a narrow, obscure but prestigious parsing of fpath+=( elem1
+# elem2 ... ) construct to provide *the* *future* contents of $fpath to
+# -autoload.ch, so that it can detect functions in those provided directories
+# `elem1', `elem2', etc. and highlight the functions with `correct-subtle'
+# instead of `incorrect-subtle'. Basically all thit is for command-lines like:
+#
+# % fpath+=( `pwd` ); autoload my-fun-from-PWD
+
+# Keep chroma-takever state meaning: until ; or similar (see $__arg_type below)
+# The 8192 sum takes care that the next token will be routed to this chroma
+(( next_word = 2 | 8192 ))
+
+local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4"
+local -a deserialized
+
+(( __first_call )) && {
+ case $__wrd in
+ (fpath=\()
+ FAST_HIGHLIGHT[fpath_peq_mode]=1
+ ;;
+ (fpath+=\()
+ FAST_HIGHLIGHT[fpath_peq_mode]=2
+ ;;
+ (FPATH=)
+ FAST_HIGHLIGHT[fpath_peq_mode]=4
+ ;;
+ (FPATH+=)
+ FAST_HIGHLIGHT[fpath_peq_mode]=8
+ ;;
+ esac
+ if (( FAST_HIGHLIGHT[fpath_peq_mode] & 5 )); then
+ FAST_HIGHLIGHT[chroma-fpath_peq-elements]="! ${FAST_HIGHLIGHT[chroma-fpath_peq-elements]}"
+ fi
+ return 1
+} || {
+ # Following call, i.e. not the first one
+
+ # Check if chroma should end – test if token is of type
+ # "starts new command", if so pass-through – chroma ends
+ [[ "$__arg_type" = 3 ]] && return 2
+
+ [[ "$__wrd" != ")" ]] && {
+ deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-fpath_peq-elements]}}" )
+ [[ -z "${deserialized[1]}" && ${#deserialized} -eq 1 ]] && deserialized=()
+ # Support ~ and $VAR, for [a-zA-Z_][a-ZA-Z0-9_]# characters in "VAR"
+ deserialized+=( "${(Q)${${(j: :)__wrd}//(#b)((\$([0-9]##|[a-zA-Z_][a-zA-Z0-9_]#))|(\$\{([0-9]##|[a-zA-Z_][a-zA-Z0-9_]#)\})|(#s)~)/${(P)${${${${match[1]##\$\{(#c0,1)}%\}}:#\~}:-HOME}}}}" )
+ FAST_HIGHLIGHT[chroma-fpath_peq-elements]="${(j: :)${(q@)deserialized}}"
+ }
+
+ return 1
+}
+
+(( this_word = next_word ))
+_start_pos=$_end_pos
+
+return 0
+
+# vim:ft=zsh:et:sw=4