Add highlighting for files based on $LS_COLORS environment variable.

This commit is contained in:
jimmijj 2014-09-23 23:44:45 +00:00
parent 85d1268b5a
commit 28a5c6e3f0
2 changed files with 91 additions and 3 deletions

View File

@ -66,7 +66,7 @@ _zsh_highlight_main_highlighter()
{
emulate -L zsh
setopt localoptions extendedglob bareglobqual
local start_pos=0 end_pos highlight_glob=true new_expression=true arg style sudo=false sudo_arg=false
local start_pos=0 end_pos highlight_glob=true new_expression=true arg style lsstyle sudo=false sudo_arg=false
typeset -a ZSH_HIGHLIGHT_TOKENS_COMMANDSEPARATOR
typeset -a ZSH_HIGHLIGHT_TOKENS_PRECOMMANDS
typeset -a ZSH_HIGHLIGHT_TOKENS_FOLLOWED_BY_COMMANDS
@ -84,7 +84,7 @@ _zsh_highlight_main_highlighter()
)
for arg in ${(z)BUFFER}; do
local substr_color=0
local substr_color=0 isfile=false
local style_override=""
[[ $start_pos -eq 0 && $arg = 'noglob' ]] && highlight_glob=false
((start_pos+=${#BUFFER[$start_pos+1,-1]}-${#${BUFFER[$start_pos+1,-1]##[[:space:]]#}}))
@ -136,6 +136,7 @@ _zsh_highlight_main_highlighter()
else
style=$ZSH_HIGHLIGHT_STYLES[unknown-token]
fi
_zsh_highlight_main_highlighter_check_file && isfile=true
;;
esac
fi
@ -160,14 +161,21 @@ _zsh_highlight_main_highlighter()
else
style=$ZSH_HIGHLIGHT_STYLES[default]
fi
_zsh_highlight_main_highlighter_check_file && isfile=true
;;
esac
fi
# if a style_override was set (eg in _zsh_highlight_main_highlighter_check_path), use it
[[ -n $style_override ]] && style=$ZSH_HIGHLIGHT_STYLES[$style_override]
if [[ $isfile == true ]]; then
start_file_pos=$((start_pos+${#arg}-${#arg:t}))
end_file_pos=$end_pos
end_pos=$((end_pos-${#arg:t}))
region_highlight+=("$start_file_pos $end_file_pos $lsstyle")
fi
[[ $substr_color = 0 ]] && region_highlight+=("$start_pos $end_pos $style")
[[ -n ${(M)ZSH_HIGHLIGHT_TOKENS_FOLLOWED_BY_COMMANDS:#"$arg"} ]] && new_expression=true
start_pos=$end_pos
[[ $isfile == true ]] && start_pos=$end_file_pos || start_pos=$end_pos
done
}
@ -250,3 +258,82 @@ _zsh_highlight_main_highlighter_check_command()
for p in $path; do prefixed_command+=( $p/${arg}*(N) ); done
[[ ${BUFFER[1]} != "-" && ${#LBUFFER} == $end_pos && $#prefixed_command > 0 ]] && return 0 || return 1
}
## Fill table with colors and file types from $LS_COLORS
_zsh_highlight_files_highlighter_fill_table_of_types()
{
local group type code ncolors=$(echotc Co)
local -a attrib
for group in ${(s.:.)LS_COLORS}; do
type=${group%=*}
code=${group#*=}
attrib=()
takeattrib ${(s.;.)code}
ZSH_HIGHLIGHT_FILES+=($type ${(j.,.)attrib})
done
}
## Take attributes from unfolded $LS_COLORS code
takeattrib()
{
while [ "$#" -gt 0 ]; do
[[ $1 == 38 && $2 == 5 ]] && {attrib+=("fg=$3"); shift 3; continue}
[[ $1 == 48 && $2 == 5 ]] && {attrib+=("bg=$3"); shift 3; continue}
case $1 in
00|0) attrib+=("none"); shift;;
01|1) attrib+=("bold" ); shift;;
02|2) attrib+=("faint"); shift;;
03|3) attrib+=("italic"); shift;;
04|4) attrib+=("underscore"); shift;;
05|5) attrib+=("blink"); shift;;
07|7) attrib+=("standout"); shift;;
08|8) attrib+=("concealed"); shift;;
3[0-7]) attrib+=("fg=$(($1-30))"); shift;;
4[0-7]) attrib+=("bg=$(($1-40))"); shift;;
9[0-7]) [[ $ncolors == 256 ]] && attrib+=("fg=$(($1-82))") || attrib+=("fg=$(($1-90))" "bold"); shift;;
10[0-7]) [[ $ncolors == 256 ]] && attrib+=("bg=$(($1-92))") || attrib+=("bg=$(($1-100))" "bold"); shift;;
*) shift;;
esac
done
}
## Check if the argument is a file, if yes change the style accordingly
_zsh_highlight_main_highlighter_check_file()
{
setopt localoptions nonomatch
local expanded_arg matched_file
expanded_arg=${(Q)~arg}
[[ -z $expanded_arg ]] && return 1
[[ -d $expanded_arg ]] && return 1
[[ ${BUFFER[1]} != "-" && ${#LBUFFER} == $end_pos ]] && matched_file=(${expanded_arg}*(Noa^/[1]))
[[ -e $expanded_arg || -e $matched_file ]] && lsstyle=none || return 1
# [[ rs ]]
# [[ -d $expanded_arg || -d $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[di] && return 0
[[ -h $expanded_arg || -h $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[ln] && return 0
# [[ mh ]]
[[ -p $expanded_arg || -p $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[pi] && return 0
[[ -S $expanded_arg || -S $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[so] && return 0
# [[ do ]]
[[ -b $expanded_arg || -b $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[bd] && return 0
[[ -c $expanded_arg || -c $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[cd] && return 0
# [[ or ]]
# [[ mi ]]
[[ -u $expanded_arg || -u $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[su] && return 0
[[ -g $expanded_arg || -g $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[sg] && return 0
# [[ ca ]]
# [[ tw ]]
# [[ ow ]]
[[ -k $expanded_arg || -k $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[st] && return 0
[[ -x $expanded_arg || -x $matched_file ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[ex] && return 0
[[ -e $expanded_arg ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[*.$expanded_arg:e] && return 0
[[ -n $matched_file:e ]] && lsstyle=$ZSH_HIGHLIGHT_FILES[*.$matched_file:e] && return 0
return 0
}
## Fill table only once, at the initialization process
_zsh_highlight_files_highlighter_fill_table_of_types

View File

@ -35,6 +35,7 @@
# Array declaring active highlighters names.
typeset -ga ZSH_HIGHLIGHT_HIGHLIGHTERS
typeset -gA ZSH_HIGHLIGHT_FILES
# Update ZLE buffer syntax highlighting.
#