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.
This commit is contained in:
Ben Boeckel 2013-07-25 00:05:57 -04:00
parent 1d85c69261
commit d0794a6f76
2 changed files with 34 additions and 2 deletions

View File

@ -29,6 +29,7 @@ This highlighter defines the following styles:
* `hashed-command` - hashed commands * `hashed-command` - hashed commands
* `autodirectory` - a directory name in command position when the `AUTO_CD` option is set * `autodirectory` - a directory name in command position when the `AUTO_CD` option is set
* `path` - existing filenames * `path` - existing filenames
* `partial-path` - partial paths (prefixes of existing files)
* `path_pathseparator` - path separators in filenames (`/`); if unset, `path` is used (default) * `path_pathseparator` - path separators in filenames (`/`); if unset, `path` is used (default)
* `path_prefix` - prefixes of existing filenames * `path_prefix` - prefixes of existing filenames
* `path_prefix_pathseparator` - path separators in prefixes of existing filenames (`/`); if unset, `path_prefix` is used (default) * `path_prefix_pathseparator` - path separators in prefixes of existing filenames (`/`); if unset, `path_prefix` is used (default)

View File

@ -37,7 +37,8 @@
: ${ZSH_HIGHLIGHT_STYLES[precommand]:=fg=green,underline} : ${ZSH_HIGHLIGHT_STYLES[precommand]:=fg=green,underline}
: ${ZSH_HIGHLIGHT_STYLES[commandseparator]:=none} : ${ZSH_HIGHLIGHT_STYLES[commandseparator]:=none}
: ${ZSH_HIGHLIGHT_STYLES[autodirectory]:=fg=green,underline} : ${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_pathseparator]:=}
: ${ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=} : ${ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=}
: ${ZSH_HIGHLIGHT_STYLES[globbing]:=fg=blue} : ${ZSH_HIGHLIGHT_STYLES[globbing]:=fg=blue}
@ -1093,6 +1094,8 @@ _zsh_highlight_main_highlighter_highlight_list()
else else
if _zsh_highlight_main_highlighter_check_path $arg 1; then if _zsh_highlight_main_highlighter_check_path $arg 1; then
style=$REPLY style=$REPLY
elif _zsh_highlight_main_highlighter_check_partial_path $arg 1; then
style=$REPLY
else else
style=unknown-token style=unknown-token
fi fi
@ -1202,9 +1205,33 @@ _zsh_highlight_main_highlighter_highlight_path_separators()
# Check if $1 is a path. # Check if $1 is a path.
# If yes, return 0 and in $REPLY the style to use. # If yes, return 0 and in $REPLY the style to use.
# Else, return non-zero (and the contents of $REPLY is undefined). # 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. # $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" _zsh_highlight_main_highlighter_expand_path "$1"
local expanded_path="$REPLY" tmp_path local expanded_path="$REPLY" tmp_path
@ -1449,6 +1476,10 @@ _zsh_highlight_main_highlighter_highlight_argument()
base_style=$REPLY base_style=$REPLY
_zsh_highlight_main_highlighter_highlight_path_separators $base_style _zsh_highlight_main_highlighter_highlight_path_separators $base_style
highlights+=($reply) 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
fi fi