@@ -173,26 +173,48 @@ _zsh_highlight()
173
173
region_highlight[-1]=()
174
174
}
175
175
176
- # Reset region_highlight to build it from scratch
177
- if (( zsh_highlight__memo_feature )) ; then
178
- region_highlight=( " ${(@ )region_highlight:#* memo=zsh-syntax-highlighting* } " )
179
- else
180
- # Legacy codepath. Not very interoperable with other plugins (issue #418).
181
- region_highlight=()
182
- fi
183
-
184
176
# Remove all highlighting in isearch, so that only the underlining done by zsh itself remains.
185
177
# For details see FAQ entry 'Why does syntax highlighting not work while searching history?'.
186
178
# This disables highlighting during isearch (for reasons explained in README.md) unless zsh is new enough
187
179
# and doesn't have the pattern matching bug
188
- if [[ $WIDGET == zle-isearch-update ]] && { $zsh_highlight__pat_static_bug || ! (( $+ ISEARCHMATCH_ACTIVE )) }; then
180
+ if [[ $WIDGET == zle-isearch-update ]] && { $zsh_highlight__pat_static_bug || ! (( $+ ISEARCHMATCH_ACTIVE )) } ||
181
+ # Do not highlight if there are more than 300 chars in the buffer. It's most
182
+ # likely a pasted command or a huge list of files in that case..
183
+ [[ -n ${ZSH_HIGHLIGHT_MAXLENGTH:- } ]] && (( ${# BUFFER} > ZSH_HIGHLIGHT_MAXLENGTH )) ||
184
+ # Do not highlight if there are pending inputs (copy/paste).
185
+ (( PENDING )) ; then
186
+ # Reset region_highlight to build it from scratch
187
+ if (( zsh_highlight__memo_feature )) ; then
188
+ region_highlight=( " ${(@ )region_highlight:#* memo=zsh-syntax-highlighting* } " )
189
+ else
190
+ # Legacy codepath. Not very interoperable with other plugins (issue #418).
191
+ region_highlight=()
192
+ fi
189
193
return $ret
190
194
fi
191
195
192
196
# Before we 'emulate -L', save the user's options
193
197
local -A zsyh_user_options
194
198
if zmodload -e zsh/parameter; then
195
- zsyh_user_options=(" ${(kv)options[@]} " )
199
+ if [[ -n ${ZSH_HIGHLIGHT_HIGHLIGHTERS:# (brackets|cursor|line|main|pattern|regexp|root)} ]]; then
200
+ # Copy all options if there are user-defined highlighters
201
+ zsyh_user_options=(" ${(kv)options[@]} " )
202
+ else
203
+ # Copy a subset of options used by the bundled highlighters. This is faster than
204
+ # copying all options.
205
+ zsyh_user_options=(
206
+ ignorebraces " ${options[ignorebraces]} "
207
+ ignoreclosebraces " ${options[ignoreclosebraces]} "
208
+ pathdirs " ${options[pathdirs]} "
209
+ interactivecomments " ${options[interactivecomments]} "
210
+ globassign " ${options[globassign]} "
211
+ multifuncdef " ${options[multifuncdef]} "
212
+ autocd " ${options[autocd]} "
213
+ equals " ${options[equals]} "
214
+ multios " ${options[multios]} "
215
+ rcquotes " ${options[rcquotes]} "
216
+ )
217
+ fi
196
218
else
197
219
local canonical_options onoff option raw_options
198
220
raw_options=(${(f)" $( emulate -R zsh; set -o) " } )
@@ -210,20 +232,16 @@ _zsh_highlight()
210
232
fi
211
233
typeset -r zsyh_user_options
212
234
213
- emulate -L zsh
214
- setopt localoptions warncreateglobal nobashrematch
215
- local REPLY # don't leak $REPLY into global scope
216
-
217
- # Do not highlight if there are more than 300 chars in the buffer. It's most
218
- # likely a pasted command or a huge list of files in that case..
219
- [[ -n ${ZSH_HIGHLIGHT_MAXLENGTH:- } ]] && [[ $# BUFFER -gt $ZSH_HIGHLIGHT_MAXLENGTH ]] && return $ret
235
+ local -a new_highlight
236
+ if (( zsh_highlight__memo_feature )) ; then
237
+ new_highlight=( " ${(@ )region_highlight:#* memo=zsh-syntax-highlighting* } " )
238
+ fi
220
239
221
- # Do not highlight if there are pending inputs (copy/paste).
222
- [[ $PENDING -gt 0 ]] && return $ret
240
+ emulate -L zsh -o warncreateglobal -o nobashrematch
241
+ local REPLY # don't leak $REPLY into global scope
223
242
224
243
{
225
- local cache_place
226
- local -a region_highlight_copy
244
+ local cache_place pred
227
245
228
246
# Select which highlighters in ZSH_HIGHLIGHT_HIGHLIGHTERS need to be invoked.
229
247
local highlighter; for highlighter in $ZSH_HIGHLIGHT_HIGHLIGHTERS ; do
@@ -233,38 +251,37 @@ _zsh_highlight()
233
251
typeset -ga ${cache_place}
234
252
235
253
# If highlighter needs to be invoked
236
- if ! type " _zsh_highlight_highlighter_${highlighter} _predicate" >& /dev/null; then
237
- echo " zsh-syntax-highlighting: warning: disabling the ${(qq)highlighter} highlighter as it has not been loaded" >&2
238
- # TODO: use ${(b)} rather than ${(q)} if supported
239
- ZSH_HIGHLIGHT_HIGHLIGHTERS=( ${ZSH_HIGHLIGHT_HIGHLIGHTERS:# ${highlighter} } )
240
- elif " _zsh_highlight_highlighter_${highlighter} _predicate" ; then
241
-
242
- # save a copy, and cleanup region_highlight
243
- region_highlight_copy=(" ${region_highlight[@]} " )
244
- region_highlight=()
254
+ pred=" _zsh_highlight_highlighter_${highlighter} _predicate"
255
+ if (( ! $pred )) ; then
256
+ if type $pred >& /dev/null; then
257
+ typeset -gri $pred =1
258
+ else
259
+ echo " zsh-syntax-highlighting: warning: disabling the ${(qq)highlighter} highlighter as it has not been loaded" >&2
260
+ # TODO: use ${(b)} rather than ${(q)} if supported
261
+ ZSH_HIGHLIGHT_HIGHLIGHTERS=( ${ZSH_HIGHLIGHT_HIGHLIGHTERS:# ${highlighter} } )
262
+ continue
263
+ fi
264
+ fi
245
265
266
+ if $pred ; then
246
267
# Execute highlighter and save result
247
- {
248
- " _zsh_highlight_highlighter_${highlighter} _paint"
249
- } always {
250
- : ${(AP)cache_place::= " ${region_highlight[@]} " }
251
- }
252
-
253
- # Restore saved region_highlight
254
- region_highlight=(" ${region_highlight_copy[@]} " )
255
-
268
+ region_highlight=()
269
+ " _zsh_highlight_highlighter_${highlighter} _paint"
270
+ : ${(AP)cache_place::= " ${region_highlight[@]} " }
271
+ new_highlight+=($region_highlight )
272
+ else
273
+ # Use value form cache if any cached
274
+ new_highlight+=(" ${(@ P)cache_place} " )
256
275
fi
257
276
258
- # Use value form cache if any cached
259
- region_highlight+=(" ${(@ P)cache_place} " )
260
-
261
277
done
262
278
279
+ region_highlight=($new_highlight )
280
+
263
281
# Re-apply zle_highlight settings
264
282
265
283
# region
266
- () {
267
- (( REGION_ACTIVE )) || return
284
+ (( REGION_ACTIVE )) && () {
268
285
integer min max
269
286
if (( MARK > CURSOR )) ; then
270
287
min=$CURSOR max=$MARK
@@ -284,13 +301,13 @@ _zsh_highlight()
284
301
}
285
302
286
303
# yank / paste (zsh-5.1.1 and newer)
287
- (( $ + YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout " $YANK_START " " $YANK_END "
304
+ (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout " $YANK_START " " $YANK_END "
288
305
289
306
# isearch
290
- (( $ + ISEARCHMATCH_ACTIVE )) && (( ISEARCHMATCH_ACTIVE )) && _zsh_highlight_apply_zle_highlight isearch underline " $ISEARCHMATCH_START " " $ISEARCHMATCH_END "
307
+ (( ISEARCHMATCH_ACTIVE )) && _zsh_highlight_apply_zle_highlight isearch underline " $ISEARCHMATCH_START " " $ISEARCHMATCH_END "
291
308
292
309
# suffix
293
- (( $ + SUFFIX_ACTIVE )) && (( SUFFIX_ACTIVE )) && _zsh_highlight_apply_zle_highlight suffix bold " $SUFFIX_START " " $SUFFIX_END "
310
+ (( SUFFIX_ACTIVE )) && _zsh_highlight_apply_zle_highlight suffix bold " $SUFFIX_START " " $SUFFIX_END "
294
311
295
312
296
313
return $ret
0 commit comments