Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: "pws non-canonical hack" problems
- X-seq: zsh-workers 25582
- From: Peter Stephenson <pws@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: "pws non-canonical hack" problems
- Date: Mon, 1 Sep 2008 18:14:25 +0100
- In-reply-to: <080825181954.ZM27367@xxxxxxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- Organization: CSR
- References: <20080823072446.GM8612@xxxxxxxxxxxx> <080823075551.ZM5496@xxxxxxxxxxxxxxxxxxxxxx> <20080825174751.38323d18@pws-pc> <080825181954.ZM27367@xxxxxxxxxxxxxxxxxxxxxx>
On Mon, 25 Aug 2008 18:19:54 -0700
Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> It's pretty difficult for me to test because I don't have a file
> system that behaves in this magical way. But the answer, I think, is
> to skip the tmp1+= inside the loop and call compfiles again after the
> loop is finished.
I think this works for the simple case of automounted directories... at
least it triggered and generated the right completions after I eventually
found all the styles I needed to change to check it (accept-exact-dirs,
fake-files, completer).
Index: Completion/Unix/Type/_path_files
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/_path_files,v
retrieving revision 1.34
diff -u -r1.34 _path_files
--- Completion/Unix/Type/_path_files 30 Jul 2008 14:57:29 -0000 1.34
+++ Completion/Unix/Type/_path_files 1 Sep 2008 17:10:25 -0000
@@ -7,7 +7,8 @@
local tmp1 tmp2 tmp3 tmp4 i orig eorig pre suf tpre tsuf opre osuf cpre
local pats haspats ignore pfx pfxsfx sopt gopt opt sdirs ignpar cfopt listsfx
local nm=$compstate[nmatches] menu matcher mopts sort mid accex fake
-local listfiles listopts tmpdisp
+local listfiles listopts tmpdisp origtmp1
+integer npathcheck
local -a match mbegin mend
typeset -U prepaths exppaths
@@ -351,8 +352,11 @@
tmp1=( "$prepath$realpath$donepath$tmp2" )
+ # count of attemps for pws non-canonical hack
+ (( npathcheck = 0 ))
while true; do
+ origtmp1=("${tmp1[@]}")
# Get the prefix and suffix for matching.
if [[ "$tpre" = */* ]]; then
@@ -403,15 +407,26 @@
# something to match by explicit name. This is for
# `clever' filing systems where names pop into existence
# when referenced.
- if (( ! $#tmp1 )); then
- for tmp3 in "$tmp2[@]"; do
- if [[ -n $tmp3 && $tmp3 != */ ]]; then
- tmp3+=/
- fi
- if [[ -e "$tmp3${(Q)PREFIX}${(Q)SUFFIX}" ]] then
- tmp1+=("$tmp3${(Q)PREFIX}${(Q)SUFFIX}")
- fi
- done
+ #
+ # As suggested by Bart, to make sure the "compfiles" checks
+ # still work we repeat the tests above if we successfully
+ # find something that might need adding, but we make sure
+ # we only do this once for completion of each path segment.
+ if (( ! $#tmp1 && npathcheck == 0 )); then
+ (( npathcheck = 1 ))
+ for tmp3 in "$tmp2[@]"; do
+ if [[ -n $tmp3 && $tmp3 != */ ]]; then
+ tmp3+=/
+ fi
+ if [[ -e "$tmp3${(Q)PREFIX}${(Q)SUFFIX}" ]] then
+ (( npathcheck = 2 ))
+ fi
+ done
+ if (( npathcheck == 2 )); then
+ # repeat loop with same arguments
+ tmp1=("$origtmp1[@]")
+ continue
+ fi
fi
if (( ! $#tmp1 )); then
@@ -518,6 +533,7 @@
else
skipped=/
fi
+ (( npathcheck = 0 ))
done
# The next loop searches the first ambiguous component.
--
Peter Stephenson <pws@xxxxxxx> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
Messages sorted by:
Reverse Date,
Date,
Thread,
Author