From d0794a6f76bc6f82b71865092240194e7d9e469b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 25 Jul 2013 00:05:57 -0400 Subject: [PATCH] main: check for partial paths separately It's really annoying to have partial paths appear the same as paths to complete files. However, it is still nice to be able to highlight them. Full paths are now bold while partial paths use plain underline. --- docs/highlighters/main.md | 1 + highlighters/main/main-highlighter.zsh | 35 ++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/highlighters/main.md b/docs/highlighters/main.md index 4a27653..83cd330 100644 --- a/docs/highlighters/main.md +++ b/docs/highlighters/main.md @@ -29,6 +29,7 @@ This highlighter defines the following styles: * `hashed-command` - hashed commands * `autodirectory` - a directory name in command position when the `AUTO_CD` option is set * `path` - existing filenames +* `partial-path` - partial paths (prefixes of existing files) * `path_pathseparator` - path separators in filenames (`/`); if unset, `path` is used (default) * `path_prefix` - prefixes of existing filenames * `path_prefix_pathseparator` - path separators in prefixes of existing filenames (`/`); if unset, `path_prefix` is used (default) diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index e6f5e35..afb066e 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -37,7 +37,8 @@ : ${ZSH_HIGHLIGHT_STYLES[precommand]:=fg=green,underline} : ${ZSH_HIGHLIGHT_STYLES[commandseparator]:=none} : ${ZSH_HIGHLIGHT_STYLES[autodirectory]:=fg=green,underline} -: ${ZSH_HIGHLIGHT_STYLES[path]:=underline} +: ${ZSH_HIGHLIGHT_STYLES[path]:=underline,bold} +: ${ZSH_HIGHLIGHT_STYLES[partial-path]:=underline} : ${ZSH_HIGHLIGHT_STYLES[path_pathseparator]:=} : ${ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=} : ${ZSH_HIGHLIGHT_STYLES[globbing]:=fg=blue} @@ -1093,6 +1094,8 @@ _zsh_highlight_main_highlighter_highlight_list() else if _zsh_highlight_main_highlighter_check_path $arg 1; then style=$REPLY + elif _zsh_highlight_main_highlighter_check_partial_path $arg 1; then + style=$REPLY else style=unknown-token fi @@ -1202,9 +1205,33 @@ _zsh_highlight_main_highlighter_highlight_path_separators() # Check if $1 is a path. # If yes, return 0 and in $REPLY the style to use. # Else, return non-zero (and the contents of $REPLY is undefined). +_zsh_highlight_main_highlighter_check_path() +{ + setopt localoptions nonomatch + _zsh_highlight_main_highlighter_expand_path "$1" + local expanded_path="$REPLY" tmp_path + integer in_command_position=$2 + + if (( in_command_position )); then + # ### Currently, this value is never returned: either it's overwritten + # ### below, or the return code is non-zero + REPLY=arg0 + else + REPLY=path + fi + + [[ -z $expanded_path ]] && return 1 + [[ -e $expanded_path ]] && return 0 + + return 1 +} + +# Check if $1 is a partial path. +# If yes, return 0 and in $REPLY the style to use. +# Else, return non-zero (and the contents of $REPLY is undefined). # # $2 should be non-zero iff we're in command position. -_zsh_highlight_main_highlighter_check_path() +_zsh_highlight_main_highlighter_check_partial_path() { _zsh_highlight_main_highlighter_expand_path "$1" local expanded_path="$REPLY" tmp_path @@ -1449,6 +1476,10 @@ _zsh_highlight_main_highlighter_highlight_argument() base_style=$REPLY _zsh_highlight_main_highlighter_highlight_path_separators $base_style highlights+=($reply) + elif _zsh_highlight_main_highlighter_check_partial_path $arg[$1,-1] 0; then + base_style=$REPLY + _zsh_highlight_main_highlighter_highlight_path_separators $base_style + highlights+=($reply) fi fi