Ipython-Prompt

I have a post on starship where I have some notes on how I use starship to make my zsh experience great with a sweet terminal prompt.

Now... I spend quite a bit of time in ipython every day and I got kind of sick of the vanilla experience and wanted something that more closely matched my starship prompt.

There's more to customizing ipython I know for sure but here's 2 things I have going for me...

  1. I use rich authored by @Will McGugan which makes much of my ipython experience great. I won't write about that here but you can find my rich config here

  2. I used pygments to customize the ipython prompt with my ipython_config.py and a startup script, next to my rich one, called 99-prompt.py.

The scripts inside ~/.ipython/<profile>/startup are executed in lexigraphical order, so it's nice to name things in the 10's to give room for adding scripts in between others down the line.

My prompt

My zsh prompt looks a little something like this:

starship

And after my ipython customiztion it currently (subject to much change but this is as of my dotfiles commit #d22088f6be81a58b5f7dfb73b7a4088cbdd9fece on main).

ipython

Now in ipython I have an indicator of my working directory, git branch, python environment, and a note that I'm in ipython and not zsh. I also configured my prompt to warn me if I'm not in a git directory!

ipython-ng

All in all the customization isn't too bad with just 2 specific files.

ipython_config.py

There's several use cases for ipython_config.py files in several areas on a pc - sometimes you want a common config across users, so you'd drop one in /etc/ipython and othertimes you have your own which is probably at ~/.ipython

My ipython config mostly has colors defined on pygment tokens plus a few autorun commands and pyflyby (see my friend Waylon's post on pyflyby here)

I wanted to match my ipython somewhat to my tmux and vim color schemes, which I model after the vim-airline theme night owl.

After picking some some colors and saving variables it's a matter of setting colors per token and then referencing those tokens in your version of 99-prompt.py.

You can check out my ipython_config.py here

For example, I can set Token.Name.Function to black, and in ipython then a function's definition will appear in black text. I set mine to cyan to match my theme.

For the prompt colors just match the keyword in c.TerminalInteractiveShell.highlighting_style_overrides with what is referenced inside 99-prompt.py

For example, Token.Prompt is set to bold grey which gives me the bold chevron symbol you see in the above image that looks like my zsh prompt

Then in 99-prompt.py I have this set for the prompt:

Token.Prompt "❯ "

99-prompt.py

You don't need to name your script 99-prompt.py, but I wanted to know that it was for my prompt and I wanted it executed last so it made sense.

Here I have MyPrompt class with the prompt symbol defined as above and several other things...

class MyPrompt(Prompts):
    def in_prompt_tokens(self, cli=None):
        return [
            (Token, ""),
            (Token.OutPrompt, Path().absolute().stem),
            (Token, " "),
            (Token.Generic.Subheading, get_branch()[0]),
            (Token, " "),
            (Token.Generic.Heading, get_branch()[1]),
            (Token, " "),
            (Token.Name.Class, "via " + get_venv()),
            (Token, " "),
            (Token.Name.Entity, "ipython"),
            (Token, "\n"),
            (
                Token.Prompt
                if self.shell.last_execution_succeeded
                else Token.Generic.Error,
                "❯ ",
            ),
        ]

Notice I have 2 custom functions here, get_branch and get_venv which grab some git info and python env info and return strings I can dump into my prompt as shown above.

To finish you drop ip = get_ipython() and ip.prompts = MyPrompt(ip) at the bottom of your prompt script and you should be in custom prompt city!

End

This is more or less notes for myself on how this works - drop by my ipython config in my dotfiles repo to see my full configs for ipython!