小段落


A. 互動式輸入編輯及代換過去的內容

有些的Python的直譯器版本有支援目前所在行的編輯,以及過去輸入內容的代換,這跟在Korn Shell以及GNU Bash shell裡面的一些功能有點像。這個功能是用 GNU Readline 的程式庫做出來的,提供了類似Emacs以及類似vi的編輯功能。這個程式庫本身有自己的參考文件,所以我在此不再重複,我只是簡單的介紹基本的功能。這裡所介紹的互動模式輸入編輯及代換過去內容的功能通常在Unix以及CygWin的直譯器版本都可以見得到。

本章 沒有 包含在Mark Hammond的PythonWin package裡的編輯功能,也沒有包含在標準Python distribution裡面的Tk之類的環境,或是IDLE的編輯功能。在DOS以及NT及其他類似的環境下,也有命令列過去內容記憶的功能,但是也不在本文的內容之中。


A.1 整行編輯

如果有支援整行編輯的話,當直譯器印出primary prompt或是secondary prompt的時候,整行編輯的功能就會被啟動起來。你可以用一般的Emacs控制字元來編輯目前所在的行。其中常見的有這些: C-A (Control-A)會移動cursor到目前行的最開頭的地方, C-E 會移動到最尾端, C-B 會往左移動一個位置, C-F 會往右邊一個位置。Backspace鍵會消去目前cursor所在處左邊的一個字元, C-D 會消去右邊的一個字元, C-K 會殺掉 (消去)本行在游標之後的所有字元, C-Y 會把剛剛所殺掉的字串再次貼回來, C-underscore 會取消剛才所做的最後一個動作,這個功能也可以重複多次的使用。


A.2 代換過去的內容

要取代過去的內容其方法如下:所有的非空白行都會被儲存在一個儲存過去內容的緩衝區(history buffer)裡面,當prompt出現的時候,你所在的位置就是在這個buffer的最底下,使用 C-P 會使得在buffer裡面往上移動一行, C-N 會往下移動一行。任何在buffer裡面的行都可以被編輯,若是在prompt之前出現星號的話就代表這個行已經被修改過了。當你按下 Return 鍵的時候就是把目前這一行送給直譯器了。 C-R 會開始一個逐漸往上的搜尋,按下 C-S 會開始往前的搜尋。


A.3 鍵盤連結

鍵盤的連結以及一些其他有關Readline library的參數都可以被修改,其方法是在一個叫做 ~/.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 程式庫裡面預設的檔名自動完成的功能。如果你堅持的話,你也可以這樣子設定來蓋過Python的預設:

Tab: complete

這應該在你的 ~/.inputrc 裡面。(當然如果你這樣做的話,你在縮排連續行的時候就費力一些了。)

自動完成變數及module的名稱的功能是可以自由選擇要或不要的。如果你要在互動模式下啟動這一個功能的話,可以在啟動檔裡面加入底下的指令: A.1

import rlcompleter, readline
readline.parse_and_bind('tab: complete')

這樣做的話會使TAB 鍵連結到完成的功能,所以按下TAB鍵兩次就會建議一些完整的名稱。其所搜尋的是Python的敘述名稱,目前的local變數,以及可用的module名稱。對於像 string.a 這樣帶有點的expression,這項功能會先是著先evaluate到最後一個點的意思,然後再從所得的物件中建議可用的變數名稱。注意的是,如果這個物件含有的 __getattr__() 這個method是這個expression的一部份的話,就會執行一些特定的程式碼。


A.4 評注

這個功能跟其他之前的直譯器版本比起來是很大的一個進步,但是我們還有很多希望有的功能。如果在連續行的時候可以建議適當的縮排距離(分析器(parser)應該知道何時需要縮排)。自動完成的功能應該也能夠使用直譯器的symbol table。應該也要有一個指令可以檢查(甚至是建議)何時應該要有結束的括弧,括號等等。



註腳

... 底下的指令: A.1
當你啟動一個Python的互動式直譯器時,Python會自動執行在 $PYTHONSTARTUP 這個系統環境變數所代表的檔案裡面的指令。

請看關於此文件… 裡面有關如何給我們建議的說明。