13. 交互�输入行编辑历�回溯¶

有些版本的 Python 解释器支�输入行编辑和历�回溯,类似 Korn shell 和 GNU bash shell 的功能。这是通过 GNU Readline 库实现的。它支� Emacs 风格和 vi 风格的编辑。这个库有它自己的文档,在此���了。�过,基本的东西很容易演示。交互�编辑和历�查阅在 Unix 和 Cygwin 版中是�选项。

本章 �是 马克哈密尔顿的 PythonWin 包和� Python �布的基于 TK 的 IDLE 环境的文档。NT 系统和其它 DOS�Windows 系统上的 DOS 窗中的命令行历�回调,属于�一个�题。

13.1. 行编辑¶

如果支�,无论解释器打�主�示符或从属�示符,行编辑都会激活。当�行�以用 Emacs 风格的快�键编辑。其中最��的是:C-A (Control-A)将光标移动到行首,C-E 移动到行尾,C-B �左移一个字符,C-F ��移一�。退格�左删除一个符串,C-D ��删除一个字符。C-K 删掉光标�边直到行尾的所有字符,C-Y 将最�一次删除的字符串粘贴到光标�置。C-underscore (underscores �下划线,译注)撤销最�一次修改,它�以因积累作用��。

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

需�注�的是 Python 中默认 Tab 绑定为�入一个 Tab 字符而�是 Readline 库的默认文件�完�函数,如果你想用这个,�以将以下内容�入:

Tab: complete

到你的 ~/.inputrc 中�覆盖它(当然,如果你真的把 Tab 设置�这样,就很难在�继行中�入缩进。)。

自动完���和模��也�以激活生效。�使之在解释器交互模�中�用,在你的�动文件中加入下�内容: [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,它支� tab 完�,对象�览和高级历�管�。它也�以完全定制或嵌入到其它应用程�中。�一个类似的强化交互环境是 bpython 。

Footnotes

[1]�动交互解释器时,Python �以执行 PYTHONSTARTUP 环境��所指定的文件内容。若还�定制化�交互�的 Python,请�阅 定制化模�。