How to Copy from IPython session without terminal prompts
So, I have finally found a great solution that is essentially exactly what I wanted: Use Vi mode in IPython. On version 5, this requires:
$ ipython --TerminalInteractiveShell.editing_mode=vi
Now I can use handy vi-like visual mode and yank whatever I need!
Which leads to the following new alias in my .bash_profile/.bash_rc:
alias vpython='ipython --TerminalInteractiveShell.editing_mode=vi'
You can use the %history
magic to extract the interesting parts from your session. They will be shown in terminal without any of the junk.
Example
In [1]: import numpy as np
In [2]: a = np.random(10)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-83ce219ad17b> in <module>()
----> 1 a = np.random(10)
TypeError: 'module' object is not callable
In [3]: a = np.random.random(10)
In [4]: for i in a:
...: print(i)
...:
0.688626523886
[...]
0.341394850998
If I want to save a part of the session above I can use:
In [5]: %history 1 3-4
import numpy as np
a = np.random.random(10)
for i in a:
print(i)
In the example above I used %history 1 3-4
to assemble all the commands I want to keep and omit the ones I do not need (Line 2, the one with the error). Now you have version of your session that can be nicely copied.
Writing a file
You can also directly write this to file using the -f FILENAME
as parameter.
In [8]: %history 1 3-4 -f /tmp/foo.py
Be careful though, this will overwrite existing files.
More Details can be found in the documentation of the %history
magic.