EIN(アイン)

EIN -- Emacs IPython Notebook は Emacs 上の Jupyter Notebook クライアントです。Takafumi Arakaki さんが開発し,John Miller さんがメンテナンスされています。

EIN

インストールは melpa でできます。具体的には,~/.emacs.d/init.el に

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

と書いて Emacs を再起動し(あるいは上の3行を評価し),M-x package-list-packages して表示されるパッケージ一覧の ein の上にカーソルを動かして i キーを打ち(I マークが付く),x キーを打つと実際にインストールされます。ein 以外にも,例えば R を使うなら ESS を同じ方法でインストールしておくと便利です。ときどき M-x package-menu-mark-upgrades すると更新が楽です。

あらかじめ ~/.mailcap というファイルを作成し,Mac なら image/*; open -a Preview "%s" のように書き込んで画像ビューアとして「プレビュー」を設定します。ついでに「プレビュー」の環境設定でウィンドウの背景を白に設定します。

起動は M-x ein:run して,[New Notebook] の上で RET します(Enter キーを押します)。デフォルトでは Untitled.ipynb というノートブックが作成されますが,C-x C-w でリネームできます。ときどき C-x C-s で保存します。別の方法として,既存の .ipynb ファイルを開いて C-c C-o します。終了は M-x ein:stop です。

セル(In [ ]: の下)に何行かのコードを入力して M-RET すると,実行され,次のセルに移動または新しいセルが挿入されます。C-c C-a で上にセルを挿入,C-c C-b で下にセルを挿入します。C-u C-c C-a で上にマークダウンを挿入,C-u C-c C-b で下にマークダウンを挿入します。C-c C-k でセルを消します。C-c ↑ や C-c ↓ でセルを上や下に移動します。

長い出力があると見通しが悪くなるので,出力の上で C-c C-e して出力を隠すことができます。もう一度 C-c C-e すると現れます。

セルの実行中に止めたくなったときは C-c C-z します。このときのカーソルの位置はどこでもかまいません。

画像はデフォルトでは外部ビューアで表示しますが,インライン表示するには M-x customize-group RET ein と打ち,▷ Ein Output Area Inlined Images の先頭で RET し,Toggle を押してその右を on にし,ページ先頭の Apply and Save を押します。こうすることによって ~/.emacs.d/init.el の (custom-set-variables ...) の中に '(ein:output-area-inlined-images t) が挿入されますが,手で挿入すると間違えやすいので上のような手順が推奨です。

別の起動のしかたとして,ターミナルで作業ディレクトリに移動して,好きな Python の環境で例えば

jupyter notebook --no-browser --no-mathjax --port=8888 &

と打ち込んで Jupyter サーバを起動してから,Emacs 側で M-x ein:login します。ポート番号は 8888 がデフォルトです。EIN を開くときに URL かポートを聞いてきますので,上で指定したポート番号を入れます。Emacs 側で EIN を終了したら,ターミナルで

jupyter notebook stop

しておきます。

Jupyter サーバは自マシンでなくてもかまいません。他のマシンにログインして

jupyter notebook --ip='*' --no-browser --no-mathjax &

のようにして http://ホスト名:8888/?token=... でアクセスすることもできます。デフォルトは http なので注意。さらに,他人にアクセスしてもらうときは,Jupyter サーバを起動した人の権限で何でもできてしまいますので,十分注意する必要があります。

あるいは

ssh -L 8888:hostname:8888 hostname

で他マシンにログインして

jupyter notebook --no-browser --no-mathjax &

してから M-x ein:login で 8888 と打つという手もあります。ssh トンネルを通るので暗号化されます。ポートを変えれば複数のサーバを同時に使うこともできます。EIN がパスワードを聞いてくるときは,Jupyter サーバを立ち上げたときに表示されるトークン文字列を入力します。

ヘルプの別窓表示が壊れているようです。とりあえず ?hoge でなく help(hoge) を使えば大丈夫のようです。

Markdown 中の数式は ein-preview-latex で画像化して表示できるようです(未確認)。