A next browser mode for editing Jupyter Notebooks.
NOTE: This is largely a WIP, with features added on the fly as I find myself wanting them during my day to day work.
For more information on next-browser, see:
- https://github.com/next-browser/next
- https://github.com/atlas-engineer/next/blob/master/documents/MANUAL.org
I'm not sure if there's a prescribed mechanism for adding
user packages to next, but I think you should be able to just (load "/path/to/jupyter-nb-mode.lisp") somewhere in your init.lisp. Then, navigate to the
URL of a running notebook server in next, open a .ipynb file, and then
call M-x jupyter-nb-mode from the notebook's buffer.
The command edit-cell will open the selected cell's contents in a new Emacs
buffer. The cell contents are transfered between Next and Emacs by means of a
temporary file, whose extension is chosen based on the selected cell's
type. code cells are assigned .py extensions, markdown cells .md, and
raw cells .txt. Thus, when the cell's contents are opened in Emacs, the
associated buffer should already be setup with the correct mode(s) for
editing that sort of text.
Similarly, you can edit the selected cell's metadata with the command
edit-cell-metadata, which will spawn a .JSON temp file.
Editing environments based on a package like python-mode or elpy will be
completely unaware of what's going on in the notebook kernel's namespace, so
the linter will probably complain about references that weren't imported or
defined in the active cell. One possible solution to this that I'd like to
try (and which I think could potentially be really slick), is to setup
jupyter-mode as the .py editing environment in Emacs, and then configure it
to hook into the active notebook's kernel.
There's a lot of work to be done on this front, but at the moment you can bind
the commands select-next-cell and select-prev-cell. Execution can be done
through execute-selected-cells and execute-all-cells. There are a bunch
of other commands for navigation, cell-insertion, copying, pasting, saving,
etc… I basically add these as I find myself wishing they existed.
As an Evil user whose never spent a significant amount of time around the
vanilla Emacs keybindings, I've really only defined a vi-map for this
(there's an emacs-map but it's pretty sparse). If anybody out there is
actually using this, suggestions for sensible non-evil Emacs users are
appreciated.
NOTE: In the vi-map, I have bound o and O to insert a cell below/above
the currently selected cell (resp.), which overrides the default root-mode
bindings for set-url-current-buffer and set-url-new-buffer.