1

I was a long time tcsh user and I have used a custom prompt, which includes the date/time, host, and a largish path. In the past, when I've used venv, I would switch to bash first, just because everything's geared toward bash, and I liked that the current environment would be added to the prompt, and I had left the bash prompt uncustomized. However, since I've been using bash more and more, I decided to migrate a version of my custom tcsh prompt. To do that, I added this to my bash profile:

changeprompt() { DIR=`dirs | perl -e '$p=scalar(<STDIN>);$p=~s/.*(?=\S{40}\Z)/.../;print($p)'`;export PS1="\h[\D{%F %T}]:$DIR\$ "; }
PROMPT_COMMAND="changeprompt"

It leaves me with a prompt like this:

gen-rl-macbookair[2021-02-12 14:01:24]:~/PROJECT-local/TRACEBASE$

I wanted a longer path in the prompt that is manually truncated with an ellipsis at a given length based on characters instead of directory depth, which is why I set PROMPT_COMMAND.

However, I realized yesterday when I started working on a venv for the first time in a long time, that activating a venv would not change the prompt to prepend (environment_name) to the prompt, since I had set PROMPT_COMMAND.

I fixed the issue by editing the activate script to unset COMMAND_PROMPT upon activate and reset COMMAND_PROMPT upon deactivate...

But I'm wondering if there exists a better way to maintain a custom command prompt like this that allows for a variably prepended string that a venv activate script adds - without needing custom edits to any activate script.

2
  • Problem is the activate venv setup script use PS1 instead of COMMAND_PROMPT
    – Welgriv
    May 12, 2021 at 13:48
  • Yeah. That's the problem. PS1 features don't support the feature I want of limiting the path length, which is why I use PROMPT_COMMAND. I want to see as many dirs of my path within 40 characters. That's what my PROMPT_COMMAND does. I think all I should need to do is store the old prompt command when a new env gets activated and restore it when deactivated. Or maybe I can change my prompt command to use the existing PS1 value, or modify it instead of set it.
    – hepcat72
    May 12, 2021 at 14:19

1 Answer 1

0

As a (bad) workaround, you can define bash functions that set and unset prefix for PS1, and call these when you activate/deactivate your venv instead of source activate and deactivate.

In your bashrc:

export PROMPT_PREFIX=
set_prompt_prefix(){
    PS1=$PROMPT_PREFIX$PS1
}

PROMPT_COMMAND='changeprompt && set_prompt_prefix'

activate_venv(){
    source activate && PROMPT_PREFIX="(venv) " && alias 'deactivate'='deactivate_venv'
}

deactivate_venv(){
    deactivate && PROMPT_PREFIX=
}

Then you have to call activate_venv instead of source activate. deactivate venv base function is aliased with my deactivate_venv so that prefix is always removed.

Beware that the prefix will always be (venv) . An even smarter solution could retrieve the venv name or directory and set it as prefix.

3
  • The venvs I have, have their own activate scripts that modify PS1 and add different prefixes. My error-prone workaround has been to edit those scripts to set/restore PROMPT_COMMAND, but other venvs tend to get in the way and I end up with stale prompts that don't update. Part of the problem (with my question) is I over-simplified the example. I should probably add more detail and examples to my question. Like, the activate scripts take a path, and switching between different venvs, etc.. This is a decent idea though.
    – hepcat72
    May 12, 2021 at 15:31
  • 1
    Editing each new venv you create seems really painful for me since it all supposed to be auto-generated. Problem root is that python does not consider any use case like ours when we are working with PROMPT_COMMAND is might be a good idea to ask for a change request or warn for a bug somewhere.
    – Welgriv
    May 20, 2021 at 14:36
  • It is. Hence my question. That's a good suggestion.
    – hepcat72
    May 20, 2021 at 14:39

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .