summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Unix/Command/_mount4
-rw-r--r--Completion/Unix/Type/_canonical_paths28
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