readline
— GNU readline 接口¶
readline
模块定义了一些函数,以方便从 Python 解释器进行补全和读/写历史记录文件。此模块可以直接使用,也可以通过 rlcompleter
模块使用,该模块支持在交互式提示符下补全 Python 标识符。使用此模块进行的设置会影响解释器的交互式提示符和内置的 input()
函数提供的提示符的行为。
Readline 键绑定可以通过初始化文件配置,通常是您主目录中的 .inputrc
。 有关该文件的格式和允许的结构,以及 Readline 库的总体功能,请参阅 GNU Readline 手册中的 Readline 初始化文件。
可用性:非 Android、非 iOS、非 WASI。
此模块在移动平台或WebAssembly 平台上不受支持。
注意
底层 Readline 库 API 可能由 editline
(libedit
) 库而不是 GNU readline 实现。在 macOS 上,readline
模块在运行时检测正在使用的库。
editline
的配置文件与 GNU readline 的配置文件不同。如果您以编程方式加载配置字符串,则可以使用 backend
来确定正在使用的库。
如果您在 macOS 上使用 editline
/libedit
readline 仿真,则位于您主目录中的初始化文件名为 .editrc
。 例如,~/.editrc
中的以下内容将启用 *vi* 键绑定和 TAB 补全
python:bind -v
python:bind ^I rl_complete
另请注意,不同的库可能会使用不同的历史记录文件格式。 当切换底层库时,现有的历史记录文件可能变得不可用。
- readline.backend¶
正在使用的底层 Readline 库的名称,可以是
"readline"
或"editline"
。3.13 版本中新增。
初始化文件¶
以下函数与初始化文件和用户配置有关
- readline.parse_and_bind(string)¶
执行 string 参数中提供的初始化行。这会调用底层库中的
rl_parse_and_bind()
。
- readline.read_init_file([filename])¶
执行 readline 初始化文件。 默认文件名为上次使用的文件名。这会调用底层库中的
rl_read_init_file()
。
行缓冲区¶
以下函数对行缓冲区进行操作
- readline.get_line_buffer()¶
返回行缓冲区的当前内容(底层库中的
rl_line_buffer
)。
- readline.insert_text(string)¶
将文本插入到光标位置的行缓冲区中。这会调用底层库中的
rl_insert_text()
,但会忽略返回值。
- readline.redisplay()¶
更改屏幕上显示的内容,以反映行缓冲区的当前内容。这会调用底层库中的
rl_redisplay()
。
历史记录文件¶
以下函数对历史记录文件进行操作
- readline.read_history_file([filename])¶
加载 readline 历史记录文件,并将其附加到历史记录列表。默认文件名为
~/.history
。这会调用底层库中的read_history()
。
- readline.write_history_file([filename])¶
将历史记录列表保存到 readline 历史记录文件,覆盖任何现有文件。 默认文件名为
~/.history
。这会调用底层库中的write_history()
。
- readline.append_history_file(nelements[, filename])¶
将最后 nelements 个历史记录项附加到文件。 默认文件名为
~/.history
。该文件必须已存在。 这会调用底层库中的append_history()
。仅当 Python 是为支持它的库版本编译时,此函数才存在。3.5 版本中新增。
- readline.get_history_length()¶
- readline.set_history_length(length)¶
设置或返回要保存在历史文件中的所需行数。
write_history_file()
函数使用此值通过调用底层库中的history_truncate_file()
来截断历史文件。负值表示历史文件大小不受限制。
历史记录列表¶
以下函数操作全局历史记录列表
- readline.clear_history()¶
清除当前历史记录。这将调用底层库中的
clear_history()
。只有在 Python 为支持该函数的库版本编译时,此 Python 函数才存在。
- readline.get_current_history_length()¶
返回当前历史记录中的项目数。(这与
get_history_length()
不同,后者返回将写入历史文件的最大行数。)
- readline.get_history_item(index)¶
返回位于 index 的历史记录项的当前内容。项目索引从一开始。这将调用底层库中的
history_get()
。
- readline.remove_history_item(pos)¶
从历史记录中删除由其位置指定的历史记录项。位置从零开始。这将调用底层库中的
remove_history()
。
- readline.replace_history_item(pos, line)¶
用 line 替换由其位置指定的历史记录项。位置从零开始。这将调用底层库中的
replace_history_entry()
。
- readline.add_history(line)¶
将 line 追加到历史缓冲区,就像它是键入的最后一行一样。这将调用底层库中的
add_history()
。
- readline.set_auto_history(enabled)¶
启用或禁用在通过 readline 读取输入时自动调用
add_history()
。enabled 参数应该是一个布尔值,当为 true 时启用自动历史记录,当为 false 时禁用自动历史记录。在 3.6 版本中添加。
CPython 实现细节: 默认情况下启用自动历史记录,并且对此的更改不会在多个会话中持续存在。
启动钩子¶
- readline.set_startup_hook([function])¶
设置或删除由底层库的
rl_startup_hook
回调调用的函数。如果指定了 function,它将用作新的钩子函数;如果省略或None
,则会删除任何已安装的函数。钩子在 readline 打印第一个提示符之前被调用,不带任何参数。
- readline.set_pre_input_hook([function])¶
设置或删除由底层库的
rl_pre_input_hook
回调调用的函数。如果指定了 function,它将用作新的钩子函数;如果省略或None
,则会删除任何已安装的函数。钩子在打印第一个提示符之后,在 readline 开始读取输入字符之前被调用,不带任何参数。仅当 Python 为支持该函数的库版本编译时,此函数才存在。
补全¶
以下函数与实现自定义单词补全功能有关。这通常由 Tab 键操作,可以建议并自动补全正在键入的单词。默认情况下,Readline 设置为由 rlcompleter
使用,以补全交互式解释器的 Python 标识符。如果要将 readline
模块与自定义补全器一起使用,则应设置不同的单词分隔符。
- readline.set_completer([function])¶
设置或删除补全器函数。如果指定了 function,它将用作新的补全器函数;如果省略或
None
,则会删除任何已安装的补全器函数。补全器函数以function(text, state)
的形式调用,对于 state in0
,1
,2
, ..., 直到它返回一个非字符串值。它应返回以 text 开头的下一个可能的补全。已安装的补全器函数由传递给底层库中
rl_completion_matches()
的 entry_func 回调调用。text 字符串来自底层库的rl_attempted_completion_function
回调的第一个参数。
- readline.get_completer()¶
获取补全器函数,如果未设置补全器函数,则返回
None
。
- readline.get_completion_type()¶
获取正在尝试的补全类型。这会将底层库中的
rl_completion_type
变量作为整数返回。
- readline.get_begidx()¶
- readline.get_endidx()¶
获取补全范围的起始或结束索引。这些索引是传递给底层库的
rl_attempted_completion_function
回调的 start 和 end 参数。在相同的输入编辑场景中,这些值可能会因底层 C readline 实现而异。例如:已知 libedit 的行为与 libreadline 不同。
- readline.set_completer_delims(string)¶
- readline.get_completer_delims()¶
设置或获取用于补全的单词分隔符。这些分隔符决定了用于补全的单词的起始位置(即补全范围)。这些函数访问底层库中的
rl_completer_word_break_characters
变量。
- readline.set_completion_display_matches_hook([function])¶
设置或移除补全显示函数。如果指定了 function,它将被用作新的补全显示函数;如果省略或为
None
,则将移除任何已安装的补全显示函数。这会设置或清除底层库中的rl_completion_display_matches_hook
回调。每次需要显示补全时,都会调用补全显示函数,调用形式为function(substitution, [matches], longest_match_length)
。
示例¶
以下示例演示了如何使用 readline
模块的历史记录读取和写入功能,从用户的 home 目录自动加载和保存名为 .python_history
的历史记录文件。下面的代码通常会在交互式会话期间从用户的 PYTHONSTARTUP
文件中自动执行。
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
实际上,当 Python 在 交互模式 下运行时,此代码会自动运行(请参阅 Readline 配置)。
以下示例实现了相同的目标,但通过仅追加新历史记录来支持并发的交互式会话。
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
def save(prev_h_len, histfile):
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
以下示例扩展了 code.InteractiveConsole
类以支持历史记录保存/恢复。
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
histfile=os.path.expanduser("~/.console-history")):
code.InteractiveConsole.__init__(self, locals, filename)
self.init_history(histfile)
def init_history(self, histfile):
readline.parse_and_bind("tab: complete")
if hasattr(readline, "read_history_file"):
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
atexit.register(self.save_history, histfile)
def save_history(self, histfile):
readline.set_history_length(1000)
readline.write_history_file(histfile)