ZSH:如何禁用 `make` 的默认自动补全?

3

我为make命令编写了自动完成函数,并将其放置在~/.zsh中:

function __comp_make {
    # ... function body ....
}
compctl -K __comp_make make

很遗憾,它不会起作用,因为make的完成已经在定义中了。
/usr/share/zsh/functions/Completion/Unix/_make

显然,它比我的规则优先级高。

我不得不将_make重命名为unused_make,以便在zsh初始化时不加载它。虽然它可以工作,但这是一个相当丑陋的解决方案。

我的问题是:如何设置自己的完成规则,使其优先于已加载的默认规则?

相关:

编辑:

  • zsh 4.3.17
1个回答

4

您需要设置您的fpath。请参见这里

在您的~/.zshrc中,应该添加以下内容:

fpath=( ~/.zshfunctions $fpath )

如果您的~/.zshfunctions文件夹包含您的自定义补全文件,则应该解决此问题。请注意,您的函数会在系统函数之前加载。以下做法不可行

fpath=( $fpath ~/.zshfunctions ) 

作为旁注,您正在使用compctl。这是老的。我建议使用compsys代替,尽管目前我无法找到一个解释为什么的好链接。
这些内容详细介绍了编写完成函数的细节,包括fpath。您可能会发现它们对参考很有用。

我将它添加到了.zshrc文件中,并将我的函数移动到了.zshfunctions文件中,但是它没有起作用。它好像根本没有被定义过一样。 - Jakub M.
@JakubM。这样不好。当我这样做时,我可以覆盖命令的默认选项卡完成(选项卡完成为空)。如果我遵循 此处,使用 #compdef make 而不是 #compdef hello,那么在 make<tab> 上会获得自定义完成。如果您没有出现这种情况,建议检查:echo $fpath,并检查完成函数的内容。我不确定如何进行 compctl 完成——也许我错过了什么内容。 - simont
1
好的,按照博客文章中的所有指示操作之后,它可以正常运行。显然这是正确的方法,应该忘记 compctl - Jakub M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接