Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Path with spaces in _canonical_paths




On 11/21/22 17:30, Bart Schaefer wrote:
I still can't reproduce this

Weird.. With the symlink I can now on all my machines (arch, debian 11, mint 21), and even the official(?) docker:

   % docker run --rm -it zshusers/zsh:5.9
   # ln -s /tmp /foo
   # autoload -U compinit; compinit
   # compdef '_canonical_paths -N files files /tmp/My\ File' cmd
   # cmd <Tab>
   /foo/My File
   /tmp/My\ File
   foo/My File
   tmp/My File

(output split to several lines, to make it more readable)

diff --git a/Completion/Unix/Type/_canonical_paths
b/Completion/Unix/Type/_canonical_paths
index a8fbbb524..b2eff84df 100644
--- a/Completion/Unix/Type/_canonical_paths
+++ b/Completion/Unix/Type/_canonical_paths
@@ -42,7 +42,7 @@ _canonical_paths_add_paths () {
      # ### Ideally, this codepath would do what the 'if' above does,
      # ### but telling compadd to pretend the "word on the command line"
      # ### is ${"the word on the command line"/$origpref/$canpref}.
-    matches+=(${${(M)files:#$canpref*}/$canpref/$origpref})
+    matches+=( "${(@)${(@M)files:#$canpref*}/$canpref/$origpref}" )
    fi

    for subdir in $expref?*(@); do

This didn't fix the problem. But applying the same escaping "hack"(?) as in the if-case above, did:

--- a/Completion/Unix/Type/_canonical_paths
+++ b/Completion/Unix/Type/_canonical_paths
@@ -30,19 +30,17 @@
   canpref+=$rltrim
   [[ $expref == *[^/] && $canpref == */ ]] && origpref+=/

+  local -a tmp_buffer
+  compadd -A tmp_buffer "$__gopts[@]" -a files
   # Append to $matches the subset of $files that matches $canpref.
   if [[ $canpref == $origpref ]]; then
     # This codepath honours any -M matchspec parameters.
-    () {
-      local -a tmp_buffer
-      compadd -A tmp_buffer "$__gopts[@]" -a files
-      matches+=( "${(@)tmp_buffer/$canpref/$origpref}" )
-    }
+    matches+=( "${(@)tmp_buffer/$canpref/$origpref}" )
   else
     # ### Ideally, this codepath would do what the 'if' above does,
     # ### but telling compadd to pretend the "word on the command line"
     # ### is ${"the word on the command line"/$origpref/$canpref}.
-    matches+=(${${(M)files:#$canpref*}/$canpref/$origpref})
+    matches+=(${${(M)tmp_buffer:#$canpref*}/$canpref/$origpref})
   fi

   for subdir in $expref?*(@); do





Attachment: OpenPGP_0x39BEE2916D330138.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature
Description: OpenPGP digital signature



Messages sorted by: Reverse Date, Date, Thread, Author