python pyreadline补全进阶 #多字段补全
先看一个实例
在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键来触发自动补全
# 获取用户输入
while True:
user_input = input("myshell>: ")
# print(f"You entered: {user_input}")
if user_input=="q":
break
在这个示例中,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
效果截图: