From aa041f7a5a970d2b03756b730caa185eef39f8f0 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Fri, 19 Aug 2016 15:56:51 +0000 Subject: 39070: umount: Complete /f/b → /foo/bar (for absolute path arguments only, for now) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Completion/Unix/Command/_mount | 4 ++-- Completion/Unix/Type/_canonical_paths | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) (limited to 'Completion/Unix') 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 -- cgit 1.4.1