如何在仍具有自定义PROMPT_COMMAND的同时显示pipenv工作区?

时间:2018-06-15 15:40:58

标签: bash pipenv

默认情况下,当我输入pipenv shell时,我的提示符开头表示我正在工作的工作区。

user@user-dsktp:~/main$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
(main-GqtUWnwk) user@user-dsktp:~/main$

但是,如果我自定义我的提示(显示git信息):

PROMPT_COMMAND='__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]" "\n\\\$ "'

我丢失了工作区信息:

user@user-dsktp:~/main (develop=)
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.

user@user-dsktp:~/main (develop=)
$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate

user@user-dsktp:~/main (develop=)
$ 

有谁知道怎么回来?任何帮助非常感谢。

2 个答案:

答案 0 :(得分:3)

来自GNU Bash Reference Manual

  

如果设置,则该值将被解释为在打印每个主要提示($PS1)之前执行的命令。

在您的情况下,在打印__git_ps1之前,您运行带有参数"\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]" "\n\\\$ "的函数$PS1

什么是__git_ps1?这取决于您的环境(它不是标准的Bash函数),但它是一个帮助函数,它生成带有Git信息的PS1。你可以看到它是什么

$ type __git_ps1

如果您查看来源,您可能会发现__git_ps1 会覆盖默认的PS1。这就是未显示虚拟环境名称的原因。正如@chepner所提到的,虚拟环境的名称通过activate脚本显示,修改了您的PS1。但是,__git_ps1会覆盖这种变化。

一劳永逸地修复它的方法是学习一些Bash,并尝试制作更好的PROMPT_COMMAND :)或者你可以使用它来代替

export PROMPT_COMMAND='
  __PS1_SUFFIX="\\\$ "
  if [[ -n "$VIRTUAL_ENV" ]]; then
    __PS1_SUFFIX="($(basename "$VIRTUAL_ENV")) $__PS1_SUFFIX"
  fi
  __git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]" "\n$__PS1_SUFFIX"
'

此代码段检查是否设置了VIRTUAL_ENV(如果由virtualenv设置,则指向虚拟环境的根目录),并将其名称添加到提示的第二行(befure $)。现在这不是最好的方法,因为目录名并不总是与提示相匹配,但它现在应该适合你。如果您发现此代码段不足以满足您的使用案例,您可以自行决定是否深入此Bash脚本深渊。

答案 1 :(得分:1)

activate脚本大致相当于

PS1="$(basename "$VIRTUAL_ENV") $PS1"

将虚拟环境添加到提示中。你可以简单地添加相同的 命令替换为您自己的提示定义。

您的PROMPT_COMMAND很可能会覆盖提示中的activate所做的任何事情,但为了避免任何令人讨厌的意外,您可以将VIRTUAL_ENV_DISABLE_PROMPT设置为任何非空字符串,以防止activate触摸你的提示。