readline —GNUreadlineインターフェース
readline モジュールは、Pythonインタープリターからの履歴ファイルの完了と読み取り/書き込みを容易にするためのいくつかの関数を定義します。 このモジュールは、直接使用することも、インタラクティブプロンプトでPython識別子の補完をサポートする rlcompleter モジュールを介して使用することもできます。 このモジュールを使用して行われた設定は、インタプリタの対話型プロンプトと組み込みの input()関数によって提供されるプロンプトの両方の動作に影響を与えます。
リードラインキーバインディングは、初期化ファイル(通常はホームディレクトリの.inputrc
)を介して構成できます。 そのファイルのフォーマットと許容される構成、および一般的なReadlineライブラリの機能については、GNUReadlineマニュアルの Readline Init File を参照してください。
ノート
基盤となるReadlineライブラリAPIは、GNUreadlineの代わりにlibedit
ライブラリによって実装される場合があります。 macOSでは、 readline モジュールは、実行時に使用されているライブラリを検出します。
libedit
の構成ファイルは、GNUreadlineの構成ファイルとは異なります。 プログラムで構成文字列をロードする場合は、readline.__doc__
のテキスト「libedit」をチェックして、GNUreadlineとlibeditを区別できます。
macOSで editline / libedit
readlineエミュレーションを使用する場合、ホームディレクトリにある初期化ファイルの名前は.editrc
です。 たとえば、~/.editrc
の次のコンテンツは、 vi キーバインドとTAB補完をオンにします。
python:bind -v
python:bind ^I rl_complete
初期化ファイル
次の関数は、initファイルとユーザー構成に関連しています。
- readline.parse_and_bind(string)
- string 引数で指定されたinit行を実行します。 これにより、基礎となるライブラリで
rl_parse_and_bind()
が呼び出されます。
- readline.read_init_file([filename])
- リードライン初期化ファイルを実行します。 デフォルトのファイル名は、最後に使用されたファイル名です。 これにより、基礎となるライブラリで
rl_read_init_file()
が呼び出されます。
ラインバッファ
次の関数は、ラインバッファで動作します。
- readline.get_line_buffer()
- ラインバッファの現在の内容を返します(基になるライブラリの
rl_line_buffer
)。
- readline.insert_text(string)
- カーソル位置の行バッファにテキストを挿入します。 これにより、基になるライブラリで
rl_insert_text()
が呼び出されますが、戻り値は無視されます。
- readline.redisplay()
- 画面に表示される内容を変更して、ラインバッファの現在の内容を反映します。 これにより、基礎となるライブラリで
rl_redisplay()
が呼び出されます。
履歴ファイル
次の関数は、履歴ファイルを操作します。
- readline.read_history_file([filename])
- リードライン履歴ファイルをロードし、履歴リストに追加します。 デフォルトのファイル名は
~/.history
です。 これにより、基礎となるライブラリでread_history()
が呼び出されます。
- readline.write_history_file([filename])
- 履歴リストをreadline履歴ファイルに保存し、既存のファイルを上書きします。 デフォルトのファイル名は
~/.history
です。 これにより、基礎となるライブラリでwrite_history()
が呼び出されます。
- readline.append_history_file(nelements[, filename])
履歴の最後の nelements アイテムをファイルに追加します。 デフォルトのファイル名は
~/.history
です。 ファイルはすでに存在している必要があります。 これにより、基礎となるライブラリでappend_history()
が呼び出されます。 この関数は、Pythonがそれをサポートするライブラリのバージョン用にコンパイルされている場合にのみ存在します。バージョン3.5の新機能。
- readline.get_history_length()
readline.set_history_length(length)
- 履歴ファイルに保存する行数を設定または返します。 write_history_file()関数は、基になるライブラリで
history_truncate_file()
を呼び出すことにより、この値を使用して履歴ファイルを切り捨てます。 負の値は、履歴ファイルのサイズが無制限であることを意味します。
履歴リスト
次の関数は、グローバル履歴リストで動作します。
- readline.clear_history()
- 現在の履歴をクリアします。 これにより、基礎となるライブラリで
clear_history()
が呼び出されます。 Python関数は、Pythonがそれをサポートするライブラリのバージョン用にコンパイルされている場合にのみ存在します。
- readline.get_current_history_length()
- 現在履歴にあるアイテムの数を返します。 (これは、履歴ファイルに書き込まれる最大行数を返す get_history_length()とは異なります。)
- readline.get_history_item(index)
- インデックスにある履歴アイテムの現在の内容を返します。 アイテムインデックスは1ベースです。 これにより、基礎となるライブラリで
history_get()
が呼び出されます。
- readline.remove_history_item(pos)
- 位置で指定した履歴項目を履歴から削除します。 位置はゼロベースです。 これにより、基礎となるライブラリで
remove_history()
が呼び出されます。
- readline.replace_history_item(pos, line)
- 位置で指定した履歴項目を行に置き換えます。 位置はゼロベースです。 これにより、基礎となるライブラリで
replace_history_entry()
が呼び出されます。
- readline.add_history(line)
- 最後に入力した行であるかのように、 line を履歴バッファに追加します。 これにより、基礎となるライブラリで
add_history()
が呼び出されます。
- readline.set_auto_history(enabled)
readlineを介して入力を読み取るときに、
add_history()
への自動呼び出しを有効または無効にします。 enabled 引数は、trueの場合は自動履歴を有効にし、falseの場合は自動履歴を無効にするブール値である必要があります。バージョン3.6の新機能。
スタートアップフック
- readline.set_startup_hook([function])
- 基になるライブラリの
rl_startup_hook
コールバックによって呼び出される関数を設定または削除します。 function が指定されている場合、それは新しいフック関数として使用されます。 省略またはNone
の場合、すでにインストールされている機能はすべて削除されます。 readlineが最初のプロンプトを出力する直前に、フックは引数なしで呼び出されます。
- readline.set_pre_input_hook([function])
- 基になるライブラリの
rl_pre_input_hook
コールバックによって呼び出される関数を設定または削除します。 function が指定されている場合、それは新しいフック関数として使用されます。 省略またはNone
の場合、すでにインストールされている機能はすべて削除されます。 最初のプロンプトが出力された後、readlineが入力文字の読み取りを開始する直前に、フックは引数なしで呼び出されます。 この関数は、Pythonがそれをサポートするライブラリのバージョン用にコンパイルされている場合にのみ存在します。
完了
次の関数は、カスタム単語補完関数の実装に関連しています。 これは通常、Tabキーで操作され、入力されている単語を提案して自動的に完了することができます。 デフォルトでは、Readlineは rlcompleter がインタラクティブインタープリターのPython識別子を完成させるために使用するように設定されています。 readline モジュールをカスタムコンプリーターで使用する場合は、別の単語区切り文字のセットを設定する必要があります。
- readline.set_completer([function])
コンプリーター機能を設定または削除します。 function が指定されている場合、それは新しいコンプリーター関数として使用されます。 省略または
None
の場合、すでにインストールされているコンプリーター機能はすべて削除されます。 コンプリーター関数はfunction(text, state)
と呼ばれ、0
、1
、2
、…の状態に対して、 -文字列値。 text で始まる次の可能な補完を返す必要があります。インストールされたコンプリーター関数は、基になるライブラリの
rl_completion_matches()
に渡される entry_func コールバックによって呼び出されます。 text 文字列は、基になるライブラリのrl_attempted_completion_function
コールバックの最初のパラメータから取得されます。
- readline.get_completer()
- コンプリーター機能を取得するか、コンプリーター機能が設定されていない場合は
None
を取得します。
- readline.get_completion_type()
- 試行されている完了のタイプを取得します。 これにより、基になるライブラリの
rl_completion_type
変数が整数として返されます。
- readline.get_begidx()
readline.get_endidx()
- 完了スコープの開始インデックスまたは終了インデックスを取得します。 これらのインデックスは、基になるライブラリの
rl_attempted_completion_function
コールバックに渡される start および end 引数です。
- readline.set_completer_delims(string)
readline.get_completer_delims()
- 補完する単語区切り文字を設定または取得します。 これらは、完了と見なされる単語の開始(完了範囲)を決定します。 これらの関数は、基になるライブラリの
rl_completer_word_break_characters
変数にアクセスします。
- readline.set_completion_display_matches_hook([function])
- 完了表示機能を設定または削除します。 関数を指定すると、新しい完了表示関数として使用されます。 省略または
None
の場合、すでにインストールされている完了表示機能は削除されます。 これにより、基になるライブラリのrl_completion_display_matches_hook
コールバックが設定またはクリアされます。 一致を表示する必要があるたびに、完了表示機能はfunction(substitution, [matches], longest_match_length)
と呼ばれます。
例
次の例は、 readline モジュールの履歴読み取りおよび書き込み機能を使用して、.python_history
という名前の履歴ファイルをユーザーのホームディレクトリから自動的にロードおよび保存する方法を示しています。 以下のコードは通常、ユーザーの PYTHONSTARTUP ファイルからの対話型セッション中に自動的に実行されます。
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
このコードは、Pythonがインタラクティブモードで実行されるときに実際に自動的に実行されます(リードライン構成を参照)。
次の例は同じ目標を達成しますが、新しい履歴を追加するだけで、同時インタラクティブセッションをサポートします。
import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
def save(prev_h_len, histfile):
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
次の例では、 code.InteractiveConsole クラスを拡張して、履歴の保存/復元をサポートしています。
import atexit
import code
import os
import readline
class HistoryConsole(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>",
histfile=os.path.expanduser("~/.console-history")):
code.InteractiveConsole.__init__(self, locals, filename)
self.init_history(histfile)
def init_history(self, histfile):
readline.parse_and_bind("tab: complete")
if hasattr(readline, "read_history_file"):
try:
readline.read_history_file(histfile)
except FileNotFoundError:
pass
atexit.register(self.save_history, histfile)
def save_history(self, histfile):
readline.set_history_length(1000)
readline.write_history_file(histfile)