From 28a5c6e3f0d652cf59df75b90ac1498d495f0904 Mon Sep 17 00:00:00 2001 From: jimmijj Date: Tue, 23 Sep 2014 23:44:45 +0000 Subject: [PATCH] Add highlighting for files based on $LS_COLORS environment variable. --- highlighters/main/main-highlighter.zsh | 93 +++++++++++++++++++++++++- zsh-syntax-highlighting.zsh | 1 + 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index e6d9b88..09cc78b 100755 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -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 diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh index cdbe4c4..bb9facb 100644 --- a/zsh-syntax-highlighting.zsh +++ b/zsh-syntax-highlighting.zsh @@ -35,6 +35,7 @@ # Array declaring active highlighters names. typeset -ga ZSH_HIGHLIGHT_HIGHLIGHTERS +typeset -gA ZSH_HIGHLIGHT_FILES # Update ZLE buffer syntax highlighting. #