【问题标题】:getting bash completion options programmatically以编程方式获取 bash 完成选项
【发布时间】:2014-11-05 14:32:03
【问题描述】:

我想要一个以编程方式从 bash 或 zsh 返回完成选项的函数。 stackoverflow 上有很多examples of related questions,但在任何地方都没有适当的通用答案。我不想知道如何为 bash 编写特定的完成函数。

我已经尝试通过阅读 debian /etc/completion shell 代码、将选项卡的控制代码回显到“bash -i”来实现这一点,甚至尝试使用与 python-pexpect 的自动子进程交互。每次我认为自己成功时,我都会发现一些小问题使整个解决方案无效。 我会接受任何语言的解决方案,但最好是 python。显然,确切的输入输出会因系统而异,但请看下面的示例 I/O:

  • function("git lo") 返回 ["log","lol","lola"]
  • function("apt-get inst") 返回 ["apt-get install"]
  • function("apt-get") 返回 []
  • function("apt-get ") 返回 ["apt-get autoclean","apt-get autoremove", ...]
  • 函数 ("./setup") 返回 ["./setup.py"]

如果您正在考虑用 shell 编写的解决方案,理想情况下我可以在没有“源代码”的情况下执行它。例如 bash "compgen" 命令看起来很有趣(尝试 "compgen -F _git"),但请注意 "bash -c 'compgen -F _git'" 不起作用,因为完成帮助程序 "_git" 不在范围内。

【问题讨论】:

  • bash 中,完成由readline 处理,我将从man bash 中的READLINE 部分开始,也许深入研究它的源代码... Ciao from跨度>

标签: python linux bash shell


【解决方案1】:

This gist 是迄今为止我最好的解决方案。它满足所有要求,适用于多个操作系统上的多个版本的 bash,但它需要一个子进程调用,而且它非常复杂以至于荒谬。 cmets 包括所有令人发指的吊索和箭头的完整文档。我仍然希望有一些更合理的东西出现,但除非它发生......就是这样!

【讨论】:

  • 我遇到了同样的问题。您的解决方案看起来很有趣。我想出的最好方法是打印制表符完成的结果,即如果“foo pi”可以完成为“pine”、“pineapple”和“pinecone”之一,那么它将在列表中返回这三个单词......我实际上想在其中看到“foo pine”,这就是当您点击选项卡时在 Bash shell 中会发生的情况。无论如何,如果它仍然有帮助,这里是参考:stackoverflow.com/a/9505024/1907765。你的解决方案有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多