Emacs IPython Notebook (EIN) lets you run Jupyter (formerly IPython) notebooks within Emacs. It channels all the power of Emacs without the idiosyncrasies of in-browser editing.
No require statements, e.g. (require 'ein)
, are necessary, contrary to the
prevailing documentation, which should be disregarded.
Org users please find ob-ein, a jupyter Babel backend.
EIN was originally written by [tkf]. A jupyter Babel backend was first introduced by [gregsexton].
As described in Getting started, ensure melpa's whereabouts in init.el
or .emacs
:
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
Then
M-x package-refresh-contents RET M-x package-install RET ein RET
Alternatively, directly clone this repo and make install
.
Start EIN using ONE of the following:
- Open an
.ipynb
file normally in emacs and pressC-c C-o
, or, M-x ein:run
launches a jupyter process from emacs, or,M-x ein:login
to a running jupyter server
Use C-u M-x ein:login
for services such as mybinder.org
requiring cookie authentication.
Alternatively, ob-ein.
- ... report a bug?
File an issue using
M-x ein:dev-bug-report-template
.First try
emacs -Q -f package-initialize --eval "(setq debug-on-error t)"
and reproduce the bug. The-Q
skips any user configuration that might interfere with EIN.Note EIN is tested only for released GNU Emacs versions 25.1 and later. Pre-release versions are unlikely to work.
- ... display images inline?
We find inserting images into emacs disruptive, and so default to spawning an external viewer. To override this,
M-x customize-group RET ein Ein:Output Area Inlined Images
- ... configure the external image viewer?
M-x customize-group RET mailcap Mailcap User Mime Data
- ... get IDE-like behavior?
- The official python module for EIN is elpy, installed separately. Other program modes for non-python kernels may be installed with varying degrees of EIN compatibility.
- ... send expressions from a python buffer to a running kernel?
- Unpublicized keybindings exclusively for the Python language
C-c C-/ e
andC-c C-/ r
send the current statement or region respectively to a running kernel. If the region is not set,C-c C-/ r
sends the entire buffer. You must manually inspect the*ein:shared output*
buffer for errors.
Configuration:
M-x customize-group RET org-babel Org Babel Load Languages: Insert (ein . t) For example, '((emacs-lisp . t) (ein . t))
Snippet:
#BEGIN_SRC ein-python :session localhost import numpy, math, matplotlib.pyplot as plt %matplotlib inline x = numpy.linspace(0, 2*math.pi) plt.plot(x, numpy.sin(x)) #+END_SRC
The :session
is the notebook url, e.g., http://localhost:8888/my.ipynb
, or simply localhost
, in which case org evaluates anonymously. A port may also be specified, e.g., localhost:8889
.
Language can be ein-python
, ein-r
, or ein-julia
. The relevant jupyter kernel must be installed before use. Additional languages can be configured via:
M-x customize-group RET ein Ob Ein Languages
key binding --- ------- C-c Prefix Command C-x Prefix Command ESC Prefix Command <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-x Prefix Command C-c C-y ein:worksheet-yank-cell-km C-c C-z ein:notebook-kernel-interrupt-command-km C-c ESC Prefix Command C-c ! ein:worksheet-rename-sheet-km C-c + ein:notebook-worksheet-insert-next-km C-c - ein:notebook-worksheet-delete-km C-c 1 ein:notebook-worksheet-open-1th-km C-c 2 ein:notebook-worksheet-open-2th-km C-c 3 ein:notebook-worksheet-open-3th-km C-c 4 ein:notebook-worksheet-open-4th-km C-c 5 ein:notebook-worksheet-open-5th-km C-c 6 ein:notebook-worksheet-open-6th-km C-c 7 ein:notebook-worksheet-open-7th-km C-c 8 ein:notebook-worksheet-open-8th-km C-c 9 ein:notebook-worksheet-open-last-km C-c { ein:notebook-worksheet-open-prev-or-last-km C-c } ein:notebook-worksheet-open-next-or-first-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-+ ein:notebook-worksheet-insert-prev-km C-c M-w ein:worksheet-copy-cell-km C-c M-{ ein:notebook-worksheet-move-prev-km C-c M-} ein:notebook-worksheet-move-next-km