python pyreadline补全进阶 #多字段补全

发布时间 2023-11-21 19:49:04作者: 学不会xuebuhui

先看一个实例

在Python的readline模块中,readline.set_completer() 函数用于设置一个自动补全函数(completer)来为用户提供命令行输入的自动补全功能。

completer函数接受一个文本输入作为参数,并返回一个包含可能的自动补全选项的列表。当用户在命令行中输入时,readline模块会调用这个completer函数来获取可能的自动补全选项,从而帮助用户进行输入。

下面是一个简单的示例,展示了如何定义一个completer函数并将其传递给readline.set_completer()

import readline

# 定义一个简单的自动补全函数
def my_completer(text, state):
    options = ['apple', 'banana', 'cherry', 'date']  # 可能的自动补全选项
    matches = [option for option in options if option.startswith(text)]  # 找到以输入文本开头的选项
    if state < len(matches):  # 返回匹配的选项
        return matches[state]
    else:
        return None

# 将自动补全函数设置为默认的自动补全器
readline.set_completer(my_completer)
readline.parse_and_bind('tab: complete')  # 绑定Tab键来触发自动补全

在这个示例中,my_completer 函数接受用户输入的文本和当前的状态作为参数,并返回可能的自动补全选项。然后,我们使用 readline.set_completer() 将这个自动补全函数设置为默认的自动补全器。

当用户在命令行中输入时,Tab键将会触发自动补全功能,并调用my_completer函数来获取可能的自动补全选项。

实测:(亲测可行)

import readline
# import rlcompleter

# 定义可能的命令和参数
commands = {
    'command1': ['option1', 'option2', 'option3'],
    'command2': ['option4', 'option5', 'option6'],
    'command3': ['option7', 'option8', 'option9'],
}
commands3=["show","get","know"]


# 定义补全函数
def completer(text, state):
    # 这里只能用get_line_buffer,可以获得所有输入过的指令 用空格分割
    buffer = readline.get_line_buffer().split(" ")
    # buffer = text.split(" ")  ## text表示当前正在输入的字符
    # print("buffer:",buffer)
    if len(buffer) <=1:
        return [cmd for cmd in commands.keys() if cmd.startswith(text)][state]    ##先拿第一层键
    elif len(buffer)==2:
        return [cmd for cmd in commands[buffer[0]] if cmd.startswith(text)][state] ## 第二层拿值
    elif len(buffer)==3:
        return [cmd for cmd in commands3 if cmd.startswith(text)][state]   ##state表示匹配状态 每次都要加
    else:
        return None

# 设置补全函数
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

# 获取用户输入
while True:
    user_input = input("myshell>: ")
    # print(f"You entered: {user_input}")
    if user_input=="q":
        break

效果截图:
image