
我bash
正確地自動完成命令(例如find
,,git
等),但是一旦我使用過濾器來阻止完成某些文件模式,這似乎就會中斷,例如:
complete -f -X '*.@(cmi|cmo)' git
上面的內容應該可以防止自動完成選擇*.cmi
與 和*.cmo
匹配的檔案名稱git
。這確實按預期工作。不幸的是,這也會破壞git
命令和標誌的自動完成。切換完成檔案的載入順序和上面的定義似乎並不重要。
關於如何使這兩個功能協同工作有什麼想法嗎?
答案1
您已指示 bash 使用 的內建檔案完成機制git
,而不是呼叫理解命令語法的外部完成函數git
。只有一個完成機制,而不是一系列過濾器。如果您想要一系列過濾器,則必須對其進行編碼。
幸運的是,2.7-kLoC git 補全腳本確實支援以git add
自然方式排除模式:將這些模式添加到.gitignore
.
printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore
如果您想從git add
完成中排除檔案而不將它們新增至 git 的忽略清單中,我認為您必須深入研究 git 完成腳本。_git_add
呼叫__git_complete_index_file
which 呼叫__git_index_files
來產生候選檔案列表,然後它依次使用從 一路向下傳遞的選項呼叫__git_ls_files_helper
which 呼叫。所以你可以改變git ls-files
_git_add
_git_add
__git_complete_index_file "--others --modified --directory --no-empty-directory"
新增一些選項,例如--exclude=*.cm[aiox]
(注意引用問題:通配符最終會拼接到命令中,因此-x *.cm[aiox]
不起作用,因為模式將在目前目錄中擴展)。