### 13. 交互式输入的编辑和历史记录
某些版本的 Python 解释器支持编辑当前的输入行和历史记录,类似于在 Korn shell 和 GNU Bash shell 中看到的功能。这是使用[GNU Readline](http://tiswww.case.edu/php/chet/readline/rltop.html)库实现的,它支持 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 中Tab键默认绑定的是插入一个制表符而不是 Readline 的默认文件名补全功能。如果你坚持这样做,你可以放置一行
~~~
Tab: complete
~~~
在你的~/.inputrc中。(当然,如果你习惯使用Tab作为缩进,这会使得输入续行的缩进很困难。)
可以选择变量和模块名自动补全功能。若要在解释器的交互模式中启用这个功能,添加以下内容到你的启动文件:[[1]](#)
~~~
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
~~~
这将Tab键绑定到补全功能,所以按Tab键两次将会给出补全的建议;它会查找 Python 语句名称、当前的局部变量以及有效的模块名。例如点分表达式string.a,它会先解析最后一个点'.'之前的表达式,然后根据结果对象给出建议补全的内容。注意如果表达式得到的对象带有[__getattr__()](# "object.__getattr__")方法,这可能会执行应用程序定义的代码。
更有用的启动文件可能看起来像下面这个示例。注意下面的示例删除了它创建的名称,一旦这些名称不再需要;这是因为启动文件与交互式命令在相同的命名空间中执行,删除这些名称可以避免在交互式环境中产生副作用。你可能发现保留一些导入的模块有时也会很方便,例如[os](# "os: Miscellaneous operating system interfaces."),因为在大多数与解释器的交互中都需要它。
~~~
# 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](http://ipython.scipy.org/),它已经存在相当一段时间,具有tab补全、 对象exploration 和高级的历史记录功能。它也可以彻底定制并嵌入到其他应用程序中。另一个类似的增强的交互式环境是[bpython](http://www.bpython-interpreter.org/)。
脚注
| [[1]](#) | 当你启动一个交互式解释器时,Python将执行环境变量[PYTHONSTARTUP](#)指定的文件中的内容。若还要定制化非交互式的Python,请参阅[*定制化模块*](#)。 |
|-----|-----|
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限
- Python 2 标准库
- 1. 引言
- 2. 内建函数
- 3. 不太重要的内建函数
- 4. 内建的常量
- 5. 内建的类型
- 6. 内建的异常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 语言参考
- 1. 简介
- 2. 词法分析
- 3. 数据模型
- 4. 执行模型
- 5. 表达式
- 6. 简单语句
- 7. 复合语句
- 8. 顶层的组件
- 9. 完整的语法规范
- Python 3 教程
- 1. 引言
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限