readline-GNU readline接口(16)Python语言(必读进阶学习教程)(参考资料)
该readline模块定义了许多函数,以便于从Python解释器完成和读取/写入历史文件。该模块可以直接使用,也可以通过rlcompleter
模块使用,该模块支持在交互式提示符下完成Python标识符。使用此模块进行的设置会影响解释器的交互式提示和内置input()
函数提供的提示的行为。
Readline键绑定可以通过初始化文件进行配置,通常 .inputrc
位于主目录中。有关 该文件的格式和允许的结构以及Readline库的功能的信息,请参阅GNU Readline手册中的Readline Init File。
注意
底层的Readline库API可以由libedit
库而不是GNU readline实现。在macOS上,readline
模块会检测运行时正在使用的库。
配置文件libedit
与GNU readline 的配置文件不同。如果以编程方式加载配置字符串,则可以检查文本“libedit” readline.__doc__
以区分GNU readline和libedit。
如果在macOS上使用editline / libedit
readline仿真,则会命名位于主目录中的初始化文件 .editrc
。例如,以下内容~/.editrc
将打开vi键绑定和TAB完成:
python:bind -v
python:bind ^I rl_complete
初始文件
以下功能与init文件和用户配置有关:
readline.
parse_and_bind
(字符串)- 执行字符串参数中提供的init行。这会调用
rl_parse_and_bind()
底层库。
readline.
read_init_file
([ 文件名] )- 执行readline初始化文件。默认文件名是最后使用的文件名。这会调用
rl_read_init_file()
底层库。
行缓冲
以下函数对行缓冲区进行操作:
readline.
get_line_buffer
()- 返回行缓冲区的当前内容(
rl_line_buffer
在底层库中)。
readline.
insert_text
(字符串)- 将文本插入光标位置的行缓冲区。这将调用
rl_insert_text()
底层库,但忽略返回值。
readline.
redisplay
()- 更改屏幕上显示的内容以反映行缓冲区的当前内容。这会调用
rl_redisplay()
底层库。
历史文件
以下函数对历史文件进行操作:
readline.
read_history_file
([ 文件名] )- 加载readline历史文件,并将其附加到历史列表中。默认文件名是
~/.history
。这会调用read_history()
底层库。
readline.
write_history_file
([ 文件名] )- 将历史记录列表保存到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
(长度)- 设置或返回所需的行数以保存在历史记录文件中。该
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
(索引)- 返回索引处历史项的当前内容。项目索引是基于一个的。这会调用
history_get()
底层库。
readline.
remove_history_item
(pos )- 从历史记录中删除其位置指定的历史记录项。该职位从零开始。这会调用
remove_history()
底层库。
readline.
replace_history_item
(pos,line )- 用线替换其位置指定的历史记录项。该职位从零开始。这会调用
replace_history_entry()
底层库。
readline.
add_history
(行)- 将行添加到历史记录缓冲区,就好像它是最后一行键入的一样。这会调用
add_history()
底层库。
readline.
set_auto_history
(启用)add_history()
通过readline读取输入时启用或禁用自动调用。该启用的参数应该是一个布尔值,如果为true,使汽车的历史,而且当假的,禁用自动历史。版本3.6中的新功能。
CPython实现细节:默认情况下启用自动历史记录,对此的更改不会在多个会话中保留。
启动钩子
readline.
set_startup_hook
([ 功能] )- 设置或删除
rl_startup_hook
底层库回调调用的函数。如果指定了function,它将被用作新的钩子函数; 如果省略或None
已删除任何已安装的功能。在readline打印第一个提示之前,挂钩被调用而没有参数。
readline.
set_pre_input_hook
([ 功能] )- 设置或删除
rl_pre_input_hook
底层库回调调用的函数。如果指定了function,它将被用作新的钩子函数; 如果省略或None
已删除任何已安装的功能。在打印第一个提示并且在readline开始读取输入字符之前,不带参数调用该挂钩。只有在为支持它的库版本编译Python时,此函数才存在。
完成
以下功能涉及实现自定义单词完成功能。这通常由Tab键操作,并且可以建议并自动完成键入的单词。默认情况下,Readline设置为用于rlcompleter
完成交互式解释器的Python标识符。如果要将readline
模块与自定义完成符一起使用,则应设置一组不同的字分隔符。
readline.
set_completer
([ 功能] )- 设置或删除完成功能。如果指定了函数,它将用作新的完成函数; 如果省略或
None
已删除任何已安装的完成函数。完成者函数被调用为 ,对国家的,,,…,直到它返回一个非字符串值。它应该从文本开始返回下一个可能的完成。function(text, state)
0
1
2
安装的完成函数由传递给底层库的entry_func回调调用
rl_completion_matches()
。该文本字符串来自于第一个参数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
。
readline.
set_completer_delims
(字符串)readline.
get_completer_delims
()- 设置或获取单词分隔符以完成。这些决定了要考虑完成的单词的开始(完成范围)。这些函数访问
rl_completer_word_break_characters
底层库中的变量。
readline.
set_completion_display_matches_hook
([ 功能] )- 设置或删除完成显示功能。如果指定了函数,它将用作新的完成显示功能; 如果省略或
None
已删除任何已安装的完成显示功能。这将设置或清除rl_completion_display_matches_hook
底层库中的 回调。每次需要显示匹配时,调用完成显示功能 一次。function(substitution, [matches], longest_match_length)
示例
以下示例演示如何使用readline
模块的历史读取和写入功能来自动加载和保存.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)