我正在尝试创建一个命令完成功能,并且我正在关注本指南。它大约是这样的:
function __my_completion ()
{
local cur prev opts opts_log opts_import
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
opts_log="trace debug info warn err critical off"
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -o nospace -d -W "${opts}" -- ${cur}) )
return 0
fi
case "${prev}" in
-d|--directory)
COMPREPLY=( $(compgen -o nospace -d ${cur}) )
;;
-l|--log-level)
COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
;;
esac
}
complete -F __my_completion myProg
我的问题是:每当完成任何单词时,都会在末尾添加一个空格。这对于普通选项来说很好,但它也适用于目录,尽管有-o nospace -d
选项组合。这非常烦人,因为它会减慢导航速度并且非常不直观。
这是为什么?我该如何纠正?
?
另外,当我在这里时,链接指南中的示例之一的单曲是什么?它在队列中
COMPREPLY=( $(compgen -f ? ${cur}) )
答案1
至少是部分解决方案:虽然compgen
忽略该-o nospace
选项,但complete
尊重它。可悲的是,这意味着要么全部选项后面添加了空格,或者没有任何。这是代码:
#/usr/bin/env bash
function __my_completion ()
{
local cur prev opts opts_log
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
opts_log="trace debug info warn err critical off"
local opts_dir=( $(compgen -d -S "/" -- ${cur}) )
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ${opts_dir[@]} )
return 0
fi
case "${prev}" in
-d|--directory)
COMPREPLY=( ${opts_dir[@]} )
;;
-l|--log-level)
COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
;;
esac
}
complete -o nospace -F __my_completion myProg
添加-S " "
到其他选项也不会重新添加空格。