Emacsからjupyter notebookを使う方法

Emacs からjupyter notebookを使う方法をまとめます

jupyter notebookは

  • python やRを使った開発
  • グラフをプロットしながらデータをこねくり回すデータサイエンス・機械学習的な作業
  • 流行りのデープラーニング

などで非常に便利ですが、これらがすべて Emacs 上で行えるようになります


Emacs + jupyer + python の組み合わせのみ説明しますが,同じ方法で R や haskell も動作します

インストール

EIN( Emacs IPython Notebookの略)を使います

MELPAからインストールできます

M-x package-refresh-package
M-x package-install ein

インストール出来ない場合は MELPAを参照するように ~/.emacs などに以下の設定を1行加えます

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

カスタマイズ

ここが重要です.elpyと連携することで補完入力が有効になります

(use-package elpy
  :config
  (setq elpy-rpc-backend "jedi") ;;  python-jedi is required
  (setq elpy-rpc-python-command "python3")
  (setq python-shell-interpreter "python3")
  )
(use-package ein
  :config
  (setq ein:output-area-inlined-images t)
  ;;  Use elpy for auto completion
  (elpy-enable)
  :bind (
	 ("C-<return>" . ein:worksheet-execute-cell-km)
	 ("C-S-<up>"     . ein:worksheet-move-cell-up-km)
	 ("C-S-<down>"   . ein:worksheet-move-cell-down-km)
	 :map elpy-mode-map
	 ("C-<return>" . ein:worksheet-execute-cell-km)))

動作の仕組みとしては

  • ein は polymode を使っている
    • jupyter のセルの部分は elpy-mode それ以外のところは ein-mode で動作している
  • セルでのキーイベントは最初に elpy に渡り,elpyが無視したイベントが ein-mode に渡る

となります

ここで デフォルトの elpy は "C-<return>" をコマンドの実行に割り当てているので use-package の :bind で ein:worksheet-execute-cell-km に割り当てなおしています

elpyは初期設定が必要なので,初めてeplyを使う場合は

M-x elpy-config 

を一度実行して,手動で各種設定を済ませておきます


なお補完入力については

  • 2015年頃は company.el や auto-complete.el との連携を独自に実装していた
  • 2020年頃に 独自実装は廃止, elpy のような外部実装に丸投げする方針になった

ということのようです

また,作者曰く,lsp-mode との連携は考えてない,ということです

 (setq ein:use-auto-complete t) 

といった設定は、もうサポートされていません

使い方:基本

起動方法

Emacs から jupyter に接続 M-x ein:login
Emacs から jupyter を起動 .ipynb ファイルをEmacsで開いて C-c C-o

基本操作

セルのフォーカスを移動 Ctrl +<down>
Ctrl + <up>
セルを実行 Ctrl+enter
セルを実行 Alt+enter 実行後,カーソルは次のセルに移動
セルを移動 Ctrl+Shift +<down>
Ctrl+Shift + <up>
クラッチシート C-c C-/ nbextension の scratchpad に相当.
セルを作成せずにコードが実行できます

その他

jupyter を終了 M-x ein:stop

参考:デフォルトのキーマップ

Key binding 説明/補足
C-<down> ein:worksheet-goto-next-input-km 一つ上のセルに移動
C-<up> ein:worksheet-goto-prev-input-km 一つ下のセルに移動
M-S-<return> ein:worksheet-execute-cell-and-insert-below-km
M-<down> ein:worksheet-not-move-cell-down-km
M-<up> ein:worksheet-not-move-cell-up-km
C-x C-s ein:notebook-save-notebook-command-km
C-x C-w ein:notebook-rename-command-km
M-RET ein:worksheet-execute-cell-and-goto-next-km
M-, ein:pytools-jump-back-command
M-. ein:pytools-jump-to-source-command
C-c C-a ein:worksheet-insert-cell-above-km 一つ上に新規セルを挿入
C-c C-b ein:worksheet-insert-cell-below-km 一つ下に新規セルを挿入
C-c C-c ein:worksheet-execute-cell-km セルを実行
C-u C-c C-c ein:worksheet-execute-all-cells すべてのセルを実行
C-c C-e ein:worksheet-toggle-output-km
C-c C-f ein:file-open-km
C-c C-k ein:worksheet-kill-cell-km
C-c C-l ein:worksheet-clear-output-km
C-c RET ein:worksheet-merge-cell-km
C-c C-n ein:worksheet-goto-next-input-km
C-c C-o ein:notebook-open-km
C-c C-p ein:worksheet-goto-prev-input-km
C-c C-q ein:notebook-kill-kernel-then-close-command-km
C-c C-r ein:notebook-reconnect-session-command-km
C-c C-s ein:worksheet-split-cell-at-point-km
C-c C-t ein:worksheet-toggle-cell-type-km セルの種類を切り替える
C-c C-u ein:worksheet-change-cell-type-km
C-c C-v ein:worksheet-set-output-visibility-all-km
C-c C-w ein:worksheet-copy-cell-km
C-c C-y ein:worksheet-yank-cell-km
C-c C-z ein:notebook-kernel-interrupt-command-km
C-c C-S-l ein:worksheet-clear-all-output-km
C-c C-# ein:notebook-close-km
C-c C-$ ein:tb-show-km
C-c C-/ ein:notebook-scratchsheet-open-km
C-c C-; ein:shared-output-show-code-cell-at-point-km
C-c <down> ein:worksheet-move-cell-down-km
C-c <up> ein:worksheet-move-cell-up-km
C-c C-x C-r ein:notebook-restart-session-command-km
C-c M-w ein:worksheet-copy-cell-km