PS1の上に前に追加した後、残りの改行文字を追加します。

PS1の上に前に追加した後、残りの改行文字を追加します。

OBSD kshにはPS1の前に空行があります。

PS1="\n[\u@\h] \w\n\$"

問題は、仮想環境を有効にすると、pyenvが仮想環境名の前にその名前を追加することです。 pyenvアクティベーションスクリプトの関連部分は次のとおりです。

PS1="(porcupine) ${PS1:-}"

これは空の行を食べて回転します。

[myusername@myhostname] ~/some/path $ echo foo
foo

[myusername@myhostname] ~/some/path $

入力する

(virtual-environment-name)
[myusername@myhostname] ~/some/path $ echo foo
foo
(virtual-environment-name)
[myusername@myhostname] ~/some/path $

これは迷惑でtputで修正しようとしました:

PS1_TEXT="[\u@\h] \w\n\$ "
PS1="$(tput sc il1 nw)$(tput rc DO 1)\n$PS1_TEXT"

これにより、カーソルが仮想環境名の上の行に移動して空白行になり、元のPS1に戻ります。

ほとんど動作しますが、ターミナルウィンドウの下部をクリックすると仮想環境名が消えます。これもまた迷惑ですね。

答え1

正しいpyenvソースを確認したと仮定すると、pyenvの干渉なしにカスタムをPYENV_VIRTUALENV_DISABLE_PROMPT=1設定して構築することをお勧めします。PS1

有効な環境が利用可能である必要がありますPYENV_VIRTUAL_ENV(または起動後に設定された内容を確認するために使用したものenv)。

https://github.com/pyenv/pyenv-virtualenv/blob/c85c1c9ed520d28cbb34e10e1fe82c6ee37130bc/bin/pyenv-sh-activate#L244

かなり面白いです。この変数に関する多くの質問/議論と修正を提案する「サポートの中止」を見つけることができます。例えばhttps://stackoverflow.com/questions/74611317/enable-pyenv-virtualenv-prompt-at-terminal

このサポートの中断は最近削除され、pyenvはすぐに修正を維持する予定です(このように無効にすることを含む)。バラよりhttps://github.com/pyenv/pyenv-virtualenv/commit/77a7644ff7a7a624ba4dfebe5c7441a57be3cc48

PS:$()kshでもbashと同じように動作すると仮定すると、出力のtput代わりにasコマンドを追加すると、シェルのパフォーマンスに不必要な影響を与える可能性があります。

答え2

ありがとうございます。後で、OBSD kshの詳細は.kshrcにあります。

VIRTUAL_ENV_DISABLE_PROMPT=1

function prompt_command {
   if [[ -n  ${VIRTUAL_ENV} ]]; then
      print -r "(${VIRTUAL_ENV##*/})"
   fi   
   print -n "[\u@\h] \w\n\$ "
}
PS1='\n$(prompt_command)'

VIRTUAL_ENV_DISABLE_PROMPT環境変数と実行時に一重引用符を使用することに注意してくださいprompt_command(質問に二重引用符を誤って入力しました)。

関連情報