【问题标题】:Can bash completion be invoked programmatically?可以以编程方式调用 bash 完成吗?
【发布时间】:2011-07-15 21:34:46
【问题描述】:

我想要的是一个我可以从程序中调用的函数,以便它完成 bash 给出命令行和按下 TAB 的位置的方式。

. /etc/bash_completion
generate_completions "command arg1 arg2" 17

将返回与

相同的内容
command arg1 arg2[TAB]

我还没有看到任何方法来做到这一点。

【问题讨论】:

  • 也许你可以以某种方式连接到 compgen?例如compgen -c diff 为“diff”每行打印一个完整的命令名称...
  • 从这些链接开始1st2nd
  • 我不这么认为。如果不更改 bash 中的代码,您将无法做到这一点。
  • @Fredrik:如果我正确理解了这个问题,这在这里并没有真正的帮助。我们不想自定义完成,但我们希望在没有用户调用 tab 的情况下执行完成。
  • @jpkotta 你可以——我不得不这样做几次。

标签: bash api bash-completion


【解决方案1】:

实际上,我必须这样做才能弄清楚 apt-get 自动完成功能在 ubuntu 上的工作原理(构建了我自己的伪存储库工具:)

这是一个多步骤的过程:

首先,complete -p 将以一组命令的形式为您提供所有完成的列表,您可以运行这些命令来复制配置。例如,假设您想查找apt-get 的自动完成功能。那么:

$ complete -p | grep apt-get
complete -F _apt_get apt-get

这告诉你shell函数_apt_get被完成机制调用。

您需要重新创建函数使用的特殊变量,即 COMP_LINE(整行)、COMP_WORDS(所有参数的 bash 数组——基本上拆分 COMP_LINE)、COMP_CWORD(索引,应指向最后一个值) ,COMP_POINT(在单词中您正在执行自动完成的位置)和 COMP_TYPE(这是您告诉它您想要完成的方式,就像您点击标签一样)。

注意:阅读手册页以获取更多信息——这就是我一开始就想出来的。 man bash

【讨论】:

  • 这显示了如何处理调用函数的完成,但还有许多其他可能性(例如 complete 的 -o 和 -A 选项)。除了文件名之外,这确实可以处理大多数情况,这很容易。
  • 截至 2015 年 11 月,这不会显示使用 complete -F 的补全。例如 xrdb 的定义看起来像 complete -F _xrdb xrdb ,但 complete -p | grep xrdb 什么也不返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多