### 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. 浮點數運算:問題和局限