#+TITLE: IPython Notebook layer

* Table of Contents                                         :TOC_4_gh:noexport:
 - [[#description][Description]]
 - [[#features][Features]]
 - [[#list-of-todos][List of TODOS]]
   - [[#maybe-itd-be-better-if-there-was-a-state-for-this][Maybe it'd be better if there was a state for this]]
   - [[#make-more-keybinding-to-connect-to-a-python-buffer][Make more keybinding to =connect= to a python buffer]]
   - [[#deleting-visual-regions-dont-work-find-out-why][Deleting visual regions don't work, find out why]]
 - [[#install][Install]]
   - [[#layer][Layer]]
   - [[#dependencies][Dependencies]]
   - [[#what-needs-to-be-run][What needs to be run]]
 - [[#using-the-ipython-notebook][Using the IPython notebook]]
   - [[#open-notebook-list][Open Notebook List]]
   - [[#key-bindings][Key Bindings]]
     - [[#transient-state-ipython-notebook][Transient-state: =ipython-notebook=]]
     - [[#normal-mode][Normal mode]]
     - [[#insert-mode][Insert mode]]
     - [[#traceback-mode][Traceback mode]]
 - [[#screenshots][Screenshots]]
   - [[#light][Light]]
   - [[#dark][Dark]]
 - [[#bonus][Bonus]]

* Description
This layer adds support for the package =emacs-ipython-notebook=.

Do not hesitate to check the original package README [[https://github.com/millejoh/emacs-ipython-notebook][here]]. Also the wiki has
lots of informative stuff.

* Features
- Keybindings available through transient-state or leader key
- Lazy-loading

* List of TODOS
This is a WIP, feel free to collaborate.

** TODO Maybe it'd be better if there was a state for this
** TODO Make more keybinding to =connect= to a python buffer
** TODO Deleting visual regions don't work, find out why

* Install
** Layer
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =ipython-notebook= to the existing =dotspacemacs-configuration-layers= list
in this file.

** Dependencies
Install IPython Notebook > 3
#+begin_src sh
  pip install ipython[notebook]
#+end_src

** What needs to be run
Have an IPython notebook running
#+begin_src sh
  ipython notebook
#+end_src

* Using the IPython notebook
** Open Notebook List
This layer is lazy loaded so the transient-state will only work after you summon the
command =ein:notebooklist-open= which is bound to ~SPC a i n~

** Key Bindings
The key bindings can be used through a transient state or the usual evil-leader.

*** Transient-state: =ipython-notebook=
Once you are in the ipython notebook you can activate the transient-state with
~SPC m .~

The following table lists the keys. Use them as listed in the transient-state or
prefix with ~SPC m~ to use with your evil-leader.

| Key     | Function                                  |
|---------+-------------------------------------------|
| ~h~     | ein:notebook-worksheet-open-prev-or-last  |
| ~j~     | ein:worksheet-goto-next-input             |
| ~k~     | ein:worksheet-goto-prev-input             |
| ~l~     | ein:notebook-worksheet-open-next-or-first |
| ~H~     | ein:notebook-worksheet-move-prev          |
| ~J~     | ein:worksheet-move-cell-down              |
| ~K~     | ein:worksheet-move-cell-up                |
| ~L~     | ein:notebook-worksheet-move-next          |
| ~t~     | ein:worksheet-toggle-output               |
| ~d~     | ein:worksheet-kill-cell                   |
| ~R~     | ein:worksheet-rename-sheet                |
| ~y~     | ein:worksheet-copy-cell                   |
| ~p~     | ein:worksheet-yank-cell                   |
| ~i~     | ein:worksheet-insert-cell-below           |
| ~I~     | ein:worksheet-insert-cell-above           |
| ~u~     | ein:worksheet-change-cell-type            |
| ~RET~   | ein:worksheet-execute-cell-and-goto-next  |
| ~C-l~   | ein:worksheet-clear-output                |
| ~C-S-l~ | ein:worksheet-clear-all-output            |
| ~C-o~   | ein:console-open                          |
| ~C-k~   | ein:worksheet-merge-cell                  |
| ~C-j~   | spacemacs/ein:worksheet-merge-cell-next   |
| ~C-s~   | ein:notebook-save-notebook-command        |
| ~C-r~   | ein:notebook-rename-command               |
| ~1~     | ein:notebook-worksheet-open-1th           |
| ~2~     | ein:notebook-worksheet-open-2th           |
| ~3~     | ein:notebook-worksheet-open-3th           |
| ~4~     | ein:notebook-worksheet-open-4th           |
| ~5~     | ein:notebook-worksheet-open-5th           |
| ~6~     | ein:notebook-worksheet-open-6th           |
| ~7~     | ein:notebook-worksheet-open-7th           |
| ~8~     | ein:notebook-worksheet-open-8th           |
| ~9~     | ein:notebook-worksheet-open-last          |
| ~+~     | ein:notebook-worksheet-insert-next        |
| ~-~     | ein:notebook-worksheet-delete             |
| ~x~     | ein:notebook-close                        |

*** Normal mode
In normal mode the following key bindings are defined:

| Key     | Function                                 |
|---------+------------------------------------------|
| ~gj~    | ein:worksheet-goto-next-input            |
| ~gk~    | ein:worksheet-goto-prev-input            |
| ~C-RET~ | ein:worksheet-execute-cell               |
| ~S-RET~ | ein:worksheet-execute-cell-and-goto-next |

Also ~SPC f s~ saves the notebook like you would a regular buffer.

*** Insert mode
In normal mode the following key bindings are defined:

| Key     | Function                                 |
|---------+------------------------------------------|
| ~C-RET~ | ein:worksheet-execute-cell               |
| ~S-RET~ | ein:worksheet-execute-cell-and-goto-next |

*** Traceback mode
In traceback mode the following key bindings are defined:

| key   | Function                               |
|-------+----------------------------------------|
| ~RET~ | ein:tb-jump-to-source-at-point-command |
| ~n~   | ein:tb-next-item                       |
| ~p~   | ein:tb-prev-item                       |
| ~q~   | bury-buffer                            |

* Screenshots
** Light
#+attr_html: :width 400px
[[file:img/light.png]]

** Dark
#+attr_html: :width 400px
[[file:img/dark.png]]

* Bonus
If you want to have a matplotlibrc that looks good with a dark background try
using [[file:matplotlibrc][this]] =matplotlibrc=. Plot background is always transparent by default so
it will look okay for most dark themes out there.
