From d0794a6f76bc6f82b71865092240194e7d9e469b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 25 Jul 2013 00:05:57 -0400 Subject: [PATCH 1/2] 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 From 80d9167c127146c42b1efbbe91fb7d20c6b6db31 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 25 Jul 2013 00:14:46 -0400 Subject: [PATCH 2/2] main: add partial-path test case --- highlighters/main/test-data/partial-path.zsh | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 highlighters/main/test-data/partial-path.zsh diff --git a/highlighters/main/test-data/partial-path.zsh b/highlighters/main/test-data/partial-path.zsh new file mode 100644 index 0000000..7df1d79 --- /dev/null +++ b/highlighters/main/test-data/partial-path.zsh @@ -0,0 +1,36 @@ +#!/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 +# ------------------------------------------------------------------------------------------------- + +BUFFER='ls highlighters/main/test-data/partial-path' + +expected_region_highlight=( + "1 2 $ZSH_HIGHLIGHT_STYLES[command]" # ls + "4 43 $ZSH_HIGHLIGHT_STYLES[partial-path]" # highlighters/main/test-data/path.zsh +)