Python 命令行界面中的 Tab 补全 - 如何捕获 Tab 事件
-
20-09-2019 - |
题
我正在用 Python 编写一个小 CLI(作为 Mercurial 的扩展),并且希望支持制表符补全。具体来说,我想在提示符中捕获选项卡并显示匹配选项的列表(就像 bash 一样)。
例子:输入部分名称:
ext*TAB*
extensions
extras
问题是我不确定如何捕获 Tab 事件。我正在使用 ui.prompt()
Mercurial的API,只是调用 raw_input()
在引擎盖下。
据我所知, raw_input()
仅在“输入”时返回,如果用户输入选项卡,则返回的字符串仅包含 "\t"
.
解决方案
为此,您使用 readline
模块。
我能想到的最简单的代码:
import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
'email', 'foobar', 'foo']
def complete(text, state):
for cmd in COMMANDS:
if cmd.startswith(text):
if not state:
return cmd
else:
state -= 1
readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')
用法示例:
Enter section name: <tab>
email errors extension extra foo foobar stuff
Enter section name: e<tab>
email errors extension extra
Enter section name: ext<tab>
extension extra
除了完成, readline
为您提供:
- 行编辑
- 键绑定配置(包括 emacs 和 vi 模式)
- 历史记录(向上箭头可调用以前的值)
- 历史搜索、保存和加载
其他提示
如何执行标签完成与 readline的<合作一个极好的例子/ A>在标准库作为 rlcompleter 模块被供给 - 你不能用它作为-IS(它完成基于目前在Python的主要和内置定义名称),但它显示了怎么办总任务,以及如何把它挂到readline
。
您应该几乎肯定要使用的 CMD模块,该已经实现tab完成等等,你正在试图做什么,使用readline的模块等等,可能其他地方。没有点重新发明轮子。
不隶属于 StackOverflow