13. 交互式输入的编辑和历史记录

某些版本的 Python 解释器支持编辑当前的输入行和历史记录,类似于在 Korn shell 和 GNU Bash shell 中看到的功能。这是使用GNU Readline库实现的,它支持 Emacs 风格和 vi 风格的编辑。这个库有它自己的文档,在这里我不就重复了;然而,基本原理很容易解释。本章讲述的交互式编辑和历史记录功能在 Unix 版本和 Cygwin 版本中是可选的。

本章 是Mark Hammond的 PythonWin 包或者随 Python 一起发布的基于 TK 的 IDLE 环境的文档。基于 NT 系统的DOS和其它 DOS、Windows 系统上的命令行历史回溯是另一个话题。

13.1. 行编辑

如果支持,无论解释器打印主提示符还是从属提示符,输入行一直都可以编辑。可以使用传统的Emacs控制字符编辑当前行。其中最重要的是:C-A (Control-A)将光标移动到行首,C-E移到行尾,C-B将光标向左移动一个位置,C-F向右移动一个位置。退格键删除光标左侧的字符,C-D删除光标右侧的字符。C-k删掉一行中光标右侧的所有字符,C-y将最后一次删除的字符串粘贴到光标位置。C-下划线将撤消最近一次的更改;它可以重复执行并产生累积效果。

13.2. 历史记录

历史记录的工作方式如下。所有的非空输入行都保存在历史记录缓冲区中,当给出一个新的提示符时,你位于缓冲区最底部新的一行。C-P向上(往回)移动历史记录缓冲区中的一行,C-N向下移动一行。历史记录缓冲区中的任何一行都可以编辑;提示符的前面用一个星号标记修改的行。Return键会将当前行传递给解释器。C-R开始逐渐向后搜索;C-S开始向前搜索。

13.3. 快捷键绑定

通过将命令放在一个名为~/.inputrc的初始化文件中,可以自定义快捷键和Readline 库的一些其他参数。快捷键绑定有如下方式

key-name: function-name

"string": function-name

也可以设置选项

set option-name value

例如:

# I prefer vi-style editing:
set editing-mode vi

# Edit using a single line:
set horizontal-scroll-mode On

# Rebind some keys:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file

请注意,在 Python 中选项卡的默认绑定是插入一个制表符而不是 Readline 的默认文件名完成函数如果你坚持,你可以重写此放

Tab: complete

在您的~/.inputrc(当然,这难键入缩进的续行,如果你习惯于使用选项卡为该目的)。

(可选) 提供自动完成功能的变量和模块的名称。若要启用它在解释器的交互模式中,添加以下到启动文件: [1]

import rlcompleter, readline
readline.parse_and_bind('tab: complete')

这将Tab键绑定到完成函数,所以两次击中Tab键建议落成量 ;它看起来在 Python 语句名称、 当前本地变量,以及可用的模块名称。用于string.a的虚线表达式,它将计算到最后的表达式'.' ,那么,建议从属性所生成对象的落成。请注意这可能会执行应用程序定义的代码,是否使用__getattr__()方法中使用的对象是表达式的一部分。

更有能力启动文件可能看起来像本示例。注意这将删除的名称,它创建了一旦他们不再需要 ;这是因为启动文件在相同的命名空间作为交互式命令中执行和删除名称就可以避免在交互式环境中创建的副作用。你可能会发现,保留一些导入的模块,如os,,结果发现在大多数会议与译员需要方便。

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=~/.pystartup" in bash.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

13.4. 其它交互式解释器

这一设施是巨大的一步向前相比早期版本的口译员 ;然而,有些愿望离开: 如果正确的缩进被建议 (分析器知道如果缩进标记是需要下一步) 继续进行线上就好。完成机制可能会使用解释器的符号表。命令来检查 (或甚至建议) 匹配括号、 引号等,也会很有用。

一个替代性增强交互式解释器,已经有相当一段时间是IPython,哪些功能选项卡完成、 对象勘探和先进历史记录管理。它也可以是彻底定制和嵌入到其他应用程序。另一个类似的增强交互式环境是bpython

脚注

[1]Python will execute the contents of a file identified by the PYTHONSTARTUP environment variable when you start an interactive interpreter. 若还要定制化非交互式的Python,请参阅定制化模块