【问题标题】:How is tab completion implemented for linux commands?如何为 linux 命令实现制表符补全?
【发布时间】:2012-03-06 09:44:07
【问题描述】:

我注意到有时命令可以用 Tab 完成。

例如xen 中的 xm 命令。

你输入 xm[space][tab] 它会打印出有效的选项 分别是:

addlabel        destroy         info            network-attach  resume          sysrq           vnet-delete
block-attach    dmesg           labels          network-detach  rmlabel         top             vnet-list
block-detach    domid           list            network-list    save            trigger         vtpm-list
block-list      domname         loadpolicy      new             sched-credit    unpause         
cfgbootpolicy   dry-run         log             pause           sched-sedf      uptime          
console         dump-core       makepolicy      reboot          serve           vcpu-list       
create          dumppolicy      mem-max         rename          shutdown        vcpu-pin        
debug-keys      getlabel        mem-set         resources       start           vcpu-set        
delete          help            migrate         restore         suspend         vnet-create 

这很漂亮!

如何在 Linux 中实现自己的 tab 命令补全?

【问题讨论】:

  • 这是由 shell 完成的。你问的是什么壳? (我猜是 bash,因为它现在在大多数发行版中都是默认的。)
  • 是的 bash,我现在用 bash 标记了我的问题。它是某种包装脚本吗?
  • 看起来像 stackoverflow.com/questions/5570795/… 的复制品
  • 谢谢@Corey Farwell,我没有意识到它是 bash 的一部分,所以您链接到的另一个问题为我提供了答案。

标签: linux bash command-line


【解决方案1】:

这是一个相当广泛的问题,但一般的想法是您使用 compgencomplete 内置函数注册一些东西。他们是both documented in the manual。上一节记录了programmable completion 的一般主题,介绍了如何处理完成尝试。

有关大量示例,请参阅/etc/bash_completion,它提供了 bash 附带的所有默认补全(除了文件名补全等完全内置的东西)。有关更多示例,请参阅/etc/bash_completion.d 中的任何内容;这些是由/etc/bash_completion 自动获取的,作为扩展默认补全的一种方式。

【讨论】:

    【解决方案2】:

    bash 的智能补全由一系列脚本化的 bash 函数处理。在 Debian,可能是 Ubuntu,也可能是其他 Linux 发行版上,您可以在 /etc/bash_completion.d 中找到您系统的安装完成。

    关于这个机制的官方文档在http://www.gnu.org/software/bash/manual/bash.html#Programmable-Completion

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 当您的一半答案是指向另一个问题的链接时,这通常表明您应该投票以重复关闭,而不是发布答案。 (如果您觉得第二个链接有帮助,您可以在该问题的某处提供它。)
      • @Jefromi 足够公平 - 我认为它们不一样,因为另一个问题不包含实际完成完成的请求,只是它是如何工作的部分。第二个链接我认为是指第二部分。
      • 是的,它不是一个精确的重复,但我认为它已经足够接近了;它为您指明了正确的方向,特别是考虑到答案提到 /etc/bash_completion,您可以在其中找到无数示例。如果您想为其他问题添加答案,更多地关注实现实际完成的东西,我认为这很有价值。
      • @Jefromi 你说服了我! :)
      【解决方案4】:

      bash 的情况下,这是通过使用GNU Readline library 通过shell 完成的

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 2012-06-09
        • 2023-03-11
        相关资源
        最近更新 更多