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,请�阅 定制化模�。 |