A. 対話入力編集とヒストリ置換

Python インタープリタの版によっては, Korn シェルや GNU Bash シェルと似た現在入力行の編集とヒストリ置換を サポートしている。 これは GNU Readline ライブラリを使って実装されている。 ライブラリは Emacs スタイルと vi スタイルの編集をサポートしている。 このライブラリにはそれ自身のドキュメンテーションがあり,ここでそれを 繰り返そうとは思わない。しかし基本は簡単に説明できる。 ここで述べる対話編集とヒストリは Unix 版と CygWin 版の インタープリタでオプションとして利用できるA.1

この章は,Mark Hammond の PythonWin パッケージや, Python とともに配布される Tk ベースの環境である IDLE にある 編集機能については解説しない。 NT 上の DOS ボックスやその他の DOS および Windows 類で働く コマンド行ヒストリ呼出しもまた別のものだ。

 
A.1 行編集

入力行編集は,もしサポートされているならば, インタープリタが一次または二次プロンプトを印字した時いつでも有効になっている。 現在行を,通常の Emacs 制御文字を使って編集できる。 そのうち最も重要なものを挙げる。 C-A (Control-A) はカーソルを行の先頭へ移動させる, C-E は末尾へ移動させる, C-B は逆方向へ一つ移動させる, C-F は順方向へ移動させる。 Backspace は逆方向に向かって文字を消す, C-D は順方向に向かって消す。 C-K は順方向に向かって行の残りを kill する (消す), C-Y は最後に kill された文字列を再び yank する (取り出す)。 C-underscore は君がした最後の変更を元に戻す -- これは 繰り返して,どんどんさかのぼることができる。

 
A.2 ヒストリ置換

ヒストリ置換は次のように働く。 出された非空の入力行はすべてヒストリ・バッファにセーブされる。 新しいプロンプトが与えられたとき, 君はこのバッファの底にある新しい行に位置している。 C-P はヒストリ・バッファの中を 1 行だけ上に移動する (戻る)。 C-N は 1 行だけ下に移動する。 ヒストリ・バッファのどの行も編集できる。 行が修正されたことを表すためプロンプトの前にアステリスクが現れるA.2Return キーを押すと現在行がインタープリタへ渡される。 C-R はインクリメンタルな逆方向サーチ (reverse search) を開始し, C-S は順方向サーチ (forward search) を開始する。

 
A.3 キー束縛

Readline ライブラリのキー束縛 (key binding) やその他のパラメタは, ~/.inputrc という初期化ファイルA.3にコマンドを置くことによって カスタマイズできる。 キー束縛の形式は

key-name: function-name

または

"string": function-name

であり,オプションの設定方法は

set option-name value

である。たとえば,

# vi スタイルの編集を選択する:
set editing-mode vi

# 一行だけを使って編集する:
set horizontal-scroll-mode On

# いくつかのキーを再束縛する:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file

Tab に対する Python でのデフォルト束縛は,TAB の挿入であって, Readline のデフォルトであるファイル名補完関数ではないことに注意しよう。 もし,どうしてもと言うならば,君の ~/.inputrc

Tab: complete

を入れることによって,これをくつがえすことができる。(もちろん,こうすると 段付けした継続行を打鍵しにくくなるのだが)

変数名とモジュール名の自動的な補完が,オプションで利用できる。 それをインタープリタの対話モードで有効にするには, 下記を君のスタートアップ・ファイルへ追加するA.4 

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

これは Tab キーを補完関数に束縛するから, Tab キーを2回たたくと補完候補が示される。 この補完は 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, e.g. "export PYTHONSTARTUP=/max/home/itamar/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

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

 
A.4 解説

この機能は,初期の版のインタープリタに比べれば大きな前進である。 しかし,いくつかの要望が残されている。 正しい段付けが継続行で提示されたら快適だろう (パーサは 次に段付けトークンが必要かどうかを知っている)。 補完機構がインタープリタの記号表を使ってもよいかもしれない。 かっこやクォートの対応をチェックする (さらには提示もする) コマンドも 有用だろう。



... インタープリタでオプションとして利用できるA.1
訳注: BeOS R5 版の Python 2.1 でも利用できるようです。
... 行が修正されたことを表すためプロンプトの前にアステリスクが現れるA.2
訳注: これはデフォルト設定の Readline では現れません。 set mark-modified-lines on という行を ~/.inputrc または 環境変数 INPUTRC が指定するファイルに置くことによって 現れるようになります。
... という初期化ファイルA.3
訳注: このファイル名は 環境変数 INPUTRC がもしあればその指定が優先されます。
... 下記を君のスタートアップ・ファイルへ追加するA.4
君が対話インタープリタを開始する時, Python は PYTHONSTARTUP 環境変数が指定するファイルの内容を実行する。
See About this document... for information on suggesting changes.