web-dev-qa-db-ja.com

長すぎる場合は、プロンプトに改行を追加します

私の完全な作業ディレクトリとその他の情報(gitなど)をbashプロンプトに表示すると、非常に長くなることがあります。

プロンプトの最後に改行を追加して、次の行にコマンドを入力できるようにしたいが、プロンプトが長い場合のみ 50文字以上。

| ~ $ Typing a command here is Nice                                              |
| ~/foo/longDirectoryName/longsubirectory/src/package (master +*) $ Typing here s|
| ucks. I want to just start on a new line                                       |

明らかに、always次の行にコマンドを入力したい場合は、改行をPS1に追加するだけです( this post のように) =)。しかし、PS1は単なるフォーマット文字列なので、条件付きでこれを行う方法は見つかりませんでした。


追伸私は実際にはAgnosterテーマをカスタマイズしようとしてZSHを使用していますが、bashの一般的な解決策が役立つと思います。

3
B1CL0PS

zshでは、これが%<number>(l:<yes>:<no>)プロンプト拡張の目的です。数値が負の場合、-30、画面の右端までに30文字以上残っている場合はyesテキストが出力され、それ以外の場合はnoなので、次のようになります。

PS1=$'%~%-30(l::\n)$ '

28文字未満の場合は改行を挿入します(30マイナス"$ ")は、ラインで使用するために残されています。

50以上を実行するには、次のようにします。

PS1=$'%~%50(l:\n:)$ '

ただし、IMOでは、使用できない最大のスペースよりも、使用可能な最小のスペースを保証する方が便利です。

詳細は マニュアル を参照してください。長いプロンプトを切り捨てて、たとえばEllipsisで置き換える他のディレクティブも見つかります。

Zshプロンプトの展開は、bashの展開とは完全に異なることに注意してください。これは実際にはtcshに近いので、bashのソリューションはzshにあまり役立ちませんが、逆の方が一般的です。

5

bashの新しいバージョンでは、Prompt_COMMAND${var@P}形式の変数置換と組み合わせることができます(「プロンプトのように拡張」)。

これを行う方法は次のとおりです。 OPS1の代わりにPS1を必要なプロンプトに設定するだけです。 \-エスケープは、OPS1内で ソフトハイフン のように機能します。プロンプトがCOLUMNS / 2より長くなる場合の改行。それ以外の場合は削除されます。

generate_ps1(){
    local ps1=${OPS1@P}
    if [ "${#ps1}" -gt "$((COLUMNS / 2))" ]; then PS1=${OPS1//\\-/$'\n'}
    else PS1=${OPS1//\\-/}
    fi
}
OPS1=$PS1
Prompt_COMMAND=generate_ps1

# after this, set OPS1 instead of PS1 to the Prompt you want

$ OPS1='$long_var\-\$ '
$ long_var=$(printf 'foobar %.0s' {0..21})
foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foo
bar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
$ _
$ long_var=$(printf 'foobar %.0s' {0..2})
foobar foobar foobar $ _

これは、ターミナルの自動マージンやプロンプト内の既存の改行などを考慮して、実際のソフトハイフンのように機能するように改善できます。しかし、それはそれが価値があるよりも複雑になります。

3
mosvy