##// END OF EJS Templates
Merge pull request #3366 from minrk/rmfrontend...
Merge pull request #3366 from minrk/rmfrontend remove long-dead zmq frontend.py and completer.py These were really just demos to begin with, and should never have been included as library code. closes #3365

File last commit:

r6143:fc389acd
r10832:bdf31d80 merge
Show More
new_design.lyx
1358 lines | 39.1 KiB | text/plain | TextLexer
#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass article
\begin_preamble
\usepackage{ae,aecompl}
\usepackage{hyperref}
\usepackage{html}
\end_preamble
\language english
\inputencoding auto
\fontscheme default
\graphics default
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 1
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\leftmargin 1.25in
\topmargin 1in
\rightmargin 1.25in
\bottommargin 1in
\secnumdepth 3
\tocdepth 3
\paragraph_separation skip
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
IPython
\newline
\size larger
New design notes
\layout Author
Fernando P�rez
\layout Section
Introduction
\layout Standard
This is a draft document with notes and ideas for the IPython rewrite.
The section order and structure of this document roughly reflects in which
order things should be done and what the dependencies are.
This document is mainly a draft for developers, a pdf version is provided
with the standard distribution in case regular users are interested and
wish to contribute ideas.
\layout Standard
A tentative plan for the future:
\layout Itemize
0.6.x series: in practice, enough people are using IPython for real work that
I think it warrants a higher number.
This series will continue to evolve with bugfixes and incremental improvements.
\layout Itemize
0.7.x series: (maybe) If resources allow, there may be a branch for 'unstable'
development, where the architectural rewrite may take place.
\layout Standard
However, I am starting to doubt it is feasible to keep two separate branches.
I am leaning more towards a
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
LyX
\end_inset
-like approach, where the main branch slowly transforms and evolves.
Having CVS support now makes this a reasonable alternative, as I don't
have to make pre-releases as often.
The active branch can remain the mainline of development, and users interested
in the bleeding-edge stuff can always grab the CVS code.
\layout Standard
Ideally, IPython should have a clean class setup that would allow further
extensions for special-purpose systems.
I view IPython as a base system that provides a great interactive environment
with full access to the Python language, and which could be used in many
different contexts.
The basic hooks are there: the magic extension syntax and the flexible
system of recursive configuration files and profiles.
But with a code as messy as the current one, nobody is going to touch it.
\layout Section
Immediate TODO and bug list
\layout Standard
Things that should be done for the current series, before starting major
changes.
\layout Itemize
Fix any bugs reported at the online bug tracker.
\layout Itemize
History bug: I often see that, under certain circumstances, the input history
is incorrect.
The problem is that so far, I've failed to find a simple way to reproduce
it consistently, so I can't easily track it down.
It seems to me that it happens when output is generated multiple times
for the same input (for i in range(10): i will do it).
But even this isn't reliable...
Ultimately the right solution for this is to cleanly separate the dataflow
for input/output history management; right now that happens all over the
place, which makes the code impossible to debug, and almost guaranteed
to be buggy in the first place.
\layout Itemize
\series bold
Redesign the output traps.
\series default
They cause problems when users try to execute code which relies on sys.stdout
being the 'true' sys.stdout.
They also prevent scripts which use raw_input() to work as command-line
arguments.
\newline
The best solution is probably to print the banner first, and then just execute
all the user code straight with no output traps at all.
Whatever comes out comes out.
This makes the ipython code actually simpler, and eliminates the problem
altogether.
\newline
These things need to be ripped out, they cause no end of problems.
For example, if user code requires acces to stdin during startup, the process
just hangs indefinitely.
For now I've just disabled them, and I'll live with the ugly error messages.
\layout Itemize
The prompt specials dictionary should be turned into a class which does
proper namespace management, since the prompt specials need to be evaluated
in a certain namespace.
Currently it's just globals, which need to be managed manually by code
below.
\layout Itemize
Fix coloring of prompts: the pysh color strings don't have any effect on
prompt numbers, b/c these are controlled by the global scheme.
Make the prompts fully user-definable, colors and all.
This is what I said to a user:
\newline
As far as the green
\backslash
#, this is a minor bug of the coloring code due to the vagaries of history.
While the color strings allow you to control the coloring of most elements,
there are a few which are still controlled by the old ipython internal
coloring code, which only accepts a global 'color scheme' choice.
So basically the input/output numbers are hardwired to the choice in the
color scheme, and there are only 'Linux', 'LightBG' and 'NoColor' schemes
to choose from.
\layout Itemize
Clean up FakeModule issues.
Currently, unittesting with embedded ipython breaks because a FakeModule
instance overwrites __main__.
Maybe ipython should revert back to using __main__ directly as the user
namespace? Handling a separate namespace is proving
\emph on
very
\emph default
tricky in all corner cases.
\layout Itemize
Make the output cache depth independent of the input one.
This way one can have say only the last 10 results stored and still have
a long input history/cache.
\layout Itemize
Fix the fact that importing a shell for embedding screws up the command-line
history.
This can be done by not importing the history file when the shell is already
inside ipython.
\layout Itemize
Lay out the class structure so that embedding into a gtk/wx/qt app is trivial,
much like the multithreaded gui shells now provide command-line coexistence
with the gui toolkits.
See
\begin_inset LatexCommand \url{http://www.livejournal.com/users/glyf/32396.html}
\end_inset
\layout Itemize
Get Holger's completer in, once he adds filename completion.
\layout Standard
Lower priority stuff:
\layout Itemize
Add @showopt/@setopt (decide name) for viewing/setting all options.
The existing option-setting magics should become aliases for setopt calls.
\layout Itemize
It would be nice to be able to continue with python stuff after an @ command.
For instance "@run something; test_stuff()" in order to test stuff even
faster.
Suggestion by Kasper Souren <Kasper.Souren@ircam.fr>
\layout Itemize
Run a 'first time wizard' which configures a few things for the user, such
as color_info, editor and the like.
\layout Itemize
Logging: @logstart and -log should start logfiles in ~.ipython, but with
unique names in case of collisions.
This would prevent ipython.log files all over while also allowing multiple
sessions.
Also the -log option should take an optional filename, instead of having
a separate -logfile option.
\newline
In general the logging system needs a serious cleanup.
Many functions now in Magic should be moved to Logger, and the magic @s
should be very simple wrappers to the Logger methods.
\layout Section
Lighten the code
\layout Standard
If we decide to base future versions of IPython on Python 2.3, which has
the new Optik module (called optparse), it should be possible to drop DPyGetOpt.
We should also remove the need for Itpl.
Another area for trimming is the Gnuplot stuff: much of that could be merged
into the mainline project.
\layout Standard
Double check whether we really need FlexCompleter.
This was written as an enhanced rlcompleter, but my patches went in for
python 2.2 (or 2.3, can't remember).
\layout Standard
With these changes we could shed a fair bit of code from the main trunk.
\layout Section
Unit testing
\layout Standard
All new code should use a testing framework.
Python seems to have very good testing facilities, I just need to learn
how to use them.
I should also check out QMTest at
\begin_inset LatexCommand \htmlurl{http://www.codesourcery.com/qm/qmtest}
\end_inset
, it sounds interesting (it's Python-based too).
\layout Section
Configuration system
\layout Standard
Move away from the current ipythonrc format to using standard python files
for configuration.
This will require users to be slightly more careful in their syntax, but
reduces code in IPython, is more in line with Python's normal form (using
the $PYTHONSTARTUP file) and allows much more flexibility.
I also think it's more 'pythonic', in using a single language for everything.
\layout Standard
Options can be set up with a function call which takes keywords and updates
the options Struct.
\layout Standard
In order to maintain the recursive inclusion system, write an 'include'
function which is basically a wrapper around safe_execfile().
Also for alias definitions an alias() function will do.
All functionality which we want to have at startup time for the users can
be wrapped in a small module so that config files look like:
\layout Standard
\family typewriter
from IPython.Startup import *
\newline
...
\newline
set_options(automagic=1,colors='NoColor',...)
\newline
...
\newline
include('mysetup.py')
\newline
...
\newline
alias('ls ls --color -l')
\newline
...
etc.
\layout Standard
Also, put
\series bold
all
\series default
aliases in here, out of the core code.
\layout Standard
The new system should allow for more seamless upgrading, so that:
\layout Itemize
It automatically recognizes when the config files need updating and does
the upgrade.
\layout Itemize
It simply adds the new options to the user's config file without overwriting
it.
The current system is annoying since users need to manually re-sync their
configuration after every update.
\layout Itemize
It detects obsolete options and informs the user to remove them from his
config file.
\layout Standard
Here's a copy of Arnd Baecker suggestions on the matter:
\layout Standard
1.) upgrade: it might be nice to have an "auto" upgrade procedure: i.e.
imagine that IPython is installed system-wide and gets upgraded, how does
a user know, that an upgrade of the stuff in ~/.ipython is necessary ? So
maybe one has to a keep a version number in ~/.ipython and if there is a
mismatch with the started ipython, then invoke the upgrade procedure.
\layout Standard
2.) upgrade: I find that replacing the old files in ~/.ipython (after copying
them to .old not optimal (for example, after every update, I have to change
my color settings (and some others) in ~/.ipython/ipthonrc).
So somehow keeping the old files and merging the new features would be
nice.
(but how to distinguish changes from version to version with changes made
by the user ?) For, example, I would have to change in GnuplotMagic.py gnuplot_m
ouse to 1 after every upgrade ...
\layout Standard
This is surely a minor point - also things will change during the "BIG"
rewrite, but maybe this is a point to keep in mind for this ?
\layout Standard
3.) upgrade: old, sometimes obsolete files stay in the ~/.ipython subdirectory.
(hmm, maybe one could move all these into some subdirectory, but which
name for that (via version-number ?) ?)
\layout Subsection
Command line options
\layout Standard
It would be great to design the command-line processing system so that it
can be dynamically modified in some easy way.
This would allow systems based on IPython to include their own command-line
processing to either extend or fully replace IPython's.
Probably moving to the new optparse library (also known as optik) will
make this a lot easier.
\layout Section
OS-dependent code
\layout Standard
Options which are OS-dependent (such as colors and aliases) should be loaded
via include files.
That is, the general file will have:
\layout Standard
\family typewriter
if os.name == 'posix':
\newline
include('ipythonrc-posix.py')
\newline
elif os.name == 'nt':
\newline
include('ipythonrc-nt.py')...
\layout Standard
In the
\family typewriter
-posix
\family default
,
\family typewriter
-nt
\family default
, etc.
files we'll set all os-specific options.
\layout Section
Merging with other shell systems
\layout Standard
This is listed before the big design issues, as it is something which should
be kept in mind when that design is made.
\layout Standard
The following shell systems are out there and I think the whole design of
IPython should try to be modular enough to make it possible to integrate
its features into these.
In all cases IPython should exist as a stand-alone, terminal based program.
But it would be great if users of these other shells (some of them which
have very nice features of their own, especially the graphical ones) could
keep their environment but gain IPython's features.
\layout List
\labelwidthstring 00.00.0000
IDLE This is the standard, distributed as part of Python.
\layout List
\labelwidthstring 00.00.0000
pyrepl
\begin_inset LatexCommand \htmlurl{http://starship.python.net/crew/mwh/hacks/pyrepl.html}
\end_inset
.
This is a text (curses-based) shell-like replacement which doesn't have
some of IPython's features, but has a crucially useful (and hard to implement)
one: full multi-line editing.
This turns the interactive interpreter into a true code testing and development
environment.
\layout List
\labelwidthstring 00.00.0000
PyCrust
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/pycrust}
\end_inset
.
Very nice, wxWindows based system.
\layout List
\labelwidthstring 00.00.0000
PythonWin
\begin_inset LatexCommand \htmlurl{http://starship.python.net/crew/mhammond}
\end_inset
.
Similar to PyCrust in some respects, a very good and free Python development
environment for Windows systems.
\layout Section
Class design
\layout Standard
This is the big one.
Currently classes use each other in a very messy way, poking inside one
another for data and methods.
ipmaker() adds tons of stuff to the main __IP instance by hand, and the
mix-ins used (Logger, Magic, etc) mean the final __IP instance has a million
things in it.
All that needs to be cleanly broken down with well defined interfaces amongst
the different classes, and probably no mix-ins.
\layout Standard
The best approach is probably to have all the sub-systems which are currently
mixins be fully independent classes which talk back only to the main instance
(and
\series bold
not
\series default
to each other).
In the main instance there should be an object whose job is to handle communica
tion with the sub-systems.
\layout Standard
I should probably learn a little UML and diagram this whole thing before
I start coding.
\layout Subsection
Magic
\layout Standard
Now all methods which will become publicly available are called Magic.magic_name,
the magic_ should go away.
Then, Magic instead of being a mix-in should simply be an attribute of
__IP:
\layout Standard
__IP.Magic = Magic()
\layout Standard
This will then give all the magic functions as __IP.Magic.name(), which is
much cleaner.
This will also force a better separation so that Magic doesn't poke inside
__IP so much.
In the constructor, Magic should get whatever information it needs to know
about __IP (even if it means a pointer to __IP itself, but at least we'll
know where it is.
Right now since it's a mix-in, there's no way to know which variables belong
to whom).
\layout Standard
Build a class MagicFunction so that adding new functions is a matter of:
\layout Standard
\family typewriter
my_magic = MagicFunction(category = 'System utilities')
\newline
my_magic.__call__ = ...
\layout Standard
Features:
\layout Itemize
The class constructor should automatically register the functions and keep
a table with category sections for easy sorting/viewing.
\layout Itemize
The object interface must allow automatic building of a GUI for them.
This requires registering the options the command takes, the number of
arguments, etc, in a formal way.
The advantage of this approach is that it allows not only to add GUIs to
the magics, but also for a much more intelligent building of docstrings,
and better parsing of options and arguments.
\layout Standard
Also think through better an alias system for magics.
Since the magic system is like a command shell inside ipython, the relation
between these aliases and system aliases should be cleanly thought out.
\layout Subsection
Color schemes
\layout Standard
These should be loaded from some kind of resource file so they are easier
to modify by the user.
\layout Section
Hooks
\layout Standard
IPython should have a modular system where functions can register themselves
for certain tasks.
Currently changing functionality requires overriding certain specific methods,
there should be a clean API for this to be done.
\layout Subsection
whos hook
\layout Standard
This was a very nice suggestion from Alexander Schmolck <a.schmolck@gmx.net>:
\layout Standard
2.
I think it would also be very helpful if there where some sort of hook
for ``whos`` that let one customize display formaters depending on the
object type.
\layout Standard
For example I'd rather have a whos that formats an array like:
\layout Standard
\family typewriter
Variable Type Data/Length
\newline
------------------------------
\newline
a array size: 4x3 type: 'Float'
\layout Standard
than
\layout Standard
\family typewriter
Variable Type Data/Length
\newline
------------------------------
\newline
a array [[ 0.
1.
2.
3<...> 8.
9.
10.
11.]]
\layout Section
Parallel support
\layout Standard
For integration with graphical shells and other systems, it will be best
if ipython is split into a kernel/client model, much like Mathematica works.
This simultaneously opens the door for support of interactive parallel
computing.
Currenlty %bg provides a threads-based proof of concept, and Brian Granger's
XGrid project is a much more realistic such system.
The new design should integrates ideas as core elements.
Some notes from Brian on this topic:
\layout Standard
1.
How should the remote python server/kernel be designed? Multithreaded?
Blocking? Connected/disconnected modes? Load balancing?
\layout Standard
2.
What APi/protocol should the server/kernel expose to clients?
\layout Standard
3.
How should the client classes (which the user uses to interact with the
cluster) be designed?
\layout Standard
4.
What API should the client classes expose?
\layout Standard
5.
How should the client API be wrapped in a few simple magic functions?
\layout Standard
6.
How should security be handled?
\layout Standard
7.
How to work around the issues of the GIL and threads?
\layout Standard
I think the most important things to work out are the client API (#4) the
server/kernel API/protocol (#2) and the magic function API (#5).
We should let these determine the design and architecture of the components.
\layout Standard
One other thing.
What is your impression of twisted? I have been looking at it and it looks
like a _very_ powerful set of tools for this type of stuff.
I am wondering if it might make sense to think about using twisted for
this project.
\layout Section
Manuals
\layout Standard
The documentation should be generated from docstrings for the command line
args and all the magic commands.
Look into one of the simple text markup systems to see if we can get latex
(for reLyXing later) out of this.
Part of the build command would then be to make an update of the docs based
on this, thus giving more complete manual (and guaranteed to be in sync
with the code docstrings).
\layout Standard
[PARTLY DONE] At least now all magics are auto-documented, works farily
well.
Limited Latex formatting yet.
\layout Subsection
Integration with pydoc-help
\layout Standard
It should be possible to have access to the manual via the pydoc help system
somehow.
This might require subclassing the pydoc help, or figuring out how to add
the IPython docs in the right form so that help() finds them.
\layout Standard
Some comments from Arnd and my reply on this topic:
\layout Standard
> ((Generally I would like to have the nice documentation > more easily
accessable from within ipython ...
> Many people just don't read documentation, even if it is > as good as
the one of IPython ))
\layout Standard
That's an excellent point.
I've added a note to this effect in new_design.
Basically I'd like help() to naturally access the IPython docs.
Since they are already there in html for the user, it's probably a matter
of playing a bit with pydoc to tell it where to find them.
It would definitely make for a much cleaner system.
Right now the information on IPython is:
\layout Standard
-ipython --help at the command line: info on command line switches
\layout Standard
-? at the ipython prompt: overview of IPython
\layout Standard
-magic at the ipython prompt: overview of the magic system
\layout Standard
-external docs (html/pdf)
\layout Standard
All that should be better integrated seamlessly in the help() system, so
that you can simply say:
\layout Standard
help ipython -> full documentation access
\layout Standard
help magic -> magic overview
\layout Standard
help profile -> help on current profile
\layout Standard
help -> normal python help access.
\layout Section
Graphical object browsers
\layout Standard
I'd like a system for graphically browsing through objects.
\family typewriter
@obrowse
\family default
should open a widged with all the things which
\family typewriter
@who
\family default
lists, but cliking on each object would open a dedicated object viewer
(also accessible as
\family typewriter
@oview <object>
\family default
).
This object viewer could show a summary of what
\family typewriter
<object>?
\family default
currently shows, but also colorize source code and show it via an html
browser, show all attributes and methods of a given object (themselves
openable in their own viewers, since in Python everything is an object),
links to the parent classes, etc.
\layout Standard
The object viewer widget should be extensible, so that one can add methods
to view certain types of objects in a special way (for example, plotting
Numeric arrays via grace or gnuplot).
This would be very useful when using IPython as part of an interactive
complex system for working with certain types of data.
\layout Standard
I should look at what PyCrust has to offer along these lines, at least as
a starting point.
\layout Section
Miscellaneous small things
\layout Itemize
Collect whatever variables matter from the environment in some globals for
__IP, so we're not testing for them constantly (like $HOME, $TERM, etc.)
\layout Section
Session restoring
\layout Standard
I've convinced myself that session restore by log replay is too fragile
and tricky to ever work reliably.
Plus it can be dog slow.
I'd rather have a way of saving/restoring the *current* memory state of
IPython.
I tried with pickle but failed (can't pickle modules).
This seems the right way to do it to me, but it will have to wait until
someone tells me of a robust way of dumping/reloading *all* of the user
namespace in a file.
\layout Standard
Probably the best approach will be to pickle as much as possible and record
what can not be pickled for manual reload (such as modules).
This is not trivial to get to work reliably, so it's best left for after
the code restructuring.
\layout Standard
The following issues exist (old notes, see above paragraph for my current
take on the issue):
\layout Itemize
magic lines aren't properly re-executed when a log file is reloaded (and
some of them, like clear or run, may change the environment).
So session restore isn't 100% perfect.
\layout Itemize
auto-quote/parens lines aren't replayed either.
All this could be done, but it needs some work.
Basically it requires re-running the log through IPython itself, not through
python.
\layout Itemize
_p variables aren't restored with a session.
Fix: same as above.
\layout Section
Tips system
\layout Standard
It would be nice to have a tip() function which gives tips to users in some
situations, but keeps track of already-given tips so they aren't given
every time.
This could be done by pickling a dict of given tips to IPYTHONDIR.
\layout Section
TAB completer
\layout Standard
Some suggestions from Arnd Baecker:
\layout Standard
a) For file related commands (ls, cat, ...) it would be nice to be able to
TAB complete the files in the current directory.
(once you started typing something which is uniquely a file, this leads
to this effect, apart from going through the list of possible completions
...).
(I know that this point is in your documentation.)
\layout Standard
More general, this might lead to something like command specific completion
?
\layout Standard
Here's John Hunter's suggestion:
\layout Standard
The *right way to do it* would be to make intelligent or customizable choices
about which namespace to add to the completion list depending on the string
match up to the prompt, eg programmed completions.
In the simplest implementation, one would only complete on files and directorie
s if the line preceding the tab press matched 'cd ' or 'run ' (eg you don't
want callable showing up in 'cd ca<TAB>')
\layout Standard
In a more advanced scenario, you might imaging that functions supplied the
TAB namespace, and the user could configure a dictionary that mapped regular
expressions to namespace providing functions (with sensible defaults).
Something like
\layout Standard
completed = {
\newline
'^cd
\backslash
s+(.*)' : complete_files_and_dirs,
\newline
'^run
\backslash
s+(.*)' : complete_files_and_dirs,
\newline
'^run
\backslash
s+(-.*)' : complete_run_options,
\newline
}
\layout Standard
I don't know if this is feasible, but I really like programmed completions,
which I use extensively in tcsh.
My feeling is that something like this is eminently doable in ipython.
\layout Standard
/JDH
\layout Standard
For something like this to work cleanly, the magic command system needs
also a clean options framework, so all valid options for a given magic
can be extracted programatically.
\layout Section
Debugger
\layout Standard
Current system uses a minimally tweaked pdb.
Fine-tune it a bit, to provide at least:
\layout Itemize
Tab-completion in each stack frame.
See email to Chris Hart for details.
\layout Itemize
Object information via ? at least.
Break up magic_oinfo a bit so that pdb can call it without loading all
of IPython.
If possible, also have the other magics for object study: doc, source,
pdef and pfile.
\layout Itemize
Shell access via !
\layout Itemize
Syntax highlighting in listings.
Use py2html code, implement color schemes.
\layout Section
A Python-based system shell - pysh?
\layout Standard
Note: as of IPython 0.6.1, most of this functionality has actually been implemente
d.
\layout Standard
This section is meant as a working draft for discussions on the possibility
of having a python-based system shell.
It is the result of my own thinking about these issues as much of discussions
on the ipython lists.
I apologize in advance for not giving individual credit to the various
contributions, but right now I don't have the time to track down each message
from the archives.
So please consider this as the result of a collective effort by the ipython
user community.
\layout Standard
While IPython is (and will remain) a python shell first, it does offer a
fair amount of system access functionality:
\layout Standard
- ! and !! for direct system access,
\layout Standard
- magic commands which wrap various system commands,
\layout Standard
- @sc and @sx, for shell output capture into python variables,
\layout Standard
- @alias, for aliasing system commands.
\layout Standard
This has prompted many users, over time, to ask for a way of extending ipython
to the point where it could be used as a full-time replacement over typical
user shells like bash, csh or tcsh.
While my interest in ipython is such that I'll concentrate my personal
efforts on other fronts (debugging, architecture, improvements for scientific
use, gui access), I will be happy to do anything which could make such
a development possible.
It would be the responsibility of someone else to maintain the code, but
I would do all necessary architectural changes to ipython for such an extension
to be feasible.
\layout Standard
I'll try to outline here what I see as the key issues which need to be taken
into account.
This document should be considered an evolving draft.
Feel free to submit comments/improvements, even in the form of patches.
\layout Standard
In what follows, I'll represent the hypothetical python-based shell ('pysh'
for now) prompt with '>>'.
\layout Subsection
Basic design principles
\layout Standard
I think the basic design guideline should be the following: a hypothetical
python system shell should behave, as much as possible, like a normal shell
that users are familiar with (bash, tcsh, etc).
This means:
\layout Standard
1.
System commands can be issued directly at the prompt with no special syntax:
\layout Standard
>> ls
\layout Standard
>> xemacs
\layout Standard
should just work like a user expects.
\layout Standard
2.
The facilities of the python language should always be available, like
they are in ipython:
\layout Standard
>> 3+4
\newline
7
\layout Standard
3.
It should be possible to easily capture shell output into a variable.
bash and friends use backquotes, I think using a command (@sc) like ipython
currently does is an acceptable compromise.
\layout Standard
4.
It should also be possible to expand python variables/commands in the middle
of system commands.
I thihk this will make it necessary to use $var for name expansions:
\layout Standard
>> var='hello' # var is a Python variable
\newline
>> print var hello # This is the result of a Python print command
\newline
>> echo $var hello # This calls the echo command, expanding 'var'.
\layout Standard
5.
The above capabilities should remain possible for multi-line commands.
One of the most annoying things I find about tcsh, is that I never quite
remember the syntactic details of looping.
I often want to do something at the shell which involves a simple loop,
but I can never remember how to do it in tcsh.
This often means I just write a quick throwaway python script to do it
(Perl is great for this kind of quick things, but I've forgotten most its
syntax as well).
\layout Standard
It should be possible to write code like:
\layout Standard
>> for ext in ['.jpg','.gif']:
\newline
..
ls file$ext
\layout Standard
And have it work as 'ls file.jpg;ls file.gif'.
\layout Subsection
Smaller details
\layout Standard
If the above are considered as valid guiding principles for how such a python
system shell should behave, then some smaller considerations and comments
to keep in mind are listed below.
\layout Standard
- it's ok for shell builtins (in this case this includes the python language)
to override system commands on the path.
See tcsh's 'time' vs '/usr/bin/time'.
This settles the 'print' issue and related.
\layout Standard
- pysh should take
\layout Standard
foo args
\layout Standard
as a command if (foo args is NOT valid python) and (foo is in $PATH).
\layout Standard
If the user types
\layout Standard
>> ./foo args
\layout Standard
it should be considered a system command always.
\layout Standard
- _, __ and ___ should automatically remember the previous 3 outputs captured
from stdout.
In parallel, there should be _e, __e and ___e for stderr.
Whether capture is done as a single string or in list mode should be a
user preference.
If users have numbered prompts, ipython's full In/Out cache system should
be available.
\layout Standard
But regardless of how variables are captured, the printout should be like
that of a plain shell (without quotes or braces to indicate strings/lists).
The everyday 'feel' of pysh should be more that of bash/tcsh than that
of ipython.
\layout Standard
- filename completion first.
Tab completion could work like in ipython, but with the order of priorities
reversed: first files, then python names.
\layout Standard
- configuration via standard python files.
Instead of 'setenv' you'd simply write into the os.environ[] dictionary.
This assumes that IPython itself has been fixed to be configured via normal
python files, instead of the current clunky ipythonrc format.
\layout Standard
- IPython can already configure the prompt in fairly generic ways.
It should be able to generate almost any kind of prompt which bash/tcsh
can (within reason).
\layout Standard
- Keep the Magics system.
They provide a lightweight syntax for configuring and modifying the state
of the user's session itself.
Plus, they are an extensible system so why not give the users one more
tool which is fairly flexible by nature? Finally, having the @magic optional
syntax allows a user to always be able to access the shell's control system,
regardless of name collisions with defined variables or system commands.
\layout Standard
But we need to move all magic functionality into a protected namespace,
instead of the current messy name-mangling tricks (which don't scale well).
\layout Section
Future improvements
\layout Itemize
When from <mod> import * is used, first check the existing namespace and
at least issue a warning on screen if names are overwritten.
\layout Itemize
Auto indent? Done, for users with readline support.
\layout Subsection
Better completion a la zsh
\layout Standard
This was suggested by Arnd:
\layout Standard
> >\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
More general, this might lead to something like
\layout Standard
> >\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
command specific completion ?
\layout Standard
>
\layout Standard
> I'm not sure what you mean here.
\layout Standard
\SpecialChar ~
\layout Standard
Sorry, that was not understandable, indeed ...
\layout Standard
I thought of something like
\layout Standard
\SpecialChar ~
- cd and then use TAB to go through the list of directories
\layout Standard
\SpecialChar ~
- ls and then TAB to consider all files and directories
\layout Standard
\SpecialChar ~
- cat and TAB: only files (no directories ...)
\layout Standard
\SpecialChar ~
\layout Standard
For zsh things like this are established by defining in .zshrc
\layout Standard
\SpecialChar ~
\layout Standard
compctl -g '*.dvi' xdvi
\layout Standard
compctl -g '*.dvi' dvips
\layout Standard
compctl -g '*.tex' latex
\layout Standard
compctl -g '*.tex' tex
\layout Standard
...
\layout Section
Outline of steps
\layout Standard
Here's a rough outline of the order in which to start implementing the various
parts of the redesign.
The first 'test of success' should be a clean pychecker run (not the mess
we get right now).
\layout Itemize
Make Logger and Magic not be mixins but attributes of the main class.
\begin_deeper
\layout Itemize
Magic should have a pointer back to the main instance (even if this creates
a recursive structure) so it can control it with minimal message-passing
machinery.
\layout Itemize
Logger can be a standalone object, simply with a nice, clean interface.
\layout Itemize
Logger currently handles part of the prompt caching, but other parts of
that are in the prompts class itself.
Clean up.
\end_deeper
\layout Itemize
Change to python-based config system.
\layout Itemize
Move make_IPython() into the main shell class, as part of the constructor.
Do this
\emph on
after
\emph default
the config system has been changed, debugging will be a lot easier then.
\layout Itemize
Merge the embeddable class and the normal one into one.
After all, the standard ipython script
\emph on
is
\emph default
a python program with IPython embedded in it.
There's no need for two separate classes (
\emph on
maybe
\emph default
keep the old one around for the sake of backwards compatibility).
\layout Section
Ville Vainio's suggestions
\layout Standard
Some notes sent in by Ville Vainio
\family typewriter
<vivainio@kolumbus.fi>
\family default
on Tue, 29 Jun 2004.
Keep here for reference, some of it replicates things already said above.
\layout Standard
Current ipython seems to "special case" lots of stuff - aliases, magics
etc.
It would seem to yield itself to a simpler and more extensible architecture,
consisting of multple dictionaries, where just the order of search is determine
d by profile/prefix.
All the functionality would just be "pushed" to ipython core, i.e.
the objects that represent the functionality are instantiated on "plugins"
and they are registered with ipython core.
i.e.
\layout Standard
def magic_f(options, args): pass
\layout Standard
m = MyMagic(magic_f) m.arghandler = stockhandlers.OptParseArgHandler m.options
= ....
# optparse options, for easy passing to magic_f and help display
\layout Standard
# note that arghandler takes a peek at the instance, sees options, and proceeds
# accordingly.
Various arg handlers can ask for arbitrary options.
# some handler might optionally glob the filenames, search data folders
for filenames etc.
\layout Standard
ipythonregistry.register(category = "magic", name = "mymagic", obj = m)
\layout Standard
I bet most of the current functionality could easily be added to such a
registry by just instantiating e.g.
"Magic" class and registering all the functions with some sensible default
args.
Supporting legacy stuff in general would be easy - just implement new handlers
(arg and otherwise) for new stuff, and have the old handlers around forever
/ as long as is deemed appropriate.
The 'python' namespace (locals() + globals()) should be special, of course.
\layout Standard
It should be easy to have arbitrary number of "categories" (like 'magic',
'shellcommand','projectspecific_myproject', 'projectspecific_otherproject').
It would only influence the order in which the completions are suggested,
and in case of name collision which one is selected.
Also, I think all completions should be shown, even the ones in "later"
categories in the case of a match in an "earlier" category.
\layout Standard
The "functionality object" might also have a callable object 'expandarg',
and ipython would run it (with the arg index) when tab completion is attempted
after typing the function name.
It would return the possible completions for that particular command...
or None to "revert to default file completions".
Such functionality could be useful in making ipython an "operating console"
of a sort.
I'm talking about:
\layout Standard
>> lscat reactor # list commands in category - reactor is "project specific"
category
\layout Standard
r_operate
\layout Standard
>> r_operate <tab> start shutdown notify_meltdown evacuate
\layout Standard
>> r_operate shutdown <tab>
\layout Standard
1 2 5 6 # note that 3 and 4 are already shut down
\layout Standard
>> r_operate shutdown 2
\layout Standard
Shutting down..
ok.
\layout Standard
>> r_operate start <tab>
\layout Standard
2 3 4 # 2 was shut down, can be started now
\layout Standard
>> r_operate start 2
\layout Standard
Starting....
ok.
\layout Standard
I'm talking about having a super-configurable man-machine language here!
Like cmd.Cmd on steroids, as a free addition to ipython!
\the_end