Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes for zle handling #288

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ custom widgets have been created (i.e., after all `zle -N` calls and after
running `compinit`). Widgets created later will work, but will not update the
syntax highlighting.

### Why does syntax highlighting not work while searching history?

In `zsh` versions before 5.3 is not possible for `zsh-syntax-highlighting.zsh`
to know if an incremental search is currently active and that matched parts of the
buffer should be underlined (or otherwise highlighted). Therefore, it is not possible
for `zsh-syntax-highlighting.zsh` to apply syntax highlighting and to underline the
matched part of the search. While searching the history, the latter is more important,
so syntax highlighting is disabled in this case.

### How are new releases announced?

There is currently no "push" announcements channel. However, the following
Expand Down
7 changes: 3 additions & 4 deletions highlighters/cursor/cursor-highlighter.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,14 @@
# Whether the cursor highlighter should be called or not.
_zsh_highlight_cursor_highlighter_predicate()
{
# accept-* may trigger removal of cursor highlighting
[[ $WIDGET == accept-* ]] ||
_zsh_highlight_cursor_moved
# remove cursor highlighting when the line is finished
[[ $WIDGET == zle-line-finish ]] || _zsh_highlight_cursor_moved
}

# Cursor highlighting function.
_zsh_highlight_cursor_highlighter()
{
[[ $WIDGET == accept-* ]] && return
[[ $WIDGET == zle-line-finish ]] && return

_zsh_highlight_add_highlight $CURSOR $(( $CURSOR + 1 )) cursor
}
7 changes: 3 additions & 4 deletions highlighters/main/main-highlighter.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@
# Whether the highlighter should be called or not.
_zsh_highlight_main_highlighter_predicate()
{
# accept-* may trigger removal of path_prefix highlighting
[[ $WIDGET == accept-* ]] ||
_zsh_highlight_buffer_modified
# may need to remove path_prefix highlighting when the line ends
[[ $WIDGET == zle-line-finish ]] || _zsh_highlight_buffer_modified
}

# Helper to deal with tokens crossing line boundaries.
Expand Down Expand Up @@ -595,7 +594,7 @@ _zsh_highlight_main_highlighter_check_path()

# If this word ends the buffer, check if it's the prefix of a valid path.
if [[ ${BUFFER[1]} != "-" && ${#BUFFER} == $end_pos ]] &&
[[ $WIDGET != accept-* ]]; then
[[ $WIDGET != zle-line-finish ]]; then
local -a tmp
tmp=( ${expanded_path}*(N) )
(( $#tmp > 0 )) && REPLY=path_prefix && return 0
Expand Down
2 changes: 1 addition & 1 deletion highlighters/main/test-data/path_prefix2.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
# Related to path_prefix.zsh

BUFFER='ls /bin/s'
WIDGET=accept-line
WIDGET=zle-line-finish

expected_region_highlight=(
"4 9 default" # /bin/s
Expand Down
26 changes: 25 additions & 1 deletion zsh-syntax-highlighting.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ _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?'
# and http://www.zsh.org/mla/users/2016/msg00415.html.
if [[ $WIDGET == zle-isearch-update ]]; then
region_highlight=()
return $ret
fi

setopt localoptions warncreateglobal
setopt localoptions noksharrays
local REPLY # don't leak $REPLY into global scope
Expand Down Expand Up @@ -235,8 +243,20 @@ _zsh_highlight_bind_widgets()
}

# Override ZLE widgets to make them invoke _zsh_highlight.
local -U widgets_to_bind
widgets_to_bind=(${${(k)widgets}:#(.*|orig-*|run-help|which-command|beep|set-local-history|yank)})

# 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 ${${(k)widgets}:#(.*|orig-*|run-help|which-command|beep|set-local-history|yank)}; do
for cur_widget in $widgets_to_bind; do
case $widgets[$cur_widget] in

# Already rebound event: do nothing.
Expand All @@ -262,6 +282,10 @@ _zsh_highlight_bind_widgets()
builtin) eval "_zsh_highlight_widget_${(q)cur_widget}() { _zsh_highlight_call_widget .${(q)cur_widget} -- \"\$@\" }"
zle -N $cur_widget _zsh_highlight_widget_$cur_widget;;

# Special zle-* hook that is currently not bound at all: Bind to z-sy-h driectly.
'') eval "_zsh_highlight_widget_${(q)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
Expand Down