キーバインドや入力補完で快適プログラミング!Startup hooks (readline)でPythonをもっと便利に


具体的な使い方

Startup hooks を使用するには、以下の手順に従います。

  1. readline モジュールをインポートします。
  2. readline.parse_and_bind() 関数を使用して、キーバインドや入力補完などの機能を定義します。
  3. readline.init() 関数を使用して、Startup hooks を初期化します。

import readline

def my_completer(text, state):
  # 入力補完機能を実装
  completions = ['apple', 'banana', 'orange']
  if state == 0:
    return completions
  else:
    return []

readline.parse_and_bind("tab: complete", my_completer)
readline.init()

# ユーザー入力を受け取る
text = input("何か入力してください: ")

# 入力されたテキストを出力する
print(text)

上記の例では、tab キーを押すと、applebananaorange などの補完候補が表示されます。

Startup hooks の利点

Startup hooks を使用すると、以下の利点があります。

  • ユーザーインターフェースの向上
  • 入力エラーの削減
  • ユーザー入力の効率化

Startup hooks を使用するには、readline モジュールをインストールする必要があります。また、Startup hooks は、すべてのプラットフォームで利用できるわけではありません。



キーバインドの定義

import readline

def go_to_beginning_of_line(self):
  # カーソルを行の先頭に移動する
  self.cursor_to_col(0)

readline.parse_and_bind("\001\001", go_to_beginning_of_line)  # Ctrl+a
readline.init()

# ユーザー入力を受け取る
text = input("何か入力してください: ")

# 入力されたテキストを出力する
print(text)

入力補完機能の定義

以下のコードは、tab キーを押すと、applebananaorange などの補完候補が表示される入力補完機能を定義します。

import readline

def my_completer(text, state):
  # 入力補完機能を実装
  completions = ['apple', 'banana', 'orange']
  if state == 0:
    return completions
  else:
    return []

readline.parse_and_bind("tab: complete", my_completer)
readline.init()

# ユーザー入力を受け取る
text = input("何か入力してください: ")

# 入力されたテキストを出力する
print(text)

以下のコードは、入力履歴を保存する Startup hooks を定義します。

import readline

import os
import atexit

def save_history():
  # 入力履歴を保存する
  readline.save_history(os.path.expanduser("~/.python_history"))

readline.parse_and_bind("control-c: save-history", save_history)
readline.init()

# ユーザー入力を受け取る
text = input("何か入力してください: ")

# 入力されたテキストを出力する
print(text)

# 終了時に入力履歴を保存する
atexit.register(save_history)


prompt_toolkit ライブラリ

prompt_toolkit ライブラリは、Startup hooks と同様の機能を提供するライブラリです。prompt_toolkit は、Startup hooks よりも多くの機能を備えており、より柔軟なカスタマイズが可能です。

from prompt_toolkit import prompt
from prompt_toolkit.completion import Completion

def my_completer(document):
  # 入力補完機能を実装
  completions = ['apple', 'banana', 'orange']
  return [Completion(d, text=d) for d in completions]

text = prompt("何か入力してください: ", completer=my_completer)

print(text)

rich ライブラリ

rich ライブラリは、テキストをリッチに表示するためのライブラリです。rich ライブラリには、キーバインドや入力補完などの機能も含まれています。

from rich.console import Console
from rich.prompt import Prompt

console = Console()

text = console.prompt("何か入力してください: ", completers=[("apple", "Apple"), ("banana", "Banana"), ("orange", "Orange")])

console.print(f"入力されたテキスト: {text}")

Startup hooks を使用せずに、カスタムプロンプトを作成することもできます。

import sys

while True:
  text = input("何か入力してください: ")
  if text == "exit":
    break
  print(text)