bash のオートコンプリート機能とフィルターパターンを一緒に使用するにはどうすればよいですか?

bash のオートコンプリート機能とフィルターパターンを一緒に使用するにはどうすればよいですか?

私の はbashコマンドを正しく自動補完しますが (例find: git、 など)、フィルターを使用して特定のファイル パターンの補完を防ぐとすぐに機能しなくなるようです。例:

complete -f -X '*.@(cmi|cmo)' git

*.cmi上記により、 およびに一致するファイル名が自動補完によって選択されなくなり*.cmoますgit。これは確かに意図したとおりに機能します。残念ながら、これによりgitコマンドとフラグの自動補完も機能しなくなります。補完ファイルの読み込み順序と上記の定義を入れ替えても問題ないようです。

両方の機能を連携させる方法について何かアイデアはありますか?

答え1

gitコマンドの構文を理解する外部補完関数を呼び出す代わりに、組み込みのファイル補完メカニズムを使用するように bash に指示しました。git補完メカニズムは 1 つだけで、一連のフィルターはありません。一連のフィルターが必要な場合は、それをコード化する必要があります。

幸いなことに、2.7-kLoC git 補完スクリプトは、git add自然な方法で からのパターンの除外をサポートしています。これらのパターンを に追加します.gitignore

printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore

gitの無視リストに追加せずに補完からファイルを除外したい場合はgit add、git補完スクリプトを詳しく調べる必要があると思います。_git_add__git_complete_index_fileを呼び出して__git_index_files候補ファイルのリストを生成し、次にから渡されたオプションを使用して__git_ls_files_helperを呼び出します。したがって、を次のように変更できます。git ls-files_git_add_git_add

    __git_complete_index_file "--others --modified --directory --no-empty-directory"

次のようなオプションを追加します--exclude=*.cm[aiox](引用符の問題に注意してください。ワイルドカードは最終的にコマンドに結合されるため、-x *.cm[aiox]パターンが現在のディレクトリで展開されるため機能しません)。

関連情報