Python实现Tab自动补全和历史命令管理的方法

演示代码可以在这里找到:https://github.com/neal1991/articles/blob/master/python-tab-auto-completion/autocompletion.py,接下来的讲解将以这份代码为例子。

什么是Tab自动补全和历史命令管理

在命令行中,我们经常需要输入很长的命令,会出现拼写错误、错误的命令、或者常见的命令不够智能的情况。Tab自动补全和历史命令管理正是这些问题的解决方案。

Tab自动补全: 在输入命令时可以利用Tab键,来自动补全命令。当输入的文字只有一个可能性,或者系统能够解决同名问题的时候,就能够自动匹配。如果有多个匹配,则可以通过多敲几个字母来缩小范围。

历史命令管理: 在输入命令时,我们经常需要输入之前输入过的某个命令。此时,如果可以通过上下箭头选择之前的命令,那么就可以省去不少的重复输入。

Python实现Tab自动补全和历史命令管理的方法

实现Tab自动补全和历史命令管理的方法便是通过输入的字符来快速查询匹配的命令传递给控制台。

通过读取控制台输入,来实现Tab自动补全

在Python中通过使用readline库,我们可以监控控制台的输入流。我们可以找到当前输入流中的最后一个字符,然后将标记位移到最后一个字符后,以使进行自动补全,如下所示:

line_buffer = readline.get_line_buffer()
line_buffer += " "

if re.search(r"^\s*ls\s*$", line_buffer):
    line_buffer = "ls --color=auto"

line_buffer = re.sub("\\\s", " ", line_buffer)
start_index = readline.get_begidx()
end_index = readline.get_endidx()

word_part = line_buffer[start_index:end_index]
match_list = [item for item in self._match_list if item.startswith(word_part)]

在上面的代码中,我们首先使用readline.get_line_buffer() 读取当前控制台输入的内容,在行尾加上一个空格,然后把正则表达式作用在当前输入字符的内容上。如果匹配到的是ls命令,我们加上--color=auto 参数,即着色显示文件目录。如果你习惯使用ls显示目录,这段代码加上这个判断非常方便。在处理好输入字符后,我们读取了当前输入字符的起始位置和结束位置,以确定我们需要自动补全的字符。在此之后,我们就可以对历史命令进行查找,如上代码所示,以便找到所有匹配的命令,这些命令也是我们需要展示在控制台供用户选择的命令。

readline.parse_and_bind("tab: complete")
readline.set_completer_delims(" \t\n()\"\'")
readline.set_completer(self.match)

在这段代码中,我们首先为Tab键绑定了自动完成操作。接下来我们为自动完成操作设置了分隔符,如下所示:

readline.set_completer_delims(" \t\n()\"\'")

在上面的代码中,我们设置了Tab、空格、换行、括号以及引号都是输入的分隔符。

接下来,我们将一个函数作为自动完成函数传递给readline.set_completer方法。在这个函数中,我们根据当前输入的东西和历史匹配的命令过滤出要展示在控制台上供用户选择的命令。由于使用Tab自动完成的目的是找到历史命令。因此我们方法的内容需要看下面的历史命令管理部分。

通过读取控制台输入来实现历史命令管理

在Python中,我们的历史命令管理主要通过readline模块实现。

为了使用历史命令管理,我们可以使用readline库中的readline方法获取当前行的内容,以便在用户按上下箭头时,将当前行中的内容载入下一个或上一个命令。接下来,我们可以读取历史命令列表,从而遍历在用户在控制台中输入过的历史记录。最常见的历史管理方法有两种:

第一种方法是使用readline模块中的readline.get_history_length() 方法来获取历史记录列表的长度,之后调用readline.get_history_item(index) 方法来读取我们需要的记录,并返回一个字符串。字符串最后附有一个代表每个选项的索引,如下所示:

index = readline.get_current_history_length() - 1
state = readline.get_history_item(index + 1)
print('%s - %s' % (index, state))

在上面的代码中,我们读取历史记录列表的长度以及读取了历史记录列表中的第一个匹配项。注意到,我们的索引从0开始,但readline.get_current_history_length() 返回的数据却是从1开始计算的,所以我们需要使用index + 1 来读取正确的偏移量。

第二种方法是使用readline模块中的readline.get_history_item(-n) 方法来获取历史记录列表中的最后n项,值为负数。当值为-1时,我们取到的是最后一项。这是因为负数表示取本身以及向前的项数,而不是从前向后的项数。

for index in range(max(self._history_list, None, item for item in 0, length):
    line_buffer += self._history_list[index]

在这段代码中,我们首先定义了一个使用for循环从0到历史记录列表长度的循环,以便读取历史记录列表的所有项,并将其保存在当前命令的单元中。

总结

自动补全能够快速让用户在控制台中找到他们想要的命令,因此是命令行工具开发中不可缺少的一部分。通过使用readline库,Python实现了自动匹配并显示历史命令,并为使用者提供了极大的方便。此外,上述的代码实现,也可以应用到其他的开发领域中,如网站开发、Python编程、以及命令从新编写等上。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现Tab自动补全和历史命令管理的方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python实现一行输入多个值和一行输出多个值的例子

    下面我来为你详细讲解Python实现一行输入多个值和一行输出多个值的例子的完整攻略。 一行输入多个值 使用split()方法 在Python中,我们可以使用input()函数进行控制台输入操作。对于一行输入多个值的情况,我们可以使用split()方法将一行输入的值拆分成一个列表。 例如,输入一行以逗号分隔的多个数值,我们可以使用以下代码实现: # 输入一行以…

    python 2023年6月5日
    00
  • 使用Python导出Excel图表以及导出为图片的方法

    我来为您讲解一下使用Python导出Excel图表以及导出为图片的方法。 环境准备 在使用Python进行Excel操作之前,需要确保您的电脑已经安装了以下两个库: openpyxl:用于读取和写入Excel文件。 matplotlib:用于处理和绘制图表。 您可以使用以下命令来安装这两个库: pip install openpyxl matplotlib …

    python 2023年5月13日
    00
  • Python中将字典转换为列表的方法

    Python中将字典转换为列表的方法 在Python中,我们可以使用多种方法将字典转换为列表。本文将介绍其中的三种方法,包括使用列表推导式、使用dict.items()方法和使用zip()函数。 方法一:使用列表推导式 使用列表推导式是将字典转换为列表的一种简单方法。以下是示例代码: my_dict = {"a": 1, "b&…

    python 2023年5月13日
    00
  • Python列表(list)、字典(dict)、字符串(string)基本操作小结

    以下是详细讲解“Python列表(list)、字典(dict)、字符串(string)基本操作小结”的完整攻略。 在Python中,列表、字典和字符串是三种常用的数据类型。本文将介绍这三种数据基本操作,包括创建、访问、添加和删除元素、切片、排序等。 列表(list)的基本操作 创建列表 在Python中,可以使用方括号[]或list()函数来创建一个列表。例…

    python 2023年5月13日
    00
  • python全面解析接口返回数据

    为了完整地讲解“Python全面解析接口返回数据”的攻略,我们需要按照以下步骤进行: 步骤一:确定请求接口 在访问某个接口之前,我们需要确定自己想要请求获取的数据和接口所需的参数,这些参数在访问接口时需要进行传递。我们可以使用Python中的requests库来向服务器发送HTTP请求。 import requests params = { ‘param1’…

    python 2023年6月3日
    00
  • 如何在Python中删除PostgreSQL数据库中的数据?

    以下是在Python中删除PostgreSQL数据库中的数据的完整使用攻略。 使用PostgreSQL数据库的前提条件 在使用Python连接PostgreSQL数据库之前,确保已经安装了PostgreSQL数据库,并已经创建使用数据库和表,同时需要安装Python的动程序,例如psycopg2。 步骤1:导入模块 在Python中使用psycopg2模块连…

    python 2023年5月12日
    00
  • Python正则表达式总结分享

    Python正则表达式总结分享 正则表达式是一种用于描述字符串模式的语言,它可以用于匹配、查找、替换和割字符串。Python中的re模块供了对正则表达式的支持,可以方便地进行字符串的处理。本文将详细讲解Python中正则表达式的语法和re模块的常用函数以及两个示例说明。 正则表达式语法 正则表达式由一些特殊字符和普通字符组成,用于字符串模式。下面是一些常用的…

    python 2023年5月14日
    00
  • Python中使用threading.Event协调线程的运行详解

    Python中使用threading.Event协调线程的运行详解 简介 在并发编程中,有时需要用到用于同步或通知的机制。Event 的作用就是在不同的线程间协调运行。 Event 是 threading 模块中提供的一个线程同步基元(synchronization primitive),基于线程间状态的信号通信机制,能够一直等待某个条件的发生,直到 set…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部