You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

138 lines
5.0 KiB

# -*- 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