![如何同时使用 bash 自动完成功能和过滤模式?](https://linux22.com/image/95064/%E5%A6%82%E4%BD%95%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%20bash%20%E8%87%AA%E5%8A%A8%E5%AE%8C%E6%88%90%E5%8A%9F%E8%83%BD%E5%92%8C%E8%BF%87%E6%BB%A4%E6%A8%A1%E5%BC%8F%EF%BC%9F.png)
我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]
不起作用,因为模式将在当前目录中扩展)。