タオルケット体操

サツバツいんたーねっと

Python Prompt Toolkitで快適便利 Python REPL生活が向上な

GitHubのトレンドリポジトリを眺めてたら面白そうなのを見つけました。

jonathanslenders/python-prompt-toolkit · GitHub

https://raw.githubusercontent.com/jonathanslenders/python-prompt-toolkit/master/docs/images/ptpython-screenshot.png

prompt_toolkit is a Library for building powerful interactive command lines in Python.
It ships with a nice interactive Python shell (called ptpython) built on top of the library.

ptpythonというインタラクティブシェルを同梱したツールキットみたいです。readlineをめっちゃ強力にした感じだそうです。

試しに使ってみた感じ、操作性良好、見た目も綺麗、補完モリモリスマートなプロンプトですね。
以下、ほとんどREADME.mdの意訳といった感じです。

機能

  • Python

  • 入力中もリアルタイムにシンタックスハイライトしてくれる

  • 複数行の編集

  • 高度な入力補完 (jediを使っているみたいなのでかなり賢い補完をしてくれます)

  • ViとEmacs方式両方のキーバインディングをサポート (Similar to readlineだそうで)

  • 順、逆順のインクリメンタルサーチ

  • Python2.7, 3両対応

  • ユニコードのマルチバイト文字に対応 (Chinese inputと書いてありますので、日本語もOKだと思います)

  • 選択からのコピペが可能 (もちろんVi、Emacs両方のスタイルで)

  • グローバルな状態なし

  • 愛情たっぷりにコーディングしてあります♡

制限事項

VT100対応のターミナルでしか動作しません。とのことです。
今日のLinux, MacのターミナルではVT100に対応していますが、Windowsのものは対応してないんだぜ、とのこと。minttyでなら動作しそうですけど、どうなんでしょうね?
詳しいところは公式のドキュメントなりissueなりを参考にしたほうが良さそうです。

使い方

インストールは、例のごとく

$ pip install prompt-toolkit

で。

ptpythonコマンドで起動します。Viキーバインドを使いたい場合は--viオプションを付けましょう。
アプリケーション内にこのptpythonを組み込むことも出来るようです。

from prompt_toolkit.contrib.repl import embed
embed(globals(), locals(), vi_mode=False, history_filename=None)

タブ補完も効きます。IPythonのめっちゃ使いにくいアレではなくて、ちゃんとIDEみたいな挙動をしてくれます。
Viモードの場合はCtrl-N Ctrl-Pで動作します。

その他、複数行編集などのやり方なんかは公式を参照しませう。

マルチラインモード(複数行編集)

F7を押すと、普通のエディタっぽい感じになって複数行の編集が可能になります。
Alt+Enterで実行出来ます。また、その際に簡単なシンタックスチェックが走るので、ちょっとしたエラーであればSyntax Error (line=1 column=9)のように場所を教えてくれます。マジかよ超便利じゃん! 普段はエディタに頼っているせいでREPLだと:を忘れてイライラしまくる僕の能率は当社比3倍です。

なお、Macでは標準状態だとMeta-key(Altのこと)が有効化されていないので、標準ターミナルであればUse option as meta keyをチェック、iTerm2ならばLeft option acts as +Escをチェックする必要があります。

こっちの記事でオプションの意味についてちょびっとおはなししています。
http://qiita.com/hatchinee/items/12a4d42ee7a667f7934b#4-2

IPythonがお好き? 結構、もっと好きになりますよ

IPythonは操作感が好きではなかったので個人的にはあまり使ってきませんでした。しかし、すでにIPythonを運用してる人からすると「いや新しいREPLインターフェースとかいらんしょ」みたいな感じになりそうですが、どうやらIPython連携が可能なようです。

ptipythonで起動出来ます。! %とかそこらへんのマジックもそのまま使えるようです。

ライブラリとしての利用

ライブラリとして使って、ありとあらゆる部分をカスタマイズしてプロンプトとして利用可能だとのこと。ツールに組み込んだりとか、pecoと連携したりとか捗りそうですね?
ただ、未だ制作途中である都合上でAPIが変わりまくるぜということなので、現状では長く使うようなコードに利用するのは厳しそうですね。

READMEにはオウム返しプロンプトを作るサンプルが載っています。

Djangoプラギン

参考: Python Prompt Toolkitをdjangoで使う - brainstorm

django-extensions/django-extensions · GitHub

django-extensionsにすでに存在しているみたいですね。はかどりそうです。

所感

操作性の良さと見た目の良さが気持ちよいですね。Python3対応なのも嬉しいです。まぁ僕の職場が使っているPythonはクソ古いので、別途Python2.7か3を入れないとダメなんですけど。
jediの賢さは普段Vimを使っていてお世話になりっぱなしだし、Unicode対応も謳われているし、ハイパー便利の予感がしますね!

以上。

  

追記

標準REPLやIPython以外にも色々あるみたいなので、導入前に比較出来るようにリスト上げておきます

REPL強化系ライブラリ

  • readline(標準モジュール)

    GNU readlineのラッパー

  • rlcompleter(標準モジュール)

    readline向けの補完モジュール。こいつを使うと標準REPLでも補完が効いたりするようになる。エキPyの一章でも紹介してて存在を知った覚えがある。
    サードパーティならrlcompleter2, 3も存在する。

インタラクティブシェル

  • IPython

    上でも紹介したやつ。IPython Notebookとかいうキラーコンテンツのおかげで、科学計算や教育分野で人気があるっぽい。

  • BPython

    IPythonインプルーブドなシェルかな? 情弱なのでツイッターのリアクションで初めて存在を知りました。
    歴史が長いことと、補完候補の見やすさ、カスタマイズのしやすさ、機能の豊富さで使い勝手がかなり良さそう。そこの点はptpython付属のシェルに対する大きなアドバンテージになりそう。
    ただし、IPython相互運用の機能はなさそう?