Start splitting highlighters to separate files.
The script still works on its own, highlighters in highlighters/ are loaded as addons if present. Signed-off-by: Julien Nicoulaud <julien.nicoulaud@gmail.com>
This commit is contained in:
parent
2f0fb81af4
commit
bc788f3f19
@ -49,7 +49,7 @@ Here is a one-liner to try it without installing or modifying anything:
|
||||
|
||||
## Tweak it
|
||||
|
||||
Optionally, you can override the default styles used for highlighting. The styles are declared in the [`ZSH_HIGHLIGHT_STYLES`](https://github.com/nicoulaj/zsh-syntax-highlighting/blob/master/zsh-syntax-highlighting.zsh#L11) array. You can override styles this way:
|
||||
Optionally, you can override the default styles used for highlighting. The styles are declared in the `ZSH_HIGHLIGHT_STYLES` array. You can override styles this way:
|
||||
|
||||
# To differentiate aliases from other command types
|
||||
ZSH_HIGHLIGHT_STYLES[alias]='fg=magenta,bold'
|
||||
@ -60,7 +60,7 @@ Optionally, you can override the default styles used for highlighting. The style
|
||||
# To disable highlighting of globbing expressions
|
||||
ZSH_HIGHLIGHT_STYLES[globbing]='none'
|
||||
|
||||
You can tweak the styles used to colorize matching brackets by overriding the [`ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES`](https://github.com/nicoulaj/zsh-syntax-highlighting/blob/master/zsh-syntax-highlighting.zsh#L11).
|
||||
You can tweak the styles used to colorize matching brackets by overriding the `ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES`.
|
||||
|
||||
ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES=(
|
||||
'fg=blue,bold' # Style for first level of imbrication
|
||||
|
89
highlighters/brackets.zsh
Normal file
89
highlighters/brackets.zsh
Normal file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env zsh
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2010-2011 zsh-syntax-highlighting contributors
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||
# provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice, this list of conditions
|
||||
# and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice, this list of
|
||||
# conditions and the following disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software without specific prior
|
||||
# written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 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, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, 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.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
|
||||
# vim: ft=zsh sw=2 ts=2 et
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
ZSH_HIGHLIGHT_STYLES+=(
|
||||
bracket-error 'fg=red,bold'
|
||||
)
|
||||
|
||||
# Colors for bracket levels.
|
||||
# Put as many color as you wish.
|
||||
# Leave it as an empty array to disable.
|
||||
ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES=(
|
||||
'fg=blue,bold'
|
||||
'fg=green,bold'
|
||||
'fg=magenta,bold'
|
||||
'fg=yellow,bold'
|
||||
'fg=cyan,bold'
|
||||
)
|
||||
|
||||
# Whether the bracket match highlighting shound be called or not.
|
||||
_zsh_highlight_bracket-match-p() {
|
||||
_zsh_highlight_cursor-moved-p || _zsh_highlight_buffer-modified-p
|
||||
}
|
||||
|
||||
# Bracket match highlighting.
|
||||
_zsh_highlight_bracket-match() {
|
||||
bracket_color_size=${#ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES}
|
||||
if ((bracket_color_size > 0)); then
|
||||
typeset -A levelpos lastoflevel matching revmatching
|
||||
((level = 0))
|
||||
for pos in {1..${#BUFFER}}; do
|
||||
case $BUFFER[pos] in
|
||||
"("|"["|"{")
|
||||
levelpos[$pos]=$((++level))
|
||||
lastoflevel[$level]=$pos
|
||||
;;
|
||||
")"|"]"|"}")
|
||||
matching[$lastoflevel[$level]]=$pos
|
||||
revmatching[$pos]=$lastoflevel[$level]
|
||||
levelpos[$pos]=$((level--))
|
||||
;;
|
||||
esac
|
||||
done
|
||||
for pos in ${(k)levelpos}; do
|
||||
level=$levelpos[$pos]
|
||||
if ((level < 1)); then
|
||||
region_highlight+=("$((pos - 1)) $pos "$ZSH_HIGHLIGHT_STYLES[bracket-error])
|
||||
else
|
||||
region_highlight+=("$((pos - 1)) $pos "$ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES[(( (level - 1) % bracket_color_size + 1 ))])
|
||||
fi
|
||||
done
|
||||
((c = CURSOR + 1))
|
||||
if [[ -n $levelpos[$c] ]]; then
|
||||
((otherpos = -1))
|
||||
[[ -n $matching[$c] ]] && otherpos=$matching[$c]
|
||||
[[ -n $revmatching[$c] ]] && otherpos=$revmatching[$c]
|
||||
region_highlight+=("$((otherpos - 1)) $otherpos standout")
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
_zsh_highlight_add-highlighter _zsh_highlight_bracket-match
|
@ -28,6 +28,7 @@
|
||||
# vim: ft=zsh sw=2 ts=2 et
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# A simple keyword highlighting extension for zsh-syntax-highlighting.
|
||||
|
||||
# To use this, please do the following steps.
|
@ -29,83 +29,12 @@
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# Token types styles.
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Core highligting update system
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
# Array used by highlighters to declare overridable styles.
|
||||
typeset -gA ZSH_HIGHLIGHT_STYLES
|
||||
ZSH_HIGHLIGHT_STYLES=(
|
||||
default 'none'
|
||||
unknown-token 'fg=red,bold'
|
||||
reserved-word 'fg=yellow'
|
||||
alias 'fg=green'
|
||||
builtin 'fg=green'
|
||||
function 'fg=green'
|
||||
command 'fg=green'
|
||||
hashed-command 'fg=green'
|
||||
path 'underline'
|
||||
globbing 'fg=blue'
|
||||
history-expansion 'fg=blue'
|
||||
single-hyphen-option 'none'
|
||||
double-hyphen-option 'none'
|
||||
back-quoted-argument 'none'
|
||||
single-quoted-argument 'fg=yellow'
|
||||
double-quoted-argument 'fg=yellow'
|
||||
dollar-double-quoted-argument 'fg=cyan'
|
||||
back-double-quoted-argument 'fg=cyan'
|
||||
bracket-error 'fg=red,bold'
|
||||
assign 'none'
|
||||
)
|
||||
|
||||
# Colors for bracket levels.
|
||||
# Put as many color as you wish.
|
||||
# Leave it as an empty array to disable.
|
||||
ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES=(
|
||||
'fg=blue,bold'
|
||||
'fg=green,bold'
|
||||
'fg=magenta,bold'
|
||||
'fg=yellow,bold'
|
||||
'fg=cyan,bold'
|
||||
)
|
||||
|
||||
# Tokens that are always immediately followed by a command.
|
||||
ZSH_HIGHLIGHT_TOKENS_FOLLOWED_BY_COMMANDS=(
|
||||
'|' '||' ';' '&' '&&' 'noglob' 'nocorrect' 'builtin'
|
||||
)
|
||||
|
||||
# Check if the argument is variable assignment
|
||||
_zsh_highlight_check-assign() {
|
||||
setopt localoptions extended_glob
|
||||
[[ ${(Q)arg} == [[:alpha:]_]([[:alnum:]_])#=* ]]
|
||||
}
|
||||
|
||||
# Check if the argument is a path.
|
||||
_zsh_highlight_check-path() {
|
||||
[[ -z ${(Q)arg} ]] && return 1
|
||||
[[ -e ${(Q)arg} ]] && return 0
|
||||
[[ ! -e ${(Q)arg:h} ]] && return 1
|
||||
[[ ${#BUFFER} == $end_pos && -n $(print ${(Q)arg}*(N)) ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
# Highlight special chars inside double-quoted strings
|
||||
_zsh_highlight_highlight_string() {
|
||||
setopt localoptions noksharrays
|
||||
local i j k style
|
||||
# Starting quote is at 1, so start parsing at offset 2 in the string.
|
||||
for (( i = 2 ; i < end_pos - start_pos ; i += 1 )) ; do
|
||||
(( j = i + start_pos - 1 ))
|
||||
(( k = j + 1 ))
|
||||
case "$arg[$i]" in
|
||||
'$') style=$ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument];;
|
||||
"\\") style=$ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]
|
||||
(( k += 1 )) # Color following char too.
|
||||
(( i += 1 )) # Skip parsing the escaped char.
|
||||
;;
|
||||
*) continue;;
|
||||
esac
|
||||
region_highlight+=("$j $k $style")
|
||||
done
|
||||
}
|
||||
|
||||
# Recolorize the current ZLE buffer.
|
||||
|
||||
# An `object' implemented by below 3 arrays' elements could be called a
|
||||
# `highlighter', registered by `_zsh_highlight_add-highlighter`. In other words, these
|
||||
@ -171,17 +100,79 @@ _zsh_highlight_cursor-moved-p() {
|
||||
((ZSH_PRIOR_CURSOR != $CURSOR))
|
||||
}
|
||||
|
||||
# Register a highlighting function.
|
||||
# Register an highlighter.
|
||||
_zsh_highlight_add-highlighter() {
|
||||
local func="$1" pred="${2-${1}-p}" cache_place="${3-${1//-/_}}"
|
||||
zsh_highlight_functions+=$func
|
||||
zsh_highlight_predicates+=$pred
|
||||
zsh_highlight_caches+=$cache_place
|
||||
zsh_highlight_functions+="$1"
|
||||
zsh_highlight_predicates+="${2-${1}-p}"
|
||||
zsh_highlight_caches+="${3-${1//-/_}}"
|
||||
}
|
||||
|
||||
# Register the builtin highlighters.
|
||||
_zsh_highlight_add-highlighter _zsh_main-highlight _zsh_highlight_buffer-modified-p
|
||||
_zsh_highlight_add-highlighter _zsh_highlight_bracket-match
|
||||
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Main highlighter
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
ZSH_HIGHLIGHT_STYLES+=(
|
||||
default 'none'
|
||||
unknown-token 'fg=red,bold'
|
||||
reserved-word 'fg=yellow'
|
||||
alias 'fg=green'
|
||||
builtin 'fg=green'
|
||||
function 'fg=green'
|
||||
command 'fg=green'
|
||||
hashed-command 'fg=green'
|
||||
path 'underline'
|
||||
globbing 'fg=blue'
|
||||
history-expansion 'fg=blue'
|
||||
single-hyphen-option 'none'
|
||||
double-hyphen-option 'none'
|
||||
back-quoted-argument 'none'
|
||||
single-quoted-argument 'fg=yellow'
|
||||
double-quoted-argument 'fg=yellow'
|
||||
dollar-double-quoted-argument 'fg=cyan'
|
||||
back-double-quoted-argument 'fg=cyan'
|
||||
assign 'none'
|
||||
)
|
||||
|
||||
# Tokens that are always immediately followed by a command.
|
||||
ZSH_HIGHLIGHT_TOKENS_FOLLOWED_BY_COMMANDS=(
|
||||
'|' '||' ';' '&' '&&' 'noglob' 'nocorrect' 'builtin'
|
||||
)
|
||||
|
||||
# Check if the argument is variable assignment
|
||||
_zsh_highlight_check-assign() {
|
||||
setopt localoptions extended_glob
|
||||
[[ ${(Q)arg} == [[:alpha:]_]([[:alnum:]_])#=* ]]
|
||||
}
|
||||
|
||||
# Check if the argument is a path.
|
||||
_zsh_highlight_check-path() {
|
||||
[[ -z ${(Q)arg} ]] && return 1
|
||||
[[ -e ${(Q)arg} ]] && return 0
|
||||
[[ ! -e ${(Q)arg:h} ]] && return 1
|
||||
[[ ${#BUFFER} == $end_pos && -n $(print ${(Q)arg}*(N)) ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
# Highlight special chars inside double-quoted strings
|
||||
_zsh_highlight_highlight_string() {
|
||||
setopt localoptions noksharrays
|
||||
local i j k style
|
||||
# Starting quote is at 1, so start parsing at offset 2 in the string.
|
||||
for (( i = 2 ; i < end_pos - start_pos ; i += 1 )) ; do
|
||||
(( j = i + start_pos - 1 ))
|
||||
(( k = j + 1 ))
|
||||
case "$arg[$i]" in
|
||||
'$') style=$ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument];;
|
||||
"\\") style=$ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]
|
||||
(( k += 1 )) # Color following char too.
|
||||
(( i += 1 )) # Skip parsing the escaped char.
|
||||
;;
|
||||
*) continue;;
|
||||
esac
|
||||
region_highlight+=("$j $k $style")
|
||||
done
|
||||
}
|
||||
|
||||
# Core syntax highlighting.
|
||||
_zsh_main-highlight() {
|
||||
@ -246,63 +237,22 @@ _zsh_main-highlight() {
|
||||
done
|
||||
}
|
||||
|
||||
# Whether the bracket match highlighting shound be called or not.
|
||||
_zsh_highlight_bracket-match-p() {
|
||||
_zsh_highlight_cursor-moved-p || _zsh_highlight_buffer-modified-p
|
||||
}
|
||||
|
||||
# Bracket match highlighting.
|
||||
_zsh_highlight_bracket-match() {
|
||||
# Bracket matching
|
||||
bracket_color_size=${#ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES}
|
||||
if ((bracket_color_size > 0)); then
|
||||
typeset -A levelpos lastoflevel matching revmatching
|
||||
((level = 0))
|
||||
for pos in {1..${#BUFFER}}; do
|
||||
case $BUFFER[pos] in
|
||||
"("|"["|"{")
|
||||
levelpos[$pos]=$((++level))
|
||||
lastoflevel[$level]=$pos
|
||||
;;
|
||||
")"|"]"|"}")
|
||||
matching[$lastoflevel[$level]]=$pos
|
||||
revmatching[$pos]=$lastoflevel[$level]
|
||||
levelpos[$pos]=$((level--))
|
||||
;;
|
||||
esac
|
||||
done
|
||||
for pos in ${(k)levelpos}; do
|
||||
level=$levelpos[$pos]
|
||||
if ((level < 1)); then
|
||||
region_highlight+=("$((pos - 1)) $pos "$ZSH_HIGHLIGHT_STYLES[bracket-error])
|
||||
else
|
||||
region_highlight+=("$((pos - 1)) $pos "$ZSH_HIGHLIGHT_MATCHING_BRACKETS_STYLES[(( (level - 1) % bracket_color_size + 1 ))])
|
||||
fi
|
||||
done
|
||||
((c = CURSOR + 1))
|
||||
if [[ -n $levelpos[$c] ]]; then
|
||||
((otherpos = -1))
|
||||
[[ -n $matching[$c] ]] && otherpos=$matching[$c]
|
||||
[[ -n $revmatching[$c] ]] && otherpos=$revmatching[$c]
|
||||
region_highlight+=("$((otherpos - 1)) $otherpos standout")
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# Setup
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
|
||||
# Special treatment for completion/expansion events:
|
||||
# For each *complete* function (except 'accept-and-menu-complete'),
|
||||
# we create a widget which mimics the original
|
||||
# and use this orig-* version inside the new colorized zle function (the dot
|
||||
# idiom used for all others doesn't work right for these functions for some
|
||||
# reason). You can see the default setup using "zle -l -L".
|
||||
|
||||
# Bind all ZLE events from zle -la to highlighting function.
|
||||
# Setup highlighting.
|
||||
_zsh_highlight_install() {
|
||||
|
||||
# Resolve event names what have to be bound to.
|
||||
zmodload zsh/zleparameter 2>/dev/null || {
|
||||
echo 'zsh-syntax-highlighting:zmodload error. exiting.' >&2
|
||||
return -1
|
||||
}
|
||||
local -a events; : ${(A)events::=${@:#(_*|orig-*|.run-help|.which-command)}}
|
||||
|
||||
# Bind the events to _zsh_highlight-zle-buffer.
|
||||
local clean_event
|
||||
for event in $events; do
|
||||
if [[ "$widgets[$event]" == completion:* ]]; then
|
||||
@ -327,5 +277,15 @@ _zsh_highlight_install() {
|
||||
esac
|
||||
fi
|
||||
done
|
||||
|
||||
# Register the main highlighter.
|
||||
_zsh_highlight_add-highlighter _zsh_main-highlight _zsh_highlight_buffer-modified-p
|
||||
|
||||
# Load additional highlighters if available.
|
||||
local highlighters_dir=${$(command readlink -f ${(%):-%N}):h}/highlighters
|
||||
if [[ -d $highlighters_dir ]]; then
|
||||
for highlighter_def ($highlighters_dir/*.zsh) . $highlighter_def
|
||||
fi
|
||||
}
|
||||
|
||||
_zsh_highlight_install "${(@f)"$(zle -la)"}"
|
||||
|
Loading…
Reference in New Issue
Block a user