13.13。 インタラクティブな入力編集と履歴置換
Pythonインタープリターの一部のバージョンは、KornシェルおよびGNU Bashシェルにある機能と同様に、現在の入力行の編集と履歴の置換をサポートしています。 これは、Emacsスタイルとviスタイルの編集をサポートする GNU Readline ライブラリを使用して実装されます。 このライブラリには独自のドキュメントがありますが、ここでは複製しません。 ただし、基本は簡単に説明できます。 ここで説明するインタラクティブな編集と履歴は、オプションで、UnixバージョンとCygwinバージョンのインタープリターで使用できます。
この章では、Mark HammondのPythonWinパッケージまたはPythonで配布されるTkベースの環境IDLEの編集機能については、ではなくで説明しています。 NTおよびその他のDOSおよびWindowsフレーバーのDOSボックス内で動作するコマンドライン履歴のリコールは、さらに別の獣です。
13.1。 行編集
サポートされている場合、インタープリターがプライマリまたはセカンダリプロンプトを出力するたびに、入力行の編集がアクティブになります。 現在の行は、従来のEmacs制御文字を使用して編集できます。 これらの中で最も重要なものは次のとおりです。 CA (Control-A)はカーソルを行の先頭に移動し、 CE は行の末尾に移動し、 CB はカーソルを1つ移動します左に配置し、 CF を右に配置します。 バックスペースはカーソルの左側の文字を消去し、 CD はその右側の文字を消去します。 CK はカーソルの右側の残りの行を強制終了(消去)し、 CY は最後に強制終了された文字列をヤンクバックします。 C-アンダースコアは、最後に行った変更を元に戻します。 累積効果のために繰り返すことができます。
13.2。 歴史の代用
履歴置換は次のように機能します。 発行された空でない入力行はすべて履歴バッファーに保存され、新しいプロンプトが表示されると、このバッファーの下部にある新しい行に配置されます。 CP は履歴バッファ内で1行上(後ろ)に移動し、 CN は1行下に移動します。 履歴バッファの任意の行を編集できます。 プロンプトの前にアスタリスクが表示され、行を変更済みとしてマークします。 Return キーを押すと、現在の行がインタプリタに渡されます。 CR はインクリメンタル逆検索を開始します。 CS は前方検索を開始します。
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 のデフォルトのバインディングは、Readlineのデフォルトのファイル名補完関数の代わりに Tab 文字を挿入することであることに注意してください。 あなたが主張するならば、あなたは置くことによってこれを無効にすることができます
Tab: complete
~/.inputrc
で。 (もちろん、その目的で Tab を使用することに慣れている場合は、インデントされた継続行を入力するのが難しくなります。)
変数名とモジュール名の自動補完はオプションで利用できます。 インタプリタのインタラクティブモードで有効にするには、スタートアップファイルに次を追加します: 1
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: "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。 インタラクティブインタプリタの代替
この機能は、以前のバージョンのインタープリターと比較して、大きな前進です。 ただし、いくつかの要望が残っています。継続行で適切なインデントが提案されていると便利です(パーサーは、次にインデントトークンが必要かどうかを認識しています)。 完了メカニズムは、インタプリタのシンボルテーブルを使用する場合があります。 一致する括弧や引用符などをチェックする(または提案する)コマンドも役立ちます。
かなり前から存在している代替の拡張インタラクティブインタープリターの1つは、 IPython です。これは、タブ補完、オブジェクト探索、および高度な履歴管理を備えています。 また、完全にカスタマイズして、他のアプリケーションに組み込むこともできます。 もう1つの同様の拡張インタラクティブ環境は、 bpython です。
脚注
- 1
- Pythonは、対話型インタープリターを起動すると、 PYTHONSTARTUP 環境変数で識別されるファイルの内容を実行します。 非インタラクティブモードでもPythonをカスタマイズするには、カスタマイズモジュールを参照してください。