Python 3 文档(简体中文) 3.2.2 documentation

Version: 3.2.2
12. 现在干什么? << 13. 交互式输入编辑及历史替代 (Source) >>14. 浮点算术: 问题和限制

13. 交互式输入编辑及历史替代

某些版本的 Python 解释器支持编辑当前输入行和历史替代, 就像 Korn shell 和 GNU Bash shell 一样. 这是通过 GNU Readline 库实现的, 它支持 Emacs 模式和 vi 模式. 这个库有它自己的文档, 所以在这里就不再说了; 但是基础的会简单的解释. 交互式的编辑及历史记录可能仅适用于 Unix, 及 Cygwin 版本上的解释器.

本章并*不*会讲 Mark Hammond 的 PythonWin 包或者是伴随 Python 一起发布, 基于 Tk 的IDLE. 而在 NT 平台下的命令行窗口或者是 DOS 这些 Windows 流派的东西, 也不会描述.

13.1. 行编辑

如果可以, 行编辑是一直激活的, 无论是处于第一或第二提示符. 当前行可以使用通用的 Emacs 控制符进行编辑. 最重要的几个: C-A (Control-A) 移动光标至行首, C-E 移动至行尾, C-B 向左移动光标, C-F 向右. 退格键删除光标左边的一个字符, C-D 则删除右边的字符. C-K 删除光标右边剩余的所有字符, C-Y 则召回最后一次被删的字符串. C-underscore 取消最后一次的改变; 这可以重复的执行.

13.2. 历史替代

历史替换运行如下. 所有的非空输入行都会被保存于一个历史记录缓存, 当新的提示符给出时, 你处于这个缓存的最底部. C-P 可以向前翻一条记录, C-N 则向后翻一条. 任何的历史记录都是可以被编辑的; 如果被修改了, 那么会在提示符前增加一个星号. 按下 Return (也就是回车) 将当前行传递给解释器. C-R 进行反向搜索; C-S 开始前向搜索.

13.3. 按键绑定

按键的绑定和 Readline 库其他的一些参数可以在 ~/.inputrc 中指明. 按键绑定的形式:

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

注意, 默认情况下 Tab 在 Python 中是用于插入一个 Tab 字符, 而非 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=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

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 了, 它有 tab 补全, 对象探索, 和更高级的历史管理功能. 它也可以被定制, 嵌入其他的应用. 另外一个则是 bpython.

Footnotes

[1]在你打开一个交互式解释器的时候, Python 会执行一个文件的内容, 这个文件由环境变量 PYTHONSTARTUP 指定.

See also

(^.^)