Bashオートコンプリートとフィルタモードを同時に使用するには?

Bashオートコンプリートとフィルタモードを同時に使用するには?

コマンドは正しくオートコンプリートしますが、bashたとえば、findなどgit、特定のファイルパターンが完了するのを防ぐためにフィルタを使用するとすぐにエラーが発生するようです。例:

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

*.cmi上記は、オートコンプリート機能が一致する*.cmoファイル名を選択しないようにする必要がありますgit。これは期待どおりに機能します。残念ながら、これはgitコマンドとフラグの自動補完も中断します。完成ファイルのロード順序と上記の定義を変更することは重要ではないようです。

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

答え1

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

幸いなことに、2.7-kLoC gitコンプリートスクリプトはgit addこれらのパターンを.gitignore

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

gitの無視リストにファイルを追加せずに完了からファイルを除外するには、git addgitコンプリートスクリプトを詳しく見てください。_git_addwhich__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]パターンが現在のディレクトリで拡張されるため機能しません)。

関連情報