1

teamocilの bash オートコンプリートを定義しようとしています。入力すると、ファイル拡張子のないteamocil <tab>フォルダー内のファイル名で完了する必要があります~/.teamocil/。ウェブサイトに例がありzshます:

compctl -g '~/.teamocil/*(:t:r)' teamocil

でこれをどのように使用できbashますか?

編集: michael_n の回答の影響を受けて、ワンライナーを思いつきました:

complete -W "$(teamocil --list)" teamocil
4

2 に答える 2

1

これは、私が持っている別の補完スクリプトの一般化されたバージョンで、同様のことを行います。これは、コマンドを完了するために 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 です。
于 2012-09-19T03:45:41.713 に答える
0

Bash は同様のアイデアを別の方法で実装しているため、zsh のコマンドとファイルは bash では機能しません。ただし、オートコンプリートの独自のルールを作成することもできます。より詳しい情報:

于 2012-09-17T20:38:16.103 に答える