コマンド完成機能を作成しようとしています。このガイド。おおよそ次のようになります。
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
オプションの組み合わせがあってもディレクトリにも機能します。ナビゲーション速度が遅く、非常に直感的ではないので、これは非常に迷惑です。
なぜそんなことですか?この問題をどのように修正できますか?
?
そして、私がここにいる間、リンクされたガイドの例の1つは何ですか?キューにあります。
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 " "
スペースは再追加されません。