quando uso a conclusão zsh para o umount
comando:
umount /mnt/t<TAB>
ele completa o sistema de arquivos montado /mnt/tmp
.
Mas quando eu acidentalmente pressiono tab muitas vezes, ele tenta ser muito útil e sugere outros pontos de montagem, o que leva a conclusões sem sentido, como:
umount /mnt/tmp /
como posso limitar a conclusão da quantidade a apenas um ponto de montagem, para que outras guias não adicionem mais argumentos?
Acho que localizei a seção relevante em /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
o que preciso modificar?
_arguments
é uma fera complicada… A parte que lida com argumentos de não opção éEste é um exemplo
*:message:action
no manual, o que*
significa que se aplica a todos os argumentos sem opção. Substitua*
por1
, que se aplica apenas ao primeiro argumento sem opção (uma instância den:message:action
).Acho que a conclusão do zsh é mais liberal porque
umount
aceita vários sistemas de arquivos em algumas plataformas.Para também parar de completar as opções após o sistema de arquivos, passe
-A "-*"
para_arguments
, ou seja, altere sua invocação para