小段落

- A.1 整行編輯
- A.2 代換過去的內容
- A.3 鍵盤連結
- A.4 評注

#
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 這個系統環境變數所代表的檔案裡面的指令。

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