Python 命令行界面中的 Tab 补全 - 如何捕获 Tab 事件
我正在用 Python 编写一个小 CLI(作为 Mercurial 的扩展),并且希望支持制表符补全。具体来说,我想在提示符中捕获选项卡并显示匹配选项的列表(就像 bash 一样)。
示例:输入部分名称:
ext*TAB*
extensions
extras
问题是我不确定如何捕获 Tab 事件。我正在使用 Mercurial 的 ui.prompt()
API,它只是在底层调用 raw_input()
。
据我所知,raw_input()
仅在“输入”时返回,如果用户输入选项卡,则返回的字符串仅包含 "\t"
。
I'm writing a little CLI in Python (as an extension to Mercurial) and would like to support tab-completion. Specifically, I would like catch tabs in the prompt and show a list of matching options (just like bash).
Example: Enter section name:
ext*TAB*
extensions
extras
The problem is I'm not sure how to catch the Tab events. I'm using the ui.prompt()
API of Mercurial, which is just calling raw_input()
under the hood.
As far as I know, raw_input()
only returns on 'enter' and if a user enters a tab, the string returned simply includes a "\t"
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为此,您可以使用
readline
模块。我能想到的最简单的代码:
示例用法:
除了补全之外,
readline
还为您提供:For that you use the
readline
module.Simplest code I can think:
Example usage:
Besides completion,
readline
provides you with:您几乎肯定应该使用 cmd 模块,它已经实现了制表符补全等功能,以及可能您想要做的其他部分,使用 readline 模块等等。重新发明轮子是没有意义的。
You should almost certainly be using the cmd module, which already implements tab completion and so on, and probably other parts of what you're trying to do, using the readline module and so on. There's no point reinventing the wheel.
一个很好的例子,展示了如何与 readline 配合进行制表符补全在标准库中作为 rlcompleter 模块提供 - 您不能将其用作-is(它根据当前在 Python 的 main 和builtin 中定义的名称完成),但它显示了如何执行一般任务以及如何将其连接到 readline。
An excellent example of how to do tab-completion in cooperation with readline is supplied in the standard library as the rlcompleter module — you can't use it as-is (it completes based on names currently defined in the Python's main and builtin), but it shows how to do the general task and how to hook it up to
readline
.