私のコマンドのbashコンプリートスクリプトを作成しようとしています。ls
私が望む行動があります。私のコマンドでも同じ動作が必要です。
これは私が得たものです。ls
$ ls /home/tux/<Tab><Tab>
Downloads Documents Pictures
$ ls /home/tux/Do<Tab><Tab>
Downloads Documents
つまり、bashは絶対パスではなく相対パスのみを表示します(つまり、Downloads
完成リストに追加されますが、そうではありません/home/tux/Downloads
)。
同じように動作する完成スクリプトを作成したいと思います。私が試したことは次のとおりです。
_testcommand ()
{
local IFS=$'\n'
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -o bashdefault -d -- "$cur") )
if [ "${#COMPREPLY[@]}" -ne 1 ]
then
# remove prefix "$cur", so the preview of paths gets shorter
local cur_len=$(echo $cur | sed 's|/[^/]*$||' | wc -c)
for i in ${!COMPREPLY[@]}
do
COMPREPLY[$i]="${COMPREPLY[i]:$cur_len}"
done
fi
return 0
}
complete -o nospace -F _testcommand testcommand
ところで結果はこうです。
$ testcommand /home/tux/<Tab><Tab>
Downloads Documents Pictures
$ testcommand /home/tux/Do<Tab>
Downloads Documents
$ testcommand Do
私の仕事をどのように終了できますか?いいえ/home/tux/
コマンドラインから削除しますか?
complete
注:下の呼び出しに「-f」や「-d」などを追加することはできないようです。実際、いくつかのケースでは、完成が道ではなく単語を完成する必要がある場合もあります。
答え1
"ls":を使用して、どの完成機能が使用されているかを確認できますcomplete -p | grep ls
。次のコマンドを使用してこの機能を確認できます。 (type _longopt
前のコマンドの結果)関数で関数_longopt
を見つけることができます_filedir
。
最後に仕上げに関する興味深い記事です。https://spin.atomicobject.com/2016/02/14/bash-programmable-completion/
答え2
bash Completeディレクトリ()pkg-config --variable=completionsdir bash-completion
のほとんどのプログラムは、_filedir
bash-completion自体が提供する機能を使用します。再利用は合法的なようです_filedir
。独自の実装について心配する必要はありません!
追跡要素:
_testcommand()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
# in this case, accept only MarkDown and C files
_filedir '@(md|c)'
}
complete -F _testcommand testcommand
もちろん、ファイルではなくアイテムを完了するときにも使用できます。
if ...
then
# any custom extensions, e.g. words, numbers etc
COMPREPLY=( $(compgen ...) )
else
# fill COMPREPLY using bash-completion's routine
_filedir '@(md|c)'
fi
どうやって見つけましたか?
ありがとう@csm:答えを使用してtype _longopt
どちらが呼び出されるかを確認してください_filedir
。