Package: zsh Version: 4.3.2-8 Severity: wishlist Tags: patch Hi!
A major trouble for me in umount completion has been that mountpoints completed are only the absolute paths given in mtab, when actually I could enter relative paths, and for that matter any path which canonicalizes to one of the absolute paths specified. Couldn't find any function which did this in zsh. So, I decided to write my own. This function takes a list of paths and completes them, allowing the user to also enter other paths which are equivalent to any of the paths provided. I have provided the function/style documentation with the source. Here's the function:
#autoload # This completion function completes all paths given to it, and also tries to # offer completions which point to the same file as one of the paths given # (relative path when an absolute path is given, and vice versa; when ..'s are # present in the word to be completed, and some paths got from symlinks. # Usage: _canonical_paths [-A var] [-N] [-MJV12nfX] tag desc paths... # -A, if specified, takes the paths from the array variable specified. Paths can # also be specified on the command line as shown above. -N, if specified, # prevents canonicalizing the paths given before using them for completion, in # case they are already so. `tag' and `desc' arguments are well, obvious :) In # addition, the options -M, -J, -V, -1, -2, -n, -F, -X are passed to compadd. local __index typeset -a __gopts __opts zparseopts -D -a __gopts M: J: V: 1 2 n F: X: A:=__opts N=__opts : ${1:=canonical-paths} ${2:=path} __index=$__opts[(I)-A] (( $__index )) && set -- $@ ${(P)__opts[__index+1]} local expl ret=1 tag=$1 desc=$2 shift 2 if (( ! $+commands[readlink] )); then _wanted "$tag" expl "$desc" compadd $__gopts $@ && ret=0 return ret fi typeset -a matches files if (( $__opts[(I)-N] )); then files=($@) else for __index in $@; do files+=$(readlink -qf $__index) done fi _canonical_paths_add_paths () { local origpref=$1 expref rltrim curpref canpref subdir [[ $2 != add ]] && matches=() expref=${~origpref} [[ $origpref == (|*/). ]] && rltrim=. curpref=${${expref%$rltrim}:-./} canpref=$(readlink -qf $curpref) if [[ $? -eq 0 ]]; then [[ $curpref == */ && $canpref == *[^/] ]] && canpref+=/ canpref+=$rltrim [[ $expref == *[^/] && $canpref == */ ]] && origpref+=/ matches+=(${${(M)files:#$canpref*}/$canpref/$origpref}) fi for subdir in $expref?*(@); do _canonical_paths_add_paths ${subdir/$expref/$origpref} add done } local base=$PREFIX typeset -i blimit _canonical_paths_add_paths $base if [[ -z $base ]]; then _canonical_paths_add_paths / add elif [[ $base == ..(/.(|.))#(|/) ]]; then # This style controls how many parent directory links (..) to chase searching # for possible completions. The default is 8. Note that this chasing is # triggered only when the user enters atleast a .. and the path completed # contains only . or .. components. A value of 0 turns off .. link chasing # altogether. zstyle -s ":completion:${curcontext}:$tag" \ canonical-paths-back-limit blimit || blimit=8 if [[ $base != */ ]]; then [[ $base != *.. ]] && base+=. base+=/ fi until [[ $base.. -ef $base || blimit -le 0 ]]; do base+=../ _canonical_paths_add_paths $base add blimit+=-1 done fi _wanted "$tag" expl "$desc" compadd $__gopts -Q -U -a matches && ret=0 return ret
Well, here's the patch to _mount which uses the above function. This patch also fixes a bug which altogether prevented option completion! (Do check if my fix is right, I am unable to understand why the check for _fs_any is being made in the first place, when all the _fs_* variables are local, and you can't optimize by initializing them only once per session). I also updated the linux section with whatever options that have come up since the last update. Also removed a few linux options which were of no use in the command line. Enough of the rant! Here's the patch:
43c43 < local args deffs=iso9660 tmp typeops=-t _fs_any _nfs_access _fs_nfs _nfs_ufs \ --- > local args deffs=iso9660 tmp typeops=-t _nfs_access _fs_nfs _nfs_ufs \ 52a53,54 > local _fs_any > 98c100 < '(nosuid)suid[use suid and sgib bits]' --- > '(nosuid)suid[use suid and sgid bits]' 213c215 < '(nosuid)suid[use suid and sgib bits]' --- > '(nosuid)suid[use suid and sgid bits]' 306,307c308 < '(noauto)auto[can be mounted with -a]' < '(rw suid dev exec auto nouser async)defaults[use default options]' --- > '(rw suid dev exec async)defaults[use default options]' 309a311 > '(nomand)mand[allow mandatory locks]' 311d312 < '(auto)noauto[can only be mounted explicitly]' 313a315 > "(mand)nomand[don'tallow mandatory locks]" 315d316 < '(user)nouser[can only be mounted by root]' 319c320 < '(nosuid)suid[use suid and sgib bits]' --- > '(nosuid)suid[use suid and sgid bits]' 326a328,333 > _fs_adfs=( > 'uid[set owner of root]:user ID' > 'gid[set group of root]:group ID' > 'ownmask[permission mask for ADFS "owner" permissions]:mask (octal)' > 'othmask[permission mask for ADFS "other" permissions]:mask (octal)' > ) 341a349,353 > _fs_devpts=( > "uid[set owner of newly created pty's]:user ID" > "gid[set group of newly created pty's]:group ID" > "mode[set mode of newly created pty's]:file permission bits" > ) 342a355,356 > '(noacl)acl[support POSIX access control lists]' > '(acl)noacl[do not support POSIX access control lists]' 351a366,369 > 'nobh[do not attach buffer_heads to file pagecache]' > 'nouid32[disable 32-bit UIDs and GIDs]' > '(orlov)oldalloc[use old allocator for new inodes]' > '(oldalloc)orlov[use orlov allocator for new inodes]' 355c373,374 < 'nouid32[disable 32-bit UIDs and GIDs]' --- > '(nouser_xattr)user_xattr[support user extended attributes]' > '(user_xattr)nouser_xattr[do not support user extended attributes]' 379a399 > 'commit[specify commit sync interval for data and metadata]:seconds' 389a410,419 > _fs_hfs=( > 'creator[specify creator value]:creator' > 'type[specify type value]:type' > 'umask[specify umask]:umask value (octal)' > 'dir_umask[specify umask for directories only]:umask value (octal)' > 'file_umask[specify umask for files only]:umask value (octal)' > 'session[specify CDROM session to mount]:session' > 'part[specify partition number from device to use]:part' > 'quiet[do not complain about invalid mount options]' > ) 413a444,450 > _fs_jfs=( > 'iocharset[character set when converting from unicode to ascii]:character set' > 'resize[resize volume to specified number of blocks]:blocks' > '(integrity)nointegrity[do not write to the journal]' > '(nointegrity)integrity[commit metadata changes to the journal]' > 'errors[specify behavior on error]:error behavior:((continue\:ignore\ errors remount-ro\:remount\ file\ system\ read-only panic\:panic\ and\ halt\ system))' > ) 422c459 < ) --- > ) 446a484 > 'nostrict[unset strict conformance]' 456a495,505 > _fs_usbfs=( > 'devuid[set owner of device files]:user ID' > 'devgid[set group of device files]:group ID' > 'devmode[set mode of device files]:file permission bits' > 'busuid[set owner of bus directories]:user ID' > 'busgid[set group of bus directories]:group ID' > 'busmode[set mode of bus directories]:file permission bits' > 'listuid[set owner of file devices]:user ID' > 'listgid[set group of file devices]:group ID' > 'listmode[set mode of file devices]:file permission bits' > ) 467a517 > 'nouuid[ignore the filesystem uuid]' 698a749 > "(-V -h)-i[don't call /sbin/umount.<fs> helper]" 801c852 < local dev_tmp mp_tmp mline --- > local dev_tmp dpath_tmp mp_tmp mline 816a868,870 > dpath_tmp=( "${(@M)dev_tmp:#/*}" ) > dev_tmp=( "${(@)dev_tmp:#/*}" ) > 818,819c872,874 < 'devices:device:compadd -a dev_tmp' \ < 'directories:mount point:compadd -a mp_tmp' && ret=0 --- > '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
Regards, Ramkumar. -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (101, 'testing') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/dash Kernel: Linux 2.6.16-beyond2 Locale: LANG=en_IN, LC_CTYPE=en_IN (charmap=UTF-8) Versions of packages zsh depends on: ii debconf [debconf-2.0] 1.5.0 Debian configuration management sy ii libc6 2.3.6-7 GNU C Library: Shared libraries ii libncurses5 5.5-1.1 Shared libraries for terminal hand Versions of packages zsh recommends: ii libcap1 1:1.10-14 support for getting/setting POSIX. ii libpcre3 6.4-2 Perl 5 Compatible Regular Expressi -- no debconf information -- WARN_(accel)("msg null; should hang here to be win compatible\n"); -- WINE source code