Merge remote-tracking branch 'danielsh/m0vie-i288-v2' (revised version of upstream/pr/288)
* danielsh/m0vie-i288-v2: driver: Don't highlight in isearch driver: Always bind zle-line-finish and use it instead of accept-* driver: Widget binding: Support binding incomplete/nonexistent widgets
This commit is contained in:
		
						commit
						171a4eec2d
					
				
							
								
								
									
										18
									
								
								README.md
								
								
								
								
							
							
						
						
									
										18
									
								
								README.md
								
								
								
								
							|  | @ -32,6 +32,24 @@ 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 | running `compinit`).  Widgets created later will work, but will not update the | ||||||
| syntax highlighting. | syntax highlighting. | ||||||
| 
 | 
 | ||||||
|  | ### Why does syntax highlighting not work while searching history? | ||||||
|  | 
 | ||||||
|  | _This problem is fixed in zsh 5.3 and newer._ | ||||||
|  | 
 | ||||||
|  | Highlighting the command line during an incremental history search | ||||||
|  | (with the `history-incremental-search-backward` widget, which is | ||||||
|  | bound by default to <kbd>Ctrl+R</kbd> in zsh's emacs keymap) requires zsh 5.3 | ||||||
|  | or newer. | ||||||
|  | 
 | ||||||
|  | Under zsh 5.2 and older, the zsh-default underlining of the matched portion | ||||||
|  | of the buffer remains available, but zsh-syntax-highlighting's additional | ||||||
|  | highlighting is unavailable.  (Those versions of zsh do not provide enough | ||||||
|  | information to allow computing the highlighting correctly.) | ||||||
|  | 
 | ||||||
|  | See [issue #288][i288] for details. | ||||||
|  | 
 | ||||||
|  | [i288]: https://github.com/zsh-users/zsh-syntax-highlighting/pull/288 | ||||||
|  | 
 | ||||||
| ### How are new releases announced? | ### How are new releases announced? | ||||||
| 
 | 
 | ||||||
| There is currently no "push" announcements channel.  However, the following | There is currently no "push" announcements channel.  However, the following | ||||||
|  |  | ||||||
|  | @ -34,15 +34,14 @@ | ||||||
| # Whether the cursor highlighter should be called or not. | # Whether the cursor highlighter should be called or not. | ||||||
| _zsh_highlight_cursor_highlighter_predicate() | _zsh_highlight_cursor_highlighter_predicate() | ||||||
| { | { | ||||||
|   # accept-* may trigger removal of cursor highlighting |   # remove cursor highlighting when the line is finished | ||||||
|   [[ $WIDGET == accept-* ]] || |   [[ $WIDGET == zle-line-finish ]] || _zsh_highlight_cursor_moved | ||||||
|     _zsh_highlight_cursor_moved |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Cursor highlighting function. | # Cursor highlighting function. | ||||||
| _zsh_highlight_cursor_highlighter() | _zsh_highlight_cursor_highlighter() | ||||||
| { | { | ||||||
|   [[ $WIDGET == accept-* ]] && return |   [[ $WIDGET == zle-line-finish ]] && return | ||||||
|    |    | ||||||
|   _zsh_highlight_add_highlight $CURSOR $(( $CURSOR + 1 )) cursor |   _zsh_highlight_add_highlight $CURSOR $(( $CURSOR + 1 )) cursor | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -62,9 +62,8 @@ | ||||||
| # Whether the highlighter should be called or not. | # Whether the highlighter should be called or not. | ||||||
| _zsh_highlight_main_highlighter_predicate() | _zsh_highlight_main_highlighter_predicate() | ||||||
| { | { | ||||||
|   # accept-* may trigger removal of path_prefix highlighting |   # may need to remove path_prefix highlighting when the line ends | ||||||
|   [[ $WIDGET == accept-* ]] || |   [[ $WIDGET == zle-line-finish ]] || _zsh_highlight_buffer_modified | ||||||
|     _zsh_highlight_buffer_modified |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Helper to deal with tokens crossing line boundaries. | # Helper to deal with tokens crossing line boundaries. | ||||||
|  | @ -596,7 +595,7 @@ _zsh_highlight_main_highlighter_check_path() | ||||||
| 
 | 
 | ||||||
|   # If this word ends the buffer, check if it's the prefix of a valid path. |   # If this word ends the buffer, check if it's the prefix of a valid path. | ||||||
|   if [[ ${BUFFER[1]} != "-" && ${#BUFFER} == $end_pos ]] && |   if [[ ${BUFFER[1]} != "-" && ${#BUFFER} == $end_pos ]] && | ||||||
|      [[ $WIDGET != accept-* ]]; then |      [[ $WIDGET != zle-line-finish ]]; then | ||||||
|     local -a tmp |     local -a tmp | ||||||
|     tmp=( ${expanded_path}*(N) ) |     tmp=( ${expanded_path}*(N) ) | ||||||
|     (( $#tmp > 0 )) && REPLY=path_prefix && return 0 |     (( $#tmp > 0 )) && REPLY=path_prefix && return 0 | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
| # Related to path_prefix.zsh | # Related to path_prefix.zsh | ||||||
| 
 | 
 | ||||||
| BUFFER='ls /bin/s' | BUFFER='ls /bin/s' | ||||||
| WIDGET=accept-line | WIDGET=zle-line-finish | ||||||
| 
 | 
 | ||||||
| expected_region_highlight=( | expected_region_highlight=( | ||||||
|   "4 9 default"    # /bin/s |   "4 9 default"    # /bin/s | ||||||
|  |  | ||||||
|  | @ -58,6 +58,13 @@ _zsh_highlight() | ||||||
|   # Store the previous command return code to restore it whatever happens. |   # Store the previous command return code to restore it whatever happens. | ||||||
|   local ret=$? |   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 ]]; then | ||||||
|  |     region_highlight=() | ||||||
|  |     return $ret | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|   setopt localoptions warncreateglobal |   setopt localoptions warncreateglobal | ||||||
|   setopt localoptions noksharrays |   setopt localoptions noksharrays | ||||||
|   local REPLY # don't leak $REPLY into global scope |   local REPLY # don't leak $REPLY into global scope | ||||||
|  | @ -250,8 +257,20 @@ _zsh_highlight_bind_widgets() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   # Override ZLE widgets to make them invoke _zsh_highlight. |   # 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 |   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 |     case $widgets[$cur_widget] in | ||||||
| 
 | 
 | ||||||
|       # Already rebound event: do nothing. |       # Already rebound event: do nothing. | ||||||
|  | @ -277,8 +296,15 @@ _zsh_highlight_bind_widgets() | ||||||
|       builtin) eval "_zsh_highlight_widget_${(q)cur_widget}() { _zsh_highlight_call_widget .${(q)cur_widget} -- \"\$@\" }" |       builtin) eval "_zsh_highlight_widget_${(q)cur_widget}() { _zsh_highlight_call_widget .${(q)cur_widget} -- \"\$@\" }" | ||||||
|                zle -N $cur_widget _zsh_highlight_widget_$cur_widget;; |                zle -N $cur_widget _zsh_highlight_widget_$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. |       # Default: unhandled case. | ||||||
|       *) print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" ;; |            print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" | ||||||
|  |          fi | ||||||
|     esac |     esac | ||||||
|   done |   done | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue