summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2011-02-13 17:53:26 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2011-02-13 17:53:26 +0000
commit9199663fe0ff6d33780400ba17ad585cd0919026 (patch)
tree533811cd17500cc9318b48985781b440dec1f8ea
parent459953f02973284288c933002fb5a9ef785b52ad (diff)
downloadzsh-9199663fe0ff6d33780400ba17ad585cd0919026.tar.gz
zsh-9199663fe0ff6d33780400ba17ad585cd0919026.zip
28750 plus extra comments:
case of completeinword file handling where we are completing after the first component of a path instead of a middle component of a path
-rw-r--r--ChangeLog10
-rw-r--r--Completion/Unix/Type/_path_files53
2 files changed, 48 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index f01074d31..0dc4c2652 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-02-13 Peter Stephenson <p.w.stephenson@ntlworld.com>
+
+ * 28750 with some extra comments:
+ Completion/Unix/Type/_path_files: separate out completeinword
+ handling where the current component is not the last but is
+ the first from the already handled case where there is a further
+ component in front.
+
2011-02-11 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 28671: Src/Zle/zle_utils.c: better cursor positioning
@@ -14195,5 +14203,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5196 $
+* $Revision: 1.5197 $
*****************************************************
diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index 1f8be09b8..baa57e5d3 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -617,7 +617,8 @@ for prepath in "$prepaths[@]"; do
# enough to handle multiple components with patterns.
if (( tmp4 )); then
- # It is. For menu completion we now add the possible completions
+ # The component we're checking is ambiguous.
+ # For menu completion we now add the possible completions
# for this component with the unambiguous prefix we have built
# and the rest of the string from the line as the suffix.
# For normal completion we add the rests of the filenames
@@ -719,6 +720,7 @@ for prepath in "$prepaths[@]"; do
fi
fi
tmp4=-
+ # Found an ambiguity, stop the loop over components.
break
fi
@@ -764,27 +766,49 @@ for prepath in "$prepaths[@]"; do
done
if [[ -z "$tmp4" ]]; then
+ # I think this means it's finally time to add the matches,
+ # now we've collected contributions from all components.
if [[ "$mid" = */ ]]; then
+ # This seems to mean we're completing in the middle of the
+ # command line argument, i.e. not in the last component.
+ # There are two cases, depending on whether this part of
+ # the path itself has multiple directories or not.
PREFIX="${opre}"
SUFFIX="${osuf}"
tmp4="${testpath#${mid}}"
- tmp3="${mid%/*/}"
- tmp2="${${mid%/}##*/}"
- if [[ -n "$linepath" ]]; then
- compquote -p tmp3
+ if [[ $mid = */*/* ]]; then
+ # Multiple levels of directory involved.
+ tmp3="${mid%/*/}"
+ tmp2="${${mid%/}##*/}"
+ if [[ -n "$linepath" ]]; then
+ compquote -p tmp3
+ else
+ compquote tmp3
+ fi
+ compquote tmp4 tmp2 tmp1
+ for i in "$tmp1[@]"; do
+ _list_files tmp2 "$prepath$realpath${mid%/*/}"
+ compadd $Uopt -Qf "$mopts[@]" -p "${Uopt:+$IPREFIX}$linepath$tmp3/" \
+ -s "/$tmp4$i${Uopt:+$ISUFFIX}" \
+ -W "$prepath$realpath${mid%/*/}/" \
+ "$pfxsfx[@]" $Mopts $listopts - "$tmp2"
+ done
else
- compquote tmp3
+ # Simpler case with fewer directories: avoid double counting.
+ tmp2="${${mid%/}##*/}"
+ compquote tmp4 tmp2 tmp1
+ for i in "$tmp1[@]"; do
+ _list_files tmp2 "$prepath$realpath${mid%/*/}"
+ compadd $Uopt -Qf "$mopts[@]" -p "${Uopt:+$IPREFIX}$linepath" \
+ -s "/$tmp4$i${Uopt:+$ISUFFIX}" \
+ -W "$prepath$realpath" \
+ "$pfxsfx[@]" $Mopts $listopts - "$tmp2"
+ done
fi
- compquote tmp4 tmp2 tmp1
- for i in "$tmp1[@]"; do
- _list_files tmp2 "$prepath$realpath${mid%/*/}"
- compadd $Uopt -Qf "$mopts[@]" -p "${Uopt:+$IPREFIX}$linepath$tmp3/" \
- -s "/$tmp4$i${Uopt:+$ISUFFIX}" \
- -W "$prepath$realpath${mid%/*/}/" \
- "$pfxsfx[@]" $Mopts $listopts - "$tmp2"
- done
else
+ # This would seem to be where we're completing the last
+ # component of the path -- the normal one, in other words.
if [[ "$osuf" = */* ]]; then
PREFIX="${opre}${osuf}"
SUFFIX=
@@ -803,6 +827,7 @@ for prepath in "$prepaths[@]"; do
fi
if [[ -z "$_comp_correct" && -n "$compstate[pattern_match]" &&
"${PREFIX#\~}$SUFFIX" = (|*[^\\])[][*?#~^\|\<\>]* ]]; then
+ # Pattern match, we need to be clever with matchers.
tmp1=("$linepath$tmp4${(@)^tmp1}")
_list_files tmp1 "$prepath$realpath"
compadd -Qf -W "$prepath$realpath" "$pfxsfx[@]" "$mopts[@]" \