diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Completion/Unix/Command/_mount | 4 | ||||
-rw-r--r-- | Completion/Unix/Type/_canonical_paths | 28 |
3 files changed, 35 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index f8c6e907e..9927f21e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-08-27 Daniel Shahaf <d.s@daniel.shahaf.name> + + * 39070: Completion/Unix/Command/_mount, + Completion/Unix/Type/_canonical_paths: umount: Complete /f/b<TAB> + → /foo/bar (for absolute path arguments only, for now) + 2016-08-26 Barton E. Schaefer <schaefer@zsh.org> * 39104: Src/exec.c: do not hash relative paths in findcmd() diff --git a/Completion/Unix/Command/_mount b/Completion/Unix/Command/_mount index a3b58bb87..a43085ac1 100644 --- a/Completion/Unix/Command/_mount +++ b/Completion/Unix/Command/_mount @@ -965,8 +965,8 @@ udevordir) _alternative \ 'device-labels:device label:compadd -a dev_tmp' \ - 'device-paths: device path:_canonical_paths -A dpath_tmp -N device-paths device\ path' \ - 'directories:mount point:_canonical_paths -A mp_tmp -N directories mount\ point' && ret=0 + 'device-paths: device path:_canonical_paths -A dpath_tmp -N -M "r:|/=* r:|=*" device-paths device\ path' \ + 'directories:mount point:_canonical_paths -A mp_tmp -N -M "r:|/=* r:|=*" directories mount\ point' && ret=0 ;; labels) _wanted labels expl 'disk label' compadd /dev/disk/by-label/*(:t) && ret=0 diff --git a/Completion/Unix/Type/_canonical_paths b/Completion/Unix/Type/_canonical_paths index 2fdbaa66d..9bccc7f86 100644 --- a/Completion/Unix/Type/_canonical_paths +++ b/Completion/Unix/Type/_canonical_paths @@ -59,6 +59,11 @@ _canonical_paths_get_canonical_path() { } _canonical_paths_add_paths () { + # origpref = original prefix + # expref = expanded prefix + # curpref = current prefix + # canpref = canonical prefix + # rltrim = suffix to trim and readd local origpref=$1 expref rltrim curpref canpref subdir [[ $2 != add ]] && matches=() expref=${~origpref} 2>/dev/null @@ -73,13 +78,34 @@ _canonical_paths_add_paths () { [[ $curpref == */ && $canpref == *[^/] ]] && canpref+=/ canpref+=$rltrim [[ $expref == *[^/] && $canpref == */ ]] && origpref+=/ - matches+=(${${(M)files:#$canpref*}/$canpref/$origpref}) + + # 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}" ) + } + 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}) + fi + for subdir in $expref?*(@); do _canonical_paths_add_paths ${subdir/$expref/$origpref} add done } _canonical_paths() { + # The following parameters are used by callee functions: + # __gopts + # matches + # files + # (possibly others) + local __index typeset -a __gopts __opts |