
私の は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]
パターンが現在のディレクトリで展開されるため機能しません)。