私の完全な作業ディレクトリとその他の情報(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の一般的な解決策が役立つと思います。
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
にあまり役立ちませんが、逆の方が一般的です。
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 $ _
これは、ターミナルの自動マージンやプロンプト内の既存の改行などを考慮して、実際のソフトハイフンのように機能するように改善できます。しかし、それはそれが価値があるよりも複雑になります。