Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: zsh_directiory_name_generic fix
- X-seq: zsh-workers 44505
- From: Peter Stephenson <p.stephenson@xxxxxxxxxxx>
- To: Zsh Hackers' List <zsh-workers@xxxxxxx>
- Subject: PATCH: zsh_directiory_name_generic fix
- Date: Wed, 10 Jul 2019 15:31:13 +0100
- Cms-type: 201P
- Dkim-filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20190710143115euoutp01c0bf1d7d8ef29a0c0bdf216af5be928f~wEjHQBjrE2826628266euoutp01C
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1562769075; bh=0T6W3VhrB2O9kz6NSsXWPiFhzxog98aeSSZgJ2dRtTA=; h=Subject:From:To:Date:References:From; b=AsenkrPFBCBYjeMlGJ43Db8MPFRK7tNtDf2AaSpitH7xt5qcGpnm3pELp9cxLELbf zee2ppJ48R06K1OZ6srHNrqCBcSd7Entoolr5YAF5HMzJTCPZuMXa6XJgu71GSJDbt dYQvVGoe3+FT7vryTjl02DggyBP8pRfacYXrQwm0=
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- List-unsubscribe: <mailto:zsh-workers-unsubscribe@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- References: <CGME20190710143114eucas1p1a5939118c365d5a25d81881dbef5dc44@eucas1p1.samsung.com>
There was a bug in matching directories back to compentised names that
it didn't prefer longest matches of prefixes if the prefix contained an
expression that would be match as a new component, because it was
sorting on the raw values (i.e. including the :more_stuff suffix). This
does the simple thing of matching exhaustively and picking the longest
prefix that matches.
pws
diff --git a/Functions/Chpwd/zsh_directory_name_generic b/Functions/Chpwd/zsh_directory_name_generic
index aa4bf9b84..df21af598 100644
--- a/Functions/Chpwd/zsh_directory_name_generic
+++ b/Functions/Chpwd/zsh_directory_name_generic
@@ -69,25 +69,32 @@ elif [[ $1 = d ]]; then
local _zdn_rest=$_zdn_dir
local -a _zdn_cpts
local _zdn_pref _zdn_pref_raw _zdn_matched _zdn_cpt _zdn_name
+ local _zdn_pref_matched _zdn_rest_matched
+ integer _zdn_matchlen _zdn_len1
while [[ -n $_zdn_var && -n $_zdn_rest ]]; do
+ _zdn_matchlen=0
_zdn_assoc=(${(Pkv)_zdn_var})
- # Sorting in descending order will ensure prefixes
- # come after longer strings with that perfix, so
- # we match more specific directory names preferentially.
_zdn_cpts=(${(Ov)_zdn_assoc})
_zdn_cpt=''
for _zdn_pref_raw in $_zdn_cpts; do
_zdn_pref=${_zdn_pref_raw%/:*}
[[ -z $_zdn_pref ]] && continue
if [[ $_zdn_rest = $_zdn_pref(#b)(/|)(*) ]]; then
- _zdn_cpt=${(k)_zdn_assoc[(r)$_zdn_pref_raw]}
- # if we matched a /, too, add it...
- _zdn_matched+=$_zdn_pref$match[1]
- _zdn_rest=$match[2]
- break
+ _zdn_len1=${#_zdn_pref}
+ if (( _zdn_len1 > _zdn_matchlen )); then
+ _zdn_matchlen=$_zdn_len1
+ _zdn_cpt=${(k)_zdn_assoc[(r)$_zdn_pref_raw]}
+ # if we matched a /, too, add it...
+ _zdn_pref_matched=$_zdn_pref$match[1]
+ _zdn_rest_matched=$match[2]
+ fi
fi
done
+ if (( _zdn_matchlen )); then
+ _zdn_matched+=$_zdn_pref_matched
+ _zdn_rest=$_zdn_rest_matched
+ fi
if [[ -n $_zdn_cpt ]]; then
_zdn_name+=${_zdn_name:+${_zdh_name}:}$_zdn_cpt
if [[ ${_zdn_assoc[$_zdn_cpt]} = (#b)*/:([[:IDENT:]]##) ]]; then
Messages sorted by:
Reverse Date,
Date,
Thread,
Author