The LLVM Project Blog

LLVM 项目新闻和来自实战的细节

Clang ♥ bash -- bash 的自动补全功能即将到来



编译器是复杂的软件,拥有大量命令行选项来微调参数。Clang 也不例外:它有 447 个命令行选项。几乎不可能记住所有这些选项及其正确的拼写,这就是 shell 补全非常有用的地方。当你输入标志的前几个字符并按下 Tab 键时,它会自动完成剩下的部分。

背景
然而,这样的自动补全功能尚不可用,因为没有简单的方法可以获取 Clang 支持的所有选项的完整列表。例如,bash 没有对 Clang 的自动补全支持,尽管一些 shell(如 zsh)有用于命令行自动补全的脚本,但它们使用硬编码的命令行选项列表,并且在 Clang 添加新选项时不会自动更新。这些 shell 也无法自动补全某些标志接受的参数(例如 -std=[tab])。


这是我们在今年的 Google Summer of Code 中努力解决的问题。我们正在向 Clang 添加一项功能,以便我们可以实现完整的、精确的命令行选项补全,该补全功能对于任何 shell 来说都是高度可移植的。首先,我们将提供一个针对 bash 的补全脚本,该脚本使用此功能。

实现
Clang 现在有一个名为 --autocomplete 的新命令行选项。此标志接收来自 shell 的不完整的用户输入,然后查询当前 Clang 二进制文件的内部数据结构,并返回可能的补全列表。使用此 API,我们始终可以在任何更新版本的 Clang 上随时获取准确的选项和值列表。

我们在 bash 中构建了一个使用此功能的自动补全,作为第一个实现。你可以在 这里 找到它的源代码。此外,这里 是 Qt 文本输入自动补全的示例,用于说明如何从 UI 应用程序中使用此 API,如下所示:

final.gif

你可以始终一次完成一个标志。所以如果你想使用 API,你必须选择用户当前正在键入的标志。然后将此标志传递给选定 clang 二进制文件中的 --autocomplete 标志。所以在下面的例子中,所有以 `-tr` 开头的标志都会显示,它们后面的描述(以 Tab 键与标志分隔)。
API 还支持完成标志的值。如果你有一个支持值补全的标志,你也可以在标志后面用逗号分隔提供一个不完整的 value,以获取该 value 的补全。
如果你在逗号后面什么也不提供,将显示此标志的所有可能值的列表。

如何获取
此功能现已可用于 LLVM/clang 5.0,我们还将将其添加到标准 bash 补全包中。确保你的机器上有最新的 clang 版本,并执行 此脚本。如果要永久更改,只需从你的 .bashrc 中执行它,然后享受键入你的 clang 调用吧!