Merge pull request #135 from jirutka/redrawhook

Fix compatibility with latest zsh-syntax-highlighting (zle-line-pre-redraw) and use memo= feature
This commit is contained in:
Guido van Steen 2023-01-03 20:25:44 +01:00 committed by GitHub
commit 400e58a87f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -65,6 +65,7 @@ typeset -g -i _history_substring_search_raw_match_index
typeset -g -a _history_substring_search_matches typeset -g -a _history_substring_search_matches
typeset -g -i _history_substring_search_match_index typeset -g -i _history_substring_search_match_index
typeset -g -A _history_substring_search_unique_filter typeset -g -A _history_substring_search_unique_filter
typeset -g -i _history_substring_search_zsh_5_9
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# the main ZLE widgets # the main ZLE widgets
@ -98,6 +99,11 @@ zle -N history-substring-search-down
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
zmodload -F zsh/parameter zmodload -F zsh/parameter
autoload -Uz is-at-least
if is-at-least 5.9 $ZSH_VERSION; then
_history_substring_search_zsh_5_9=1
fi
# #
# We have to "override" some keys and widgets if the # We have to "override" some keys and widgets if the
@ -118,80 +124,125 @@ if [[ $+functions[_zsh_highlight] -eq 0 ]]; then
} }
# #
# The following snippet was taken from the zsh-syntax-highlighting project: # Check if $1 denotes the name of a callable function, i.e. it is fully
# defined or it is marked for autoloading and autoloading it at the first
# call to it will succeed. In particular, if $1 has been marked for
# autoloading but is not available in $fpath, then it will return 1 (false).
# #
# https://github.com/zsh-users/zsh-syntax-highlighting/blob/56b134f5d62ae3d4e66c7f52bd0cc2595f9b305b/zsh-syntax-highlighting.zsh#L126-161 # This is based on the zsh-syntax-highlighting plugin.
# #
# Copyright (c) 2010-2011 zsh-syntax-highlighting contributors _history-substring-search-function-callable() {
# All rights reserved. if (( ${+functions[$1]} )) && ! [[ "$functions[$1]" == *"builtin autoload -X"* ]]; then
return 0 # already fully loaded
else
# "$1" is either an autoload stub, or not a function at all.
# We expect 'autoload +X' to return non-zero if it fails to fully load
# the function.
( autoload -U +X -- "$1" 2>/dev/null )
return $?
fi
}
# #
# Redistribution and use in source and binary forms, with or without # The zsh-syntax-highlighting plugin uses zle-line-pre-redraw hook instead
# modification, are permitted provided that the following conditions are # of the legacy "bind all widgets" if 1) zsh has the memo= feature (added in
# met: # version 5.9) and 2) add-zle-hook-widget is available.
# #
# * Redistributions of source code must retain the above copyright if [[ $_history_substring_search_zsh_5_9 -eq 1 ]] && _history-substring-search-function-callable add-zle-hook-widget; then
# notice, this list of conditions and the following disclaimer. #
# # The following code is based on the zsh-syntax-highlighting plugin.
# * Redistributions in binary form must reproduce the above copyright #
# notice, this list of conditions and the following disclaimer in the autoload -U add-zle-hook-widget
# documentation and/or other materials provided with the distribution.
# _history-substring-search-zle-line-finish() {
# * Neither the name of the zsh-syntax-highlighting contributors nor the #
# names of its contributors may be used to endorse or promote products # Reset $WIDGET since the 'main' highlighter depends on it.
# derived from this software without specific prior written permission. #
# # Since $WIDGET is declared by zle as read-only in this function's scope,
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # a nested function is required in order to shadow its built-in value;
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # see "User-defined widgets" in zshall.
# 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, local -h -r WIDGET=zle-line-finish
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, _zsh_highlight
# 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.
#
#--------------8<-------------------8<-------------------8<-----------------
# Rebind all ZLE widgets to make them invoke _zsh_highlights.
_zsh_highlight_bind_widgets()
{
# Load ZSH module zsh/zleparameter, needed to override user defined widgets.
zmodload zsh/zleparameter 2>/dev/null || {
echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' >&2
return 1
} }
# Override ZLE widgets to make them invoke _zsh_highlight. _history-substring-search-zle-line-pre-redraw() {
local cur_widget #
for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|_*|orig-*|run-help|which-command|beep|yank*)}; do # If the zsh-syntax-highlighting plugin has been loaded (after our plugin
case $widgets[$cur_widget] in # plugin, otherwise this hook wouldn't be called), remove our hooks.
#
if [[ $+ZSH_HIGHLIGHT_VERSION -eq 1 ]]; then
autoload -U add-zle-hook-widget
add-zle-hook-widget -d zle-line-pre-redraw _history-substring-search-zle-line-pre-redraw
add-zle-hook-widget -d zle-line-finish _history-substring-search-zle-line-finish
return 0
fi
#
# Set $? to 0 for _zsh_highlight. Without this, subsequent
# zle-line-pre-redraw hooks won't run, since add-zle-hook-widget happens to
# call us with $? == 1 in the common case.
#
true && _zsh_highlight "$@"
}
# Already rebound event: do nothing. if [[ -o zle ]]; then
user:$cur_widget|user:_zsh_highlight_widget_*);; add-zle-hook-widget zle-line-pre-redraw _history-substring-search-zle-line-pre-redraw
add-zle-hook-widget zle-line-finish _history-substring-search-zle-line-finish
fi
else
#
# The following snippet was taken from the zsh-syntax-highlighting project:
# https://github.com/zsh-users/zsh-syntax-highlighting/blob/56b134f5d62ae3d4e66c7f52bd0cc2595f9b305b/zsh-syntax-highlighting.zsh#L126-161
#
# SPDX-SnippetBegin
# SPDX-License-Identifier: BSD-3-Clause
# SPDX-SnippetCopyrightText: 2010-2011 zsh-syntax-highlighting contributors
#--------------8<-------------------8<-------------------8<-----------------
# Rebind all ZLE widgets to make them invoke _zsh_highlights.
_zsh_highlight_bind_widgets()
{
# Load ZSH module zsh/zleparameter, needed to override user defined widgets.
zmodload zsh/zleparameter 2>/dev/null || {
echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' >&2
return 1
}
# User defined widget: override and rebind old one with prefix "orig-". # Override ZLE widgets to make them invoke _zsh_highlight.
user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \ local cur_widget
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \ for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|_*|orig-*|run-help|which-command|beep|yank*)}; do
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; case $widgets[$cur_widget] in
# Completion widget: override and rebind old one with prefix "orig-". # Already rebound event: do nothing.
completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \ user:$cur_widget|user:_zsh_highlight_widget_*);;
_zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
# Builtin widget: override and make it call the builtin ".widget". # User defined widget: override and rebind old one with prefix "orig-".
builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget -- \"\$@\" && _zsh_highlight }; \ user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";; _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
# Default: unhandled case. # Completion widget: override and rebind old one with prefix "orig-".
*) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;; completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \
esac _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \
done zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
}
#-------------->8------------------->8------------------->8-----------------
_zsh_highlight_bind_widgets # Builtin widget: override and make it call the builtin ".widget".
builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget -- \"\$@\" && _zsh_highlight }; \
zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
# Default: unhandled case.
*) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;;
esac
done
}
#-------------->8------------------->8------------------->8-----------------
# SPDX-SnippetEnd
_zsh_highlight_bind_widgets
fi
unfunction _history-substring-search-function-callable
fi fi
_history-substring-search-begin() { _history-substring-search-begin() {
@ -312,12 +363,21 @@ _history-substring-search-begin() {
_history-substring-search-end() { _history-substring-search-end() {
setopt localoptions extendedglob setopt localoptions extendedglob
local highlight_memo=
_history_substring_search_result=$BUFFER _history_substring_search_result=$BUFFER
if [[ $_history_substring_search_zsh_5_9 -eq 1 ]]; then
highlight_memo='memo=history-substring-search'
fi
# the search was successful so display the result properly by clearing away # the search was successful so display the result properly by clearing away
# existing highlights and moving the cursor to the end of the result buffer # existing highlights and moving the cursor to the end of the result buffer
if [[ $_history_substring_search_refresh_display -eq 1 ]]; then if [[ $_history_substring_search_refresh_display -eq 1 ]]; then
region_highlight=() if [[ -n $highlight_memo ]]; then
region_highlight=( "${(@)region_highlight:#*${highlight_memo}*}" )
else
region_highlight=()
fi
CURSOR=${#BUFFER} CURSOR=${#BUFFER}
fi fi
@ -337,7 +397,9 @@ _history-substring-search-end() {
if [[ $query_part_match_index -le ${#BUFFER:$highlight_start_index} ]]; then if [[ $query_part_match_index -le ${#BUFFER:$highlight_start_index} ]]; then
highlight_start_index=$(( $highlight_start_index + $query_part_match_index )) highlight_start_index=$(( $highlight_start_index + $query_part_match_index ))
highlight_end_index=$(( $highlight_start_index + ${#query_part} )) highlight_end_index=$(( $highlight_start_index + ${#query_part} ))
region_highlight+=("$(($highlight_start_index - 1)) $(($highlight_end_index - 1)) $_history_substring_search_query_highlight") region_highlight+=(
"$(($highlight_start_index - 1)) $(($highlight_end_index - 1)) ${_history_substring_search_query_highlight}${highlight_memo:+,$highlight_memo}"
)
fi fi
done done
fi fi