如何让我的程序使用制表符完成?

时间:2013-02-14 15:26:33

标签: python shell command-line-interface tab-completion

我注意到某些程序(例如hg)允许用户选项卡完成命令的特定部分。例如,如果在hg存储库工作目录中输入:

hg qpush --move b8<TAB>

它将尝试使用以“b8”开头的补丁队列中的任何mercurial补丁完成命令。

我想做的是在我的程序中模仿这种行为。也就是说,我有一系列依赖于某个目录中文件的命令,我希望能够在shell中提供制表符完成。是否有一个API在Ubuntu Linux上提供此功能(最好使用python,因为这是我的脚本编写的内容)?

4 个答案:

答案 0 :(得分:7)

为此,您需要为shell编写制表符完成模块。大多数Linux发行版中的默认shell是bash,因此您应该编写完成脚本(通常是shell脚本)。编写脚本后,将其添加到/etc/bash_completion.d/。这应该与您的程序一起分发(对于Linux发行版,包含在包中)。

Debian Administration已a guide for writing your completion scripts。要在Mac上使用完成功能,请参阅https://trac.macports.org/wiki/howto/bash-completion

有关完成文件的示例,请查看bash-completion project from Debian(也是on Github)。另请参阅https://unix.stackexchange.com/questions/4738/an-easy-bash-completion-tutorial

如果您使用zshhack.augusto linked to the documentation for writing completions

答案 1 :(得分:3)

这是readline模块的用途。

实际上,readline是一个常见的C库,因此它具有多种语言的绑定。我可以说,我玩得很开心。

享受B)

答案 2 :(得分:1)

你可能想尝试zsh shell,它有一个很好的完成系统,支持大量的应用程序。

完成系统是用shell语言编写的,但是如果你真的想使用python,你可以从完成函数内部运行解释器。如果您想为自己的软件编写完成,则需要进行一些阅读(例如user manualmanpage)。

答案 3 :(得分:1)

看一下Python库中'cmd'模块的来源。它支持命令完成。