From c67372e96ca477bf87f36cdb501ffd4ca0897971 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 12 Jan 2020 20:04:02 +0000 Subject: [PATCH 1/7] 'main': Add an XFail test for issue #202. --- .../plain-file-in-command-position.zsh | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 highlighters/main/test-data/plain-file-in-command-position.zsh diff --git a/highlighters/main/test-data/plain-file-in-command-position.zsh b/highlighters/main/test-data/plain-file-in-command-position.zsh new file mode 100644 index 0000000..b16e43c --- /dev/null +++ b/highlighters/main/test-data/plain-file-in-command-position.zsh @@ -0,0 +1,39 @@ +#!/usr/bin/env zsh +# ------------------------------------------------------------------------------------------------- +# Copyright (c) 2020 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 +# ------------------------------------------------------------------------------------------------- + +touch foo +chmod -x foo +BUFFER=$'./foo; ./foo' + +expected_region_highlight=( + '1 5 unknown-token "issue #202"' # ./foo (in middle) + '6 6 commandseparator' # ; + '8 12 unknown-token "issue #202"' # ./foo (at end) +) From a6eb966d96f51fc611c2a5a04b4253033da492e0 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 12 Jan 2020 20:17:31 +0000 Subject: [PATCH 2/7] 'main': Extend tests to capture the current behaviour. The next commits will change this behaviour. --- .../abspath-in-command-position3.zsh | 6 ++- .../abspath-in-command-position3b.zsh | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 highlighters/main/test-data/abspath-in-command-position3b.zsh diff --git a/highlighters/main/test-data/abspath-in-command-position3.zsh b/highlighters/main/test-data/abspath-in-command-position3.zsh index 9323ed7..6c89ddc 100644 --- a/highlighters/main/test-data/abspath-in-command-position3.zsh +++ b/highlighters/main/test-data/abspath-in-command-position3.zsh @@ -28,8 +28,10 @@ # vim: ft=zsh sw=2 ts=2 et # ------------------------------------------------------------------------------------------------- -BUFFER=$'/bin' +BUFFER=$'/bin; /bin' expected_region_highlight=( - '1 4 path' # /bin + '1 4 path' # /bin (in middle) + '5 5 commandseparator' # ; + '7 10 path' # /bin (at end) ) diff --git a/highlighters/main/test-data/abspath-in-command-position3b.zsh b/highlighters/main/test-data/abspath-in-command-position3b.zsh new file mode 100644 index 0000000..f75ad9e --- /dev/null +++ b/highlighters/main/test-data/abspath-in-command-position3b.zsh @@ -0,0 +1,38 @@ +#!/usr/bin/env zsh +# ------------------------------------------------------------------------------------------------- +# Copyright (c) 2020 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 +# ------------------------------------------------------------------------------------------------- + +setopt autocd +BUFFER=$'/bin; /bin' + +expected_region_highlight=( + '1 4 path' # /bin (in middle) + '5 5 commandseparator' # ; + '7 10 path' # /bin (at end) +) From 5545fb9ab26bec2bfd861912c6abccf90e68fa07 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 12 Jan 2020 20:06:13 +0000 Subject: [PATCH 3/7] 'main': In command position, do not highlight directories (unless AUTO_CD is set) and non-executable files. Fixes #202. Test expectations are updated. For example, BUFFER='/bin' is now highlighted as path_prefix because it's a prefix of '/bin/sh' which would be valid. However, BUFFER='/bin;' is now properly highlighted as an error (unless AUTO_CD is set). --- highlighters/main/main-highlighter.zsh | 43 +++++++++++++++---- .../abspath-in-command-position1.zsh | 2 +- .../abspath-in-command-position1b.zsh | 36 ++++++++++++++++ .../abspath-in-command-position3.zsh | 4 +- .../abspath-in-command-position3b.zsh | 4 +- .../main/test-data/path-dollared-word3.zsh | 4 +- .../main/test-data/path-dollared-word3b.zsh | 39 +++++++++++++++++ .../plain-file-in-command-position.zsh | 4 +- 8 files changed, 118 insertions(+), 18 deletions(-) create mode 100644 highlighters/main/test-data/abspath-in-command-position1b.zsh create mode 100644 highlighters/main/test-data/path-dollared-word3b.zsh diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index c44b1c3..b7c1bf0 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -1006,7 +1006,7 @@ _zsh_highlight_main_highlighter_highlight_list() fi _zsh_highlight_main__stack_pop 'R' reserved-word else - if _zsh_highlight_main_highlighter_check_path $arg; then + if _zsh_highlight_main_highlighter_check_path $arg 1; then style=$REPLY else style=unknown-token @@ -1115,12 +1115,19 @@ _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). +# +# $2 should be non-zero iff we're in command position. _zsh_highlight_main_highlighter_check_path() { _zsh_highlight_main_highlighter_expand_path "$1" local expanded_path="$REPLY" tmp_path + integer in_command_position=$2 - REPLY=path + if (( in_command_position )); then + REPLY=arg0 + else + REPLY=path + fi if [[ ${1[1]} == '=' && $1 == ??* && ${1[2]} != $'\x28' && $zsyh_user_options[equals] == 'on' && $expanded_path[1] != '/' ]]; then REPLY=unknown-token # will error out if executed @@ -1142,15 +1149,23 @@ _zsh_highlight_main_highlighter_check_path() tmp_path=$tmp_path:h done - [[ -L $expanded_path ]] && return 0 - [[ -e $expanded_path ]] && return 0 + if (( in_command_position )); then + if [[ -x $expanded_path ]] && [[ $zsyh_user_options[autocd] == on || ! -d $expanded_path ]]; then + return 0 + fi + else + if [[ -L $expanded_path || -e $expanded_path ]]; then + return 0 + fi + fi # Search the path in CDPATH - if [[ $expanded_path != /* ]]; then - local cdpath_dir + if [[ $expanded_path != /* ]] && + { (( ! in_command_position )) || [[ $zsyh_user_options[autocd] == on ]] }; then # TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here. + local cdpath_dir for cdpath_dir in $cdpath ; do - [[ -e "$cdpath_dir/$expanded_path" ]] && return 0 + [[ -d "$cdpath_dir/$expanded_path" && -x "$cdpath_dir/$expanded_path" ]] && return 0 done fi @@ -1162,7 +1177,14 @@ _zsh_highlight_main_highlighter_check_path() [[ $WIDGET != zle-line-finish ]]; then # TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here. local -a tmp - tmp=( ${expanded_path}*(N) ) + if (( in_command_position )); then + # We include directories even when autocd is enabled, because those + # directories might contain executable files: e.g., BUFFER="/bi" en route + # to typing "/bin/sh". + tmp=( ${expanded_path}*(N-*,N-/) ) + else + tmp=( ${expanded_path}*(N) ) + fi (( ${+tmp[1]} )) && REPLY=path_prefix && return 0 fi @@ -1173,6 +1195,8 @@ _zsh_highlight_main_highlighter_check_path() # Highlight an argument and possibly special chars in quotes starting at $1 in $arg # This command will at least highlight $1 to end_pos with the default style # If $2 is set to 0, the argument cannot be highlighted as an option. +# +# This function currently assumes it's never called for the command word. _zsh_highlight_main_highlighter_highlight_argument() { local base_style=default i=$1 option_eligible=${2:-1} path_eligible=1 ret start style @@ -1307,7 +1331,8 @@ _zsh_highlight_main_highlighter_highlight_argument() else base_style=numeric-fd fi - elif _zsh_highlight_main_highlighter_check_path $arg[$1,-1]; then + # This function is currently never called for the command word, so $2 is hard-coded as 0. + elif _zsh_highlight_main_highlighter_check_path $arg[$1,-1] 0; then base_style=$REPLY _zsh_highlight_main_highlighter_highlight_path_separators $base_style highlights+=($reply) diff --git a/highlighters/main/test-data/abspath-in-command-position1.zsh b/highlighters/main/test-data/abspath-in-command-position1.zsh index 75140d2..cfc12a5 100644 --- a/highlighters/main/test-data/abspath-in-command-position1.zsh +++ b/highlighters/main/test-data/abspath-in-command-position1.zsh @@ -31,5 +31,5 @@ BUFFER=$'/' expected_region_highlight=( - '1 1 path' # / + '1 1 path_prefix' # / ) diff --git a/highlighters/main/test-data/abspath-in-command-position1b.zsh b/highlighters/main/test-data/abspath-in-command-position1b.zsh new file mode 100644 index 0000000..82292ed --- /dev/null +++ b/highlighters/main/test-data/abspath-in-command-position1b.zsh @@ -0,0 +1,36 @@ +#!/usr/bin/env zsh +# ------------------------------------------------------------------------------------------------- +# Copyright (c) 2020 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 +# ------------------------------------------------------------------------------------------------- + +setopt autocd +BUFFER=$'/' + +expected_region_highlight=( + '1 1 arg0' # / +) diff --git a/highlighters/main/test-data/abspath-in-command-position3.zsh b/highlighters/main/test-data/abspath-in-command-position3.zsh index 6c89ddc..415e316 100644 --- a/highlighters/main/test-data/abspath-in-command-position3.zsh +++ b/highlighters/main/test-data/abspath-in-command-position3.zsh @@ -31,7 +31,7 @@ BUFFER=$'/bin; /bin' expected_region_highlight=( - '1 4 path' # /bin (in middle) + '1 4 unknown-token' # /bin (in middle) '5 5 commandseparator' # ; - '7 10 path' # /bin (at end) + '7 10 path_prefix' # /bin (at end) ) diff --git a/highlighters/main/test-data/abspath-in-command-position3b.zsh b/highlighters/main/test-data/abspath-in-command-position3b.zsh index f75ad9e..e43b7fb 100644 --- a/highlighters/main/test-data/abspath-in-command-position3b.zsh +++ b/highlighters/main/test-data/abspath-in-command-position3b.zsh @@ -32,7 +32,7 @@ setopt autocd BUFFER=$'/bin; /bin' expected_region_highlight=( - '1 4 path' # /bin (in middle) + '1 4 arg0' # /bin (in middle) '5 5 commandseparator' # ; - '7 10 path' # /bin (at end) + '7 10 arg0' # /bin (at end) ) diff --git a/highlighters/main/test-data/path-dollared-word3.zsh b/highlighters/main/test-data/path-dollared-word3.zsh index 6921cba..ec981b1 100644 --- a/highlighters/main/test-data/path-dollared-word3.zsh +++ b/highlighters/main/test-data/path-dollared-word3.zsh @@ -34,7 +34,7 @@ BUFFER='$PWD; ${PWD}' expected_region_highlight=( - "1 4 path" # $PWD + "1 4 unknown-token" # $PWD (without AUTO_CD) "5 5 commandseparator" # ; - "7 12 path" # ${PWD} + "7 12 path_prefix" # ${PWD} ) diff --git a/highlighters/main/test-data/path-dollared-word3b.zsh b/highlighters/main/test-data/path-dollared-word3b.zsh new file mode 100644 index 0000000..7c904f3 --- /dev/null +++ b/highlighters/main/test-data/path-dollared-word3b.zsh @@ -0,0 +1,39 @@ +#!/usr/bin/env zsh +# ------------------------------------------------------------------------------------------------- +# Copyright (c) 2020 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 +# ------------------------------------------------------------------------------------------------- + +setopt autocd + +BUFFER=$'$PWD; ${PWD}' + +expected_region_highlight=( + '1 4 arg0' # $PWD + '5 5 commandseparator' # ; + '7 12 arg0' # ${PWD} +) diff --git a/highlighters/main/test-data/plain-file-in-command-position.zsh b/highlighters/main/test-data/plain-file-in-command-position.zsh index b16e43c..141ffac 100644 --- a/highlighters/main/test-data/plain-file-in-command-position.zsh +++ b/highlighters/main/test-data/plain-file-in-command-position.zsh @@ -33,7 +33,7 @@ chmod -x foo BUFFER=$'./foo; ./foo' expected_region_highlight=( - '1 5 unknown-token "issue #202"' # ./foo (in middle) + '1 5 unknown-token' # ./foo (in middle) '6 6 commandseparator' # ; - '8 12 unknown-token "issue #202"' # ./foo (at end) + '8 12 unknown-token' # ./foo (at end) ) From 3f930fb0c171785155a3353c50a9e937799e48a2 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Mon, 16 Mar 2020 20:28:14 +0000 Subject: [PATCH 4/7] 'main': Add an auxiliary variable for readability. --- highlighters/main/main-highlighter.zsh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index b7c1bf0..05ff2ff 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -1123,6 +1123,12 @@ _zsh_highlight_main_highlighter_check_path() local expanded_path="$REPLY" tmp_path integer in_command_position=$2 + if [[ $zsyh_user_options[autocd] == on ]]; then + integer autocd=1 + else + integer autocd=0 + fi + if (( in_command_position )); then REPLY=arg0 else @@ -1150,7 +1156,7 @@ _zsh_highlight_main_highlighter_check_path() done if (( in_command_position )); then - if [[ -x $expanded_path ]] && [[ $zsyh_user_options[autocd] == on || ! -d $expanded_path ]]; then + if [[ -x $expanded_path ]] && { (( autocd )) || [[ ! -d $expanded_path ]] }; then return 0 fi else @@ -1160,8 +1166,7 @@ _zsh_highlight_main_highlighter_check_path() fi # Search the path in CDPATH - if [[ $expanded_path != /* ]] && - { (( ! in_command_position )) || [[ $zsyh_user_options[autocd] == on ]] }; then + if [[ $expanded_path != /* ]] && (( autocd || ! in_command_position )); then # TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here. local cdpath_dir for cdpath_dir in $cdpath ; do From 83ac855cebd1b781ba75ea306a251672d49697fc Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sun, 12 Jan 2020 20:17:59 +0000 Subject: [PATCH 5/7] 'main': Let AUTO_CD directories be highlighted with their own style. --- docs/highlighters/main.md | 1 + highlighters/main/main-highlighter.zsh | 23 ++++++++++++++++--- .../abspath-in-command-position1b.zsh | 2 +- .../abspath-in-command-position3b.zsh | 4 ++-- .../main/test-data/path-dollared-word3b.zsh | 5 ++-- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/highlighters/main.md b/docs/highlighters/main.md index 37e7d13..5eec335 100644 --- a/docs/highlighters/main.md +++ b/docs/highlighters/main.md @@ -27,6 +27,7 @@ This highlighter defines the following styles: * `precommand` - precommand modifiers (e.g., `noglob`, `builtin`) * `commandseparator` - command separation tokens (`;`, `&&`) * `hashed-command` - hashed commands +* `autodirectory` - a directory name in command position when the `AUTO_CD` option is set * `path` - existing filenames * `path_pathseparator` - path separators in filenames (`/`); if unset, `path` is used (default) * `path_prefix` - prefixes of existing filenames diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index 05ff2ff..0222160 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -36,6 +36,7 @@ : ${ZSH_HIGHLIGHT_STYLES[global-alias]:=fg=cyan} : ${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_pathseparator]:=} : ${ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]:=} @@ -113,6 +114,7 @@ _zsh_highlight_main_calculate_fallback() { command arg0 precommand arg0 hashed-command arg0 + autodirectory arg0 arg0_\* arg0 # TODO: Maybe these? — @@ -1130,6 +1132,8 @@ _zsh_highlight_main_highlighter_check_path() fi 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 @@ -1156,8 +1160,16 @@ _zsh_highlight_main_highlighter_check_path() done if (( in_command_position )); then - if [[ -x $expanded_path ]] && { (( autocd )) || [[ ! -d $expanded_path ]] }; then - return 0 + if [[ -x $expanded_path ]]; then + if (( autocd )); then + if [[ -d $expanded_path ]]; then + REPLY=autodirectory + fi + return 0 + elif [[ ! -d $expanded_path ]]; then + # ### This seems unreachable for the current callers + return 0 + fi fi else if [[ -L $expanded_path || -e $expanded_path ]]; then @@ -1170,7 +1182,12 @@ _zsh_highlight_main_highlighter_check_path() # TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here. local cdpath_dir for cdpath_dir in $cdpath ; do - [[ -d "$cdpath_dir/$expanded_path" && -x "$cdpath_dir/$expanded_path" ]] && return 0 + if [[ -d "$cdpath_dir/$expanded_path" && -x "$cdpath_dir/$expanded_path" ]]; then + if (( in_command_position && autocd )); then + REPLY=autodirectory + fi + return 0 + fi done fi diff --git a/highlighters/main/test-data/abspath-in-command-position1b.zsh b/highlighters/main/test-data/abspath-in-command-position1b.zsh index 82292ed..88fe60c 100644 --- a/highlighters/main/test-data/abspath-in-command-position1b.zsh +++ b/highlighters/main/test-data/abspath-in-command-position1b.zsh @@ -32,5 +32,5 @@ setopt autocd BUFFER=$'/' expected_region_highlight=( - '1 1 arg0' # / + '1 1 autodirectory' # / ) diff --git a/highlighters/main/test-data/abspath-in-command-position3b.zsh b/highlighters/main/test-data/abspath-in-command-position3b.zsh index e43b7fb..0e65c98 100644 --- a/highlighters/main/test-data/abspath-in-command-position3b.zsh +++ b/highlighters/main/test-data/abspath-in-command-position3b.zsh @@ -32,7 +32,7 @@ setopt autocd BUFFER=$'/bin; /bin' expected_region_highlight=( - '1 4 arg0' # /bin (in middle) + '1 4 autodirectory' # /bin (in middle) '5 5 commandseparator' # ; - '7 10 arg0' # /bin (at end) + '7 10 autodirectory' # /bin (at end) ) diff --git a/highlighters/main/test-data/path-dollared-word3b.zsh b/highlighters/main/test-data/path-dollared-word3b.zsh index 7c904f3..72a2f7c 100644 --- a/highlighters/main/test-data/path-dollared-word3b.zsh +++ b/highlighters/main/test-data/path-dollared-word3b.zsh @@ -29,11 +29,10 @@ # ------------------------------------------------------------------------------------------------- setopt autocd - BUFFER=$'$PWD; ${PWD}' expected_region_highlight=( - '1 4 arg0' # $PWD + '1 4 autodirectory' # $PWD '5 5 commandseparator' # ; - '7 12 arg0' # ${PWD} + '7 12 autodirectory' # ${PWD} ) From 81842663388e6dfb18e8e85c24c0ff532706513b Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Mon, 16 Mar 2020 21:44:31 +0000 Subject: [PATCH 6/7] 'main': Add a test for aliases to AUTO_CD directories. --- .../main/test-data/alias-to-dir1b.zsh | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 highlighters/main/test-data/alias-to-dir1b.zsh diff --git a/highlighters/main/test-data/alias-to-dir1b.zsh b/highlighters/main/test-data/alias-to-dir1b.zsh new file mode 100644 index 0000000..62ec521 --- /dev/null +++ b/highlighters/main/test-data/alias-to-dir1b.zsh @@ -0,0 +1,37 @@ +#!/usr/bin/env zsh +# ------------------------------------------------------------------------------------------------- +# Copyright (c) 2020 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 +# ------------------------------------------------------------------------------------------------- + +setopt autocd +alias x=/ +BUFFER=$'x' + +expected_region_highlight=( + '1 1 alias' # x +) From f2726d0464a554a874d8e257c9d97a0a0db2a2a2 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Mon, 16 Mar 2020 21:45:50 +0000 Subject: [PATCH 7/7] 'main': Don't consider path_prefix in alias expansions. --- highlighters/main/main-highlighter.zsh | 1 + highlighters/main/test-data/alias-to-dir.zsh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/highlighters/main/main-highlighter.zsh b/highlighters/main/main-highlighter.zsh index 0222160..d6c3f23 100644 --- a/highlighters/main/main-highlighter.zsh +++ b/highlighters/main/main-highlighter.zsh @@ -1196,6 +1196,7 @@ _zsh_highlight_main_highlighter_check_path() # If this word ends the buffer, check if it's the prefix of a valid path. if (( has_end && (len == end_pos) )) && + (( ! in_alias )) && [[ $WIDGET != zle-line-finish ]]; then # TODO: When we've dropped support for pre-5.0.6 zsh, use the *(Y1) glob qualifier here. local -a tmp diff --git a/highlighters/main/test-data/alias-to-dir.zsh b/highlighters/main/test-data/alias-to-dir.zsh index bfa6e07..30390d4 100644 --- a/highlighters/main/test-data/alias-to-dir.zsh +++ b/highlighters/main/test-data/alias-to-dir.zsh @@ -32,5 +32,5 @@ alias x=/ BUFFER=$'x' expected_region_highlight=( - '1 1 unknown-token "issue #668"' # x (/) + '1 1 unknown-token' # x (/) )