A Python REPL the way I like it.
So instead I wrote my own. Turns out it’s really easy.
prompt-toolkit is a nice framework for creating custom REPLs. It took under an hour to create a basic Python REPL, and only a few days to add most of the features I like to it. REPLs created with prompt-toolkit are really nice. They support advanced features like syntax highlighting, multiline editing, and popup tab completion without any additional work (unlike REPLs based on readline).
- Fancy emoji numbered prompts.
- Multiline input, which “just works”
- Keyboard shortcuts configured exactly the way I like them.
- History search (M-Up/Down Arrow) can be used to combine multiple things from the history.
- Up/down automatically go to the top/bottom of multiline inputs from the history. Up+Enter intelligently executes.
- Outputs saved as
_2, etc.. Previous outputs saved in
- Support for bracketed paste (pasting stuff in the terminal “just works” without the need for any %paste magic or a special “paste” mode).
- prompts are stripped automatically from pasted text.
- Emacs command editing keybindings.
- Automatic syntax highlighting.
- Automatic highlighting of errors via pyflakes.
- On syntax error, the cursor is moved to the error.
- Matching and mismatching parentheses highlighting.
- Tracebacks for stuff defined interactively show the code line.
- Tab completion using Jedi and
- Per-terminal history.
- A nice theme (the same one I use in emacs, called “1am”, based on XCode’s “midnight”).
stuff?shows the help for
stuff. Works even if
stuffis a complex expression. Does the right thing for NumPy ufuncs.
stuff??shows the source for
stuff. Works even if
stuffwas defined interactively.
%timeitdisplays a histogram of times in the terminal (using iTerm2).
%doctestmode to emulate standard Python REPL (for copy-paste purposes).
%sympymagic (works like
%pyinstrumentmagic to run code with pyinstrument.
%line_profilermagic to run code with line_profiler.
%pudbmagic to run code in PuDB.
- Debugging functions defined interactively works.
- Integration as a custom shell for PuDB.
- SymPy objects automatically pretty print.
- Shell integration with iTerm2.
- GUI Matplotlib plots on macOS work correctly.
And some other stuff that I haven’t implemented yet.
Most of this stuff either comes for free from prompt-toolkit or was really easy to implement, in some cases by modifying some code from other libraries (ptpython, ipython, sympy, the Python standard library).
I haven’t packaged it yet. For now you can clone the repo and run
It requires the following packages, which can be installed from conda-forge:
- iterm2_tools (on Mac)
As well as some optional dependencies that are needed for some
You can install them using the requirements.txt file.
There is none. It’s already configured the way I like it.
Features and bugs and stuff
I wrote this for me. You can request features, submit PRs, and report bugs, but be aware that I won’t accept any PR unless it’s a feature I want. I’m really not designing this to be used by other people.
Thanks to Jonathan Slenders for prompt-toolkit and ptpython (which I borrowed some of the more tricky things like Python multiline and Jedi completion from). Basically all the fancy stuff here is coming from prompt-toolkit. I just combined it together into a REPL that I like. Thanks to the IPython guys for figuring out the matplotlib eventloop stuff (which I could never do on my own), and for inspiring many of the features I’ve implemented.
Licenses for code taken and modified from ptpython, IPython, prompt-toolkit, SymPy, and the Python standard library are at the top of the respective files.