これは、私が持っている別の補完スクリプトの一般化されたバージョンで、同様のことを行います。これは、コマンドを完了するために FLIST_DIR で定義されたファイルのディレクトリを使用して、一般的な仮想コマンド「flist」を想定しています (オプションを省略します)。
プログラム ( teamocil
) の次の部分を変更し、デフォルトのディレクトリを から$HOME/flist
に変更し$HOME/.teamocil
、独自のフィルター/変換を定義します。次に、それをソースするだけで (例: . ~/bin/completion/bash_completion_flist
)、必要に応じて既存の bash 補完リストに追加します。
# bash_completion_flist:
# for some hypothetical command called "flist",
# generate completions using a directory of files
FLIST_DIR=${FLIST_DIR=:-"$HOME/flist"}
_flist_list_files() {
ls $FLIST_DIR | sed 's/\..*//'
}
_flist() {
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=()
[[ ${cur} != -* ]] \
&& COMPREPLY=($(compgen -W "$(_flist_list_files)" -- ${cur}))
}
complete -o bashdefault -o default -o nospace -F _flist flist 2>/dev/null \
|| complete -o default -o nospace -F _flist flist
ノート:
- 短くなる可能性もありますが、これは多かれ少なかれ、より長く複雑な補完のテンプレートです。(機能は良好です。)
- 実際の完了コマンド (
complete -o ...
) は、異なるバージョンの bash 間で動作するためのちょっとしたハックです。
- 「.」がある場合、接尾辞の削除は単純化されすぎています。ファイル名に含まれており、読者の演習として残されています:-)これを行うには複数の方法があります(sed、awkなど)。最良の方法は bash-isms (
base=${filename%.*}
) を使用することですが、おそらく最も簡単なのは、ファイル名の形式に関するいくつかの仮定を使用した単純な sed です。