如何同時使用 bash 自動完成功能和過濾模式?

如何同時使用 bash 自動完成功能和過濾模式?

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_filewhich 呼叫__git_index_files來產生候選檔案列表,然後它依次使用從 一路向下傳遞的選項呼叫__git_ls_files_helperwhich 呼叫。所以你可以改變git ls-files_git_add_git_add

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

新增一些選項,例如--exclude=*.cm[aiox](注意引用問題:通配符最終會拼接到命令中,因此-x *.cm[aiox]不起作用,因為模式將在目前目錄中擴展)。

相關內容