zsh umount 完成:将完成限制为一个参数

zsh umount 完成:将完成限制为一个参数

当我使用 zsh 补全命令时umount

umount /mnt/t<TAB>

它完成了安装的文件系统/mnt/tmp

但是当我不小心按 Tab 太多次时,它会试图提供太多帮助,并建议其他安装点,这会导致无意义的完成,例如:

umount /mnt/tmp /

如何将卸载完成限制为仅一个安装点,以便其他选项卡不会添加任何其他参数?

我想我已经在以下位置找到了相关部分/usr/share/zsh/functions/Completion/Unix/_mount

  # Completion for umount.
      local excl='-V --version -h --help'
      args=(
    '(- *)'{-h,--help}'[show help]'
    '(- *)'{-V,--version}'[show version]'
    "($excl -v --verbose)"{-v,--verbose}'[verbose mode]'
    "($excl -n --no-mtab)"{-n,--no-mtab}"[don't write /etc/mtab]"
    "($excl)-r[remount read-only on failure]"
    "($excl)-d[for loopback mount, free loop device]"
    "($excl)-i[don't call /sbin/umount.<fs> helper]"
    "($excl *)-a[unmount all file systems from /etc/mtab]"
    "($excl)-t[specify file system type]:file system type:_file_systems"
    "($excl *)-O[with -a, restrict filesystems by options]:file system option:->fsopt"
    "($excl)-f[force unmount]"
    "($excl)-l[lazy unmount]"
    '*:dev or dir:->udevordir'
      )

  _arguments -C -s "$args[@]" && ret=0

我需要修改什么?

答案1

_arguments是一个复杂的野兽......处理非选项参数的部分是

    '*:dev or dir:->udevordir'

*:message:action这是手册中的一个实例,*意味着它适用于所有非选项参数。替换*1,它仅适用于第一个非选项参数( 的实例n:message:action)。

    '1:dev or dir:->udevordir'

我猜 zsh 的完成更加自由,因为umount在某些平台上接受多个文件系统。

要在文件系统之后停止完成选项,请传递-A "-*"_arguments,即将其调用更改为

  _arguments -C -A "-*" -s "$args[@]" && ret=0

相关内容