TITLE: Python conda virtual environment in bash prompt
DATE: 2019-02-28
AUTHOR: John L. Godlee
====================================================================


I was forced to use the python package manager conda for some work,
as it proved to be the easiest way to install a certain python
module. A nice thing about conda is the ability to set up multiple
virtual environments which can each use different versions of python
modules. You can set a conda virtual environment with:

    conda create -n envname 

There are also lots of other options to set such as the python
version (python=3.6).

Then the environment is activated with:

    source activate envname

By default, conda puts the name of the virtual environment (envname)
at the start of the PS1 bash prompt. For those of us with customised
bash prompts, this can look really ugly. For instance, my prompt
normally looks like this:

    ┏[02:17:31] johngodlee@Johns-MBP ~ [mac_master=] 
    ┗$

But with conda’s defaults it looks like this:

    (lidar)┏[02:17:31] johngodlee@Johns-MBP ~ [mac_master=] 
    ┗$

It would be nice to put the environment name somewhere else in the
prompt, which is what I set out to do. So the first things to do is
to stop conda putting the env name at the start of the prompt. Edit
~/.condarc to include:

    changeps1: false

Then in ~/.bash_profile (or ~/.bashrc if on Linux), add the
following function above the PS1= lines:

    get_conda_env ()
    {
        if [ ! -z "$CONDA_DEFAULT_ENV" ]; then
            printf -- "%s" "($CONDA_DEFAULT_ENV)"
        else
            printf -- "%s" ""
        fi
    }

Then in the PS1= lines it’s simple to just call the variable created
by get_conda_env():

    PS1='$(check_conda_env)'

y bash prompt definition currently looks like this:

    PS1='┏' # Elbow
    PS1+='[\T]' # Time
    PS1+=' '    # Space 
    PS1+='\u@\h'    # User@hostname
    PS1+=' '    # Space
    PS1+='\[\e[31m\]\w\[\e[m\]' # current dir
    PS1+=' '    # Space
    PS1+='\[\e[96m\]$(__git_ps1 "[%s]")\[\e[m\]'  # git branch
    PS1+=' '    # Space
    PS1+='\[\e[34m\]$(get_conda_env)\[\e[m\]'  # conda env
    PS1+=' '    # Space
    PS1+='\n'   # New line
    PS1+='┗'    # Elbow
    PS1+='$'    # $
    PS1+=' '    # Space

And looks like this:

    ┏[02:17:31] johngodlee@Johns-MBP ~ [mac_master=] (envname)
    ┗$