# mount(8) completion -*- shell-script -*- _mount() { local cur prev words cword _init_completion -n =: || return local split=false case "$prev" in -t|--types) # find /lib/modules/$(uname -r)/ -type f -path '*/fs/*.ko' -printf '%f\n' | cut -d. -f1 # FIXME: no if [[ "$cur" == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" split=true fi COMPREPLY=( $( compgen -W 'auto adfs affs autofs btrfs cifs coda cramfs davfs debugfs devpts efs ext2 ext3 ext4 fuse hfs hfsplus hpfs iso9660 jffs2 jfs minix msdos ncpfs nfs nfs4 ntfs ntfs-3g proc qnx4 ramfs reiserfs romfs squashfs smbfs sysv tmpfs ubifs udf ufs umsdos usbfs vfat xfs' -- "$cur" ) ) _fstypes $split && COMPREPLY=( ${COMPREPLY[@]/#/$prev,} ) return ;; --bind|-B|--rbind|-R) _filedir -d return ;; -p|--pass-fd) COMPREPLY=( $(compgen -W '{0..9}') ) compopt -o nospace return ;; -L) COMPREPLY=( $( cd "/dev/disk/by-label/" 2>/dev/null || return; \ compgen -f -- "$cur" ) ) return ;; -U) COMPREPLY=( $( cd "/dev/disk/by-uuid/" 2>/dev/null || return; \ compgen -f -- "$cur" ) ) return ;; -O|--test-opts) # argument required but no completions available return ;; -o|--options) local fstype=auto # default fstype for (( i=${#words[@]}-1; i>0; i-- )); do if [[ "${words[i]}" == -@(t|-types)* ]]; then if [[ "${words[i]}" == *=* ]]; then [[ "${words[i]}" == ?*,* ]] && break fstype="${words[i]#-*=}" else [[ "${words[i+1]}" == ?*,* ]] && break fstype="${words[i+1]}" fi break fi done # no is not a real fstype, reset to "auto" [[ "$fstype" == no?* ]] && fstype=auto # split options list if [[ "$cur" == ?*,* ]]; then prev="${cur%,*}" cur="${cur##*,}" split=true fi # no completion if $cur is opt=smth [[ "$cur" == *=* ]] && return # mount options COMPREPLY=( $(compgen -W 'loop {,a}sync {,no}atime {,no}auto {,fs,def,root}context= defaults {,no}dev {,no}diratime dirsync {,no}exec group {,no}iversion {,no}mand _netdev nofail {,no}relatime {,no}strictatime {,no}suid owner remount ro rw {,no}user users' -- "$cur") ) case "$fstype" in adfs|auto) COMPREPLY+=( $(compgen -W '{u,g}id= {own,oth}mask=' -- "$cur") ) ;;& affs|auto) COMPREPLY+=( $(compgen -W '{u,g}id= set{u,g}id= mode= protect usemp verbose prefix= volume= reserved= root= bs= {,no,usr,grp}quota' -- "$cur") ) ;;& btrfs|auto) COMPREPLY+=( $(compgen -W 'degraded subvol= subvolid= device= nodatasum nodatacow nobarrier max_inline= alloc_start= thread_pool= compress= compress-force= ssd noacl notreelog flushoncommit metadata_ratio= {,no}space_cache clear_cache user_subvol_rm_allowed autodefrag inode_cache' -- "$cur") ) ;;& cifs|auto) COMPREPLY+=( $(compgen -W 'user= password= credentials= {u,g}id= force{u,g}id port= servern= netbiosname= {file,dir}_mode= ip= domain= guest iocharset {,no}setuids {,no,dyn}perm directio {,no}mapchars {,no}intr hard soft noacl nocase sec= nobrl sfu {,no}serverino nounix nouser_xattr {r,w}size= rwpidforward backup{u,g}id cache=' -- "$cur") ) ;;& davfs|auto) COMPREPLY+=( $(compgen -W 'conf= {file,dir}_mode= {u,g}id= username=' -- "$cur") ) ;;& ext[2-4]|auto) COMPREPLY+=( $(compgen -W '{,no}acl bsddf minixdf check= debug errors= {,no}grpid {bsd,sysv}groups {,no,usr,grp}quota nobh nouid32 oldalloc orlov res{u,g}id= sb= {,no}user_xattr' -- "$cur") ) ;;& ext[34]|auto) COMPREPLY+=( $(compgen -W 'journal= journal_dev= norecovery noload data= barrier= commit=' -- "$cur") ) ;;& ext4|auto) COMPREPLY+=( $(compgen -W 'journal_checksum journal_async_commit nobarrier inode_readahead= stripe= {,no}delalloc abort {max,min}_batch_time= journal_ioprio= {,no}auto_da_alloc {,no}discard nouid32 resize {,no}block_validity dioread_{,no}lock max_dir_size_kb= i_version' -- "$cur") ) ;;& msdos|umsdos|vfat|auto) COMPREPLY+=( $(compgen -W 'blocksize= {u,g}id= {u,d,f}mask= allow_utime= check= codepage= conv= cvf_format= cvf_option= debug fat= iocharset= tz= quiet showexec sys_immutable flush usefree {,no}dots dotsOK=' -- "$cur") ) ;;& vfat|auto) COMPREPLY+=( $(compgen -W 'uni_xlate posix nonumtail utf8 shortname=' -- "$cur") ) ;;& iso9660|auto) COMPREPLY+=( $(compgen -W 'norock nojoliet check= {u,g}id= map= mode= unhide block= conv= cruft session= sbsector= iocharset= utf8' -- "$cur") ) ;;& jffs2|auto) COMPREPLY+=( $(compgen -W 'compr= rp_size=' -- "$cur") ) ;;& jfs|auto) COMPREPLY+=( $(compgen -W 'iocharset= resize= {,no}integrity errors= {,no,usr,grp}quota' -- "$cur") ) ;;& nfs|nfs4|auto) COMPREPLY+=( $(compgen -W 'soft hard timeo= retrans= {r,w}size= {,no}ac acreg{min,max}= acdir{min,max}= actimeo= bg fg retry= sec= {,no}sharecache {,no}resvport lookupcache= proto= port= {,no}intr {,no}cto {,nfs}vers= ' -- "$cur") ) ;;& nfs|auto) COMPREPLY+=( $(compgen -W 'udp tcp rdma mount{port,proto,host}= mountvers= namlen={,no}lock {,no}acl {,no}rdirplus {,no}fsc' -- "$cur") ) ;;& nfs4|auto) COMPREPLY+=( $(compgen -W 'clientaddr= {,no}migration' \ -- "$cur") ) ;;& ntfs-3g) COMPREPLY+=( $(compgen -W '{u,g}id= {u,f,d}mask= usermapping= permissions inherit locale= force {,no}recover ignore_case remove_hiberfile show_sys_files hide_{hid,dot}_files windows_names allow_other max_read= silent no_def_opts streams_interface= user_xattr efs_raw {,no}compression debug no_detach' -- "$cur") ) ;;& proc|auto) COMPREPLY+=( $(compgen -W '{u,g}id=' -- "$cur") ) ;;& reiserfs|auto) COMPREPLY+=( $(compgen -W 'conv hash= {,no_un}hashed_relocation noborder nolog notail replayonly resize= user_xattr acl barrier=' -- "$cur") ) ;;& tmpfs|auto) COMPREPLY+=( $(compgen -W 'size= nr_blocks= nr_inodes= mode= {u,g}id= mpol=' -- "$cur") ) ;;& udf|auto) COMPREPLY+=( $(compgen -W '{u,g}id= umask= unhide undelete nostrict iocharset bs= novrs session= anchor= volume= partition= lastblock= fileset= rootdir=' -- "$cur") ) ;;& usbfs|auto) COMPREPLY+=( $(compgen -W 'dev{u,g}id= devmode= bus{u,g}id= busmode= list{u,g}id= listmode=' -- "$cur") ) ;;& xfs|auto) COMPREPLY+=( $(compgen -W 'allocsize= {,no}attr2 barrier dmapi {,no}grpid {bsd,sysv}groups ihashsize= {,no}ikeep inode{32,64} {,no}largeio logbufs= logbsize= logdev= rtdev= mtpt= noalign norecovery nouuid osyncisosync {u,g,p}qnoenforce {,u,usr,g,grp,p,prj}quota sunit= swidth= swalloc' -- "$cur") ) ;;& esac # COMP_WORDBREAKS is a real pain in the ass prev="${prev##*[$COMP_WORDBREAKS]}" $split && COMPREPLY=( ${COMPREPLY[@]/#/"$prev,"} ) [[ $COMPREPLY == *= ]] && compopt -o nospace return ;; esac if [[ "$cur" == -* ]]; then COMPREPLY=( $( compgen -W '--version --help --verbose --all --fork --fake --internal-only -l --no-mtab --no-canonicalize --pass-fd -s --read-only --rw -L -U --types --test-opts --options --bind --rbind --move' -- "$cur" ) ) [[ $COMPREPLY ]] && return fi [[ "$cur" == \\ ]] && cur="/" local sm host if [[ "$cur" == *:* ]]; then for sm in "$(type -P showmount)" {,/usr}/{,s}bin/showmount; do [[ -x $sm ]] || continue COMPREPLY=( $( compgen -W "$( "$sm" -e ${cur%%:*} | \ awk 'NR>1 {print $1}' )" -- "${cur#*:}" ) ) return 0 done fi if [[ "$cur" == //* ]]; then host=${cur#//} host=${host%%/*} if [[ -n $host ]]; then COMPREPLY=( $( compgen -P "//$host" -W \ "$( smbclient -d 0 -NL $host 2>/dev/null | sed -ne '/^['"$'\t '"']*Sharename/,/^$/p' | sed -ne '3,$s|^[^A-Za-z]*\([^'"$'\t '"']*\).*$|/\1|p' )" \ -- "${cur#//$host}" ) ) fi fi _filedir } && complete -F _mount mount # ex: ts=4 sw=4 et filetype=sh