当我使用 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