.. _customization:

========================
Customization of IPython
========================

There are 2 ways to configure IPython - the old way of using ipythonrc
files (an INI-file like format), and the new way that involves editing
your ipy_user_conf.py. Both configuration systems work at the same
time, so you can set your options in both, but if you are hesitating
about which alternative to choose, we recommend the ipy_user_conf.py
approach, as it will give you more power and control in the long
run. However, there are few options such as pylab_import_all that can
only be specified in ipythonrc file or command line - the reason for
this is that they are needed before IPython has been started up, and
the IPApi object used in ipy_user_conf.py is not yet available at that
time. A hybrid approach of specifying a few options in ipythonrc and
doing the more advanced configuration in ipy_user_conf.py is also
possible.

.. _ipythonrc:

The ipythonrc approach
======================

As we've already mentioned, IPython reads a configuration file which can
be specified at the command line (-rcfile) or which by default is
assumed to be called ipythonrc. Such a file is looked for in the current
directory where IPython is started and then in your IPYTHONDIR, which
allows you to have local configuration files for specific projects. In
this section we will call these types of configuration files simply
rcfiles (short for resource configuration file).

The syntax of an rcfile is one of key-value pairs separated by
whitespace, one per line. Lines beginning with a # are ignored as
comments, but comments can not be put on lines with data (the parser is
fairly primitive). Note that these are not python files, and this is
deliberate, because it allows us to do some things which would be quite
tricky to implement if they were normal python files.

First, an rcfile can contain permanent default values for almost all command
line options (except things like -help or -Version). :ref:`This section
<command_line_options>` contains a description of all command-line
options. However, values you explicitly specify at the command line override
the values defined in the rcfile.

Besides command line option values, the rcfile can specify values for
certain extra special options which are not available at the command
line. These options are briefly described below.

Each of these options may appear as many times as you need it in the file.

    * include <file1> <file2> ...: you can name other rcfiles you want
      to recursively load up to 15 levels (don't use the <> brackets in
      your names!). This feature allows you to define a 'base' rcfile
      with general options and special-purpose files which can be loaded
      only when needed with particular configuration options. To make
      this more convenient, IPython accepts the -profile <name> option
      (abbreviates to -p <name>) which tells it to look for an rcfile
      named ipythonrc-<name>.
    * import_mod <mod1> <mod2> ...: import modules with 'import
      <mod1>,<mod2>,...'
    * import_some <mod> <f1> <f2> ...: import functions with 'from
      <mod> import <f1>,<f2>,...'
    * import_all <mod1> <mod2> ...: for each module listed import
      functions with ``from <mod> import *``.
    * execute <python code>: give any single-line python code to be
      executed.
    * execfile <filename>: execute the python file given with an
      'execfile(filename)' command. Username expansion is performed on
      the given names. So if you need any amount of extra fancy
      customization that won't fit in any of the above 'canned' options,
      you can just put it in a separate python file and execute it.
    * alias <alias_def>: this is equivalent to calling
      '%alias <alias_def>' at the IPython command line. This way, from
      within IPython you can do common system tasks without having to
      exit it or use the ! escape. IPython isn't meant to be a shell
      replacement, but it is often very useful to be able to do things
      with files while testing code. This gives you the flexibility to
      have within IPython any aliases you may be used to under your
      normal system shell.

ipy_user_conf.py
================

There should be a simple template ipy_user_conf.py file in your
~/.ipython directory. It is a plain python module that is imported
during IPython startup, so you can do pretty much what you want there
- import modules, configure extensions, change options, define magic
commands, put variables and functions in the IPython namespace,
etc. You use the IPython extension api object, acquired by
IPython.ipapi.get() and documented in the "IPython extension API"
chapter, to interact with IPython. A sample ipy_user_conf.py is listed
below for reference::

    # Most of your config files and extensions will probably start
    # with this import

    import IPython.ipapi
    ip = IPython.ipapi.get()

    # You probably want to uncomment this if you did %upgrade -nolegacy
    # import ipy_defaults    

    import os   

    def main():   

        #ip.dbg.debugmode = True
        ip.dbg.debug_stack()

        # uncomment if you want to get ipython -p sh behaviour
        # without having to use command line switches  
        import ipy_profile_sh
        import jobctrl

        # Configure your favourite editor?
        # Good idea e.g. for %edit os.path.isfile

        #import ipy_editors

        # Choose one of these:

        #ipy_editors.scite()
        #ipy_editors.scite('c:/opt/scite/scite.exe')
        #ipy_editors.komodo()
        #ipy_editors.idle()
        # ... or many others, try 'ipy_editors??' after import to see them

        # Or roll your own:
        #ipy_editors.install_editor("c:/opt/jed +$line $file")


        o = ip.options
        # An example on how to set options
        #o.autocall = 1
        o.system_verbose = 0

        #import_all("os sys")
        #execf('~/_ipython/ns.py')


        # -- prompt
        # A different, more compact set of prompts from the default ones, that
        # always show your current location in the filesystem:

        #o.prompt_in1 = r'\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Normal\n\C_Green|\#>'
        #o.prompt_in2 = r'.\D: '
        #o.prompt_out = r'[\#] '

        # Try one of these color settings if you can't read the text easily
        # autoexec is a list of IPython commands to execute on startup
        #o.autoexec.append('%colors LightBG')
        #o.autoexec.append('%colors NoColor')
        o.autoexec.append('%colors Linux')


    # some config helper functions you can use 
    def import_all(modules):
        """ Usage: import_all("os sys") """ 
        for m in modules.split():
            ip.ex("from %s import *" % m)

    def execf(fname):
        """ Execute a file in user namespace """
        ip.ex('execfile("%s")' % os.path.expanduser(fname))

    main()

.. _Prompts:

Fine-tuning your prompt
=======================

IPython's prompts can be customized using a syntax similar to that of
the bash shell. Many of bash's escapes are supported, as well as a few
additional ones. We list them below::

    \#
        the prompt/history count number. This escape is automatically
        wrapped in the coloring codes for the currently active color scheme. 
    \N
        the 'naked' prompt/history count number: this is just the number
        itself, without any coloring applied to it. This lets you produce
        numbered prompts with your own colors. 
    \D
        the prompt/history count, with the actual digits replaced by dots.
        Used mainly in continuation prompts (prompt_in2) 
    \w
        the current working directory 
    \W
        the basename of current working directory 
    \Xn
        where $n=0\ldots5.$ The current working directory, with $HOME
        replaced by ~, and filtered out to contain only $n$ path elements 
    \Yn
        Similar to \Xn, but with the $n+1$ element included if it is ~ (this
        is similar to the behavior of the %cn escapes in tcsh) 
    \u
        the username of the current user 
    \$
        if the effective UID is 0, a #, otherwise a $ 
    \h
        the hostname up to the first '.' 
    \H
        the hostname 
    \n
        a newline 
    \r
        a carriage return 
    \v
        IPython version string 

In addition to these, ANSI color escapes can be insterted into the
prompts, as \C_ColorName. The list of valid color names is: Black, Blue,
Brown, Cyan, DarkGray, Green, LightBlue, LightCyan, LightGray,
LightGreen, LightPurple, LightRed, NoColor, Normal, Purple, Red, White,
Yellow.

Finally, IPython supports the evaluation of arbitrary expressions in
your prompt string. The prompt strings are evaluated through the syntax
of PEP 215, but basically you can use $x.y to expand the value of x.y,
and for more complicated expressions you can use braces: ${foo()+x} will
call function foo and add to it the value of x, before putting the
result into your prompt. For example, using
prompt_in1 '${commands.getoutput("uptime")}\nIn [\#]: ' 
will print the result of the uptime command on each prompt (assuming the
commands module has been imported in your ipythonrc file).


      Prompt examples

The following options in an ipythonrc file will give you IPython's
default prompts::

    prompt_in1 'In [\#]:' 
    prompt_in2 '   .\D.:' 
    prompt_out 'Out[\#]:'

which look like this::

    In [1]: 1+2 
    Out[1]: 3

    In [2]: for i in (1,2,3): 
       ...:    print i, 
       ...: 
    1 2 3

These will give you a very colorful prompt with path information::

    #prompt_in1 '\C_Red\u\C_Blue[\C_Cyan\Y1\C_Blue]\C_LightGreen\#>' 
    prompt_in2 ' ..\D>' 
    prompt_out '<\#>'

which look like this::

    fperez[~/ipython]1> 1+2 
                    <1> 3 
    fperez[~/ipython]2> for i in (1,2,3): 
                   ...>     print i, 
                   ...> 
    1 2 3


.. _Profiles:

IPython profiles
================

As we already mentioned, IPython supports the -profile command-line option (see
:ref:`here <command_line_options>`).  A profile is nothing more than a
particular configuration file like your basic ipythonrc one, but with
particular customizations for a specific purpose. When you start IPython with
'ipython -profile <name>', it assumes that in your IPYTHONDIR there is a file
called ipythonrc-<name> or ipy_profile_<name>.py, and loads it instead of the
normal ipythonrc.

This system allows you to maintain multiple configurations which load
modules, set options, define functions, etc. suitable for different
tasks and activate them in a very simple manner. In order to avoid
having to repeat all of your basic options (common things that don't
change such as your color preferences, for example), any profile can
include another configuration file. The most common way to use profiles
is then to have each one include your basic ipythonrc file as a starting
point, and then add further customizations.