如何同时使用 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]不起作用,因为模式将在当前目录中扩展)。

相关内容