Package: zsh
Version: 4.3.2-17
Severity: wishlist
Tags: patch

Hi!

This patch provides a generic completion setup for FUSE
programs. Currently fusermount and sshfs are completed by zsh, and
there is a huge list of programs in this category
(http://fuse.sourceforge.net/wiki/index.php/FileSystems). These
completion scripts should reduce redundancy in the completion
functions of these programs as they all use a common library which
supports some generic options. This code is similar to the approach
taken by _x_arguments.

(Patches to _fusermount and _sshfs to follow soon! :) )

Regards,
Ramkumar.

#autoload

local ret long rawret nm=${compstate[nmatches]} fsopt cvalsvar
typeset -a fargs opts

fargs=(
  '(-d -f)-d[enable debug output]'
  '-f[enable foreground operation]'
  '-r[mount filesystem read-only]'
  '-s[disable multi-threaded operation]'
  '(-h --help)'{-h,--help}'[display help and exit]'
  '(-V --version)'{-V,--version}'[show version information and exit]'
)

(( $# )) || fargs+='*:default: _default'

long=$argv[(I)--]
if (( long )); then
  argv[long]=($fargs --)
else
  set -- $@ $fargs
fi

while [[ $1 == -(O*|F*|[CRWsw]) ]]; do
  if [[ $1 == -F?* ]]; then
    cvalsvar=${1[3,-1]}
  elif [[ $1 == -F ]]; then
    cvalsvar=$2
    shift
  else
    opts+=$1
    [[ $1 == -R ]] && rawret=yes
  fi
  shift
done

if [[ $cvalsvar != - ]]; then
  fsopt='*-o[specify mount options]:mount option:_fuse_values'
  [[ -n $cvalsvar ]] && fsopt+=" -A $cvalsvar"
  fsopt+=' mount\ option'
  set -- $@ $fsopt
fi

_arguments -R $opts $@

ret=$?

if [[ $ret == 300 ]]; then
  compstate[restore]=
  [[ -z $rawret ]] && ret=$(( nm == $compstate[nmatches] ))
fi

return ret
#autoload

local ret stateset fvals cvalsvar cvalind
typeset -a fvals opts

if [[ $1 = -O* ]]; then
  opts+=$1
  shift
fi
opts+=(-s , -S =)

cvalind=$argv[(I)-A*]

while (( cvalind )); do
  if [[ ${(P)cvalind} = -A?* ]]; then
    cvalsvar=${(P)cvalind[3,-1]}
    argv[cvalind]=()
  else
    cvalsvar=$argv[cvalind+1]
    argv[cvalind,cvalind+1]=()
  fi
  cvalind=$argv[(I)-A*]
done

fvals=(
  'ro[mount filesystem read-only]'
  'allow_other[allow access to other users]'
  'allow_root[allow access to root]'
  'nonempty[allow mounts over non-empty file/dir]'
  'default_permissions[enable permission checking by kernel]'
  'fsname[set filesystem name]:name'
  'large_read[issue large read requests (linux v2.4 only)]'
  'max_read[set maximum size of read requests]:size'
  'hard_remove[immediate removal (do not hide files)]'
  'use_ino[let filesystem set inode numbers]'
  'readdir_ino[try to fill in d_ino in readdir]'
  'direct_io[use direct I/O]'
  'kernel_cache[cache files in kernel]'
  'umask[set file permissions]:permission mask (octal)'
  'uid[set file owner]:user id:'
  'gid[set file group]:group id:'
  'entry_timeout[cache timeout for names]:timeout (s)'
  'negative_timeout[cache timeout for deleted names]:timeout (s)'
  'attr_timeout[cache timeout for attributes]:timeout (s)'
)

[[ -n $cvalsvar ]] && set -- $@ ${(P)cvalsvar}

if [[ $# -eq 0 ]]; then
  set -- 'mount options' $fvals
else
  set -- $@ $fvals
fi

if [[ -n $state ]]; then
  stateset=$state
  state=
fi

_values $opts $@ && ret=0

if [[ -n $state ]]; then
  compstate[restore]=
elif [[ -n $stateset ]]; then
  state=$stateset
else
  unset state
fi

return $ret
-- 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.4       Debian configuration management sy
ii  libc6                        2.3.6.ds1-4 GNU C Library: Shared libraries
ii  libncurses5                  5.5-3       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

Reply via email to