シェルのプロンプトは改行しようぜ

  • 追記(2009-10-01): PS1の設定の誤り(エスケープシーケンスを囲む \[ .. \] について)を修正。
  • 追記(2009-10-20): 読みにくい文章を修正。


シェルプロンプトの改行はとても便利。

  • シェルプロンプトの改行でコマンドラインがとても見やすくなった。
  • シェルプロンプトの改行でLinuxライフが1.3%快適に(当社比)。
  • シェルプロンプトの改行で東大に合格しました。

改行のすすめ

zshでは、プロンプトをコマンドラインの右側にも表示できる。しかも、入力文字列が長くなって右側のプロンプトにかぶった時、プロンプトは消える。なので、カレントディレクトリが深くなったときに長いコマンドを入力しても、入力を一行で表示できやすい。

この「深いカレントディレクトリ」問題は、「プロンプトを改行して二行にする」ことで、もっとスマートに解決できる。例えば、プロンプトの一行目にカレントディレクトリを、二行目に"$"を表示させるようにすれば、カレントディレクトリが深くなっても、入力文字列を一行で表示できやすい。その上、zshの右プロンプトと違って、表示が消えたりもしない。さらに、プロンプトの改行ならbashにだって可能なのだ。

というわけで、自分のbashでは以下のようにプロンプトを表示させている。

[myhost: ~/research/project/]
$

myhostはホスト名、~以下はカレントディレクトリ。カーソルは、二行目の$の二つ右にあると思ってもらいたい。

こういう表示にするには、.bashrc に以下の設定を書けばよい。

# set prompt
## \[ ... \] : encloses control sequence with \[ and \] for accurate word wrap
## \033[xxm : changes the color of command line
## \h : the hostname up to the first "."
## \w : current working directory
## \n : newline
## \$ : "$" for non-root, "#" for root

# 間違った設定 (2009-10-01コメントアウト)
#export PS1='\[\033[31m[\h: \w]\n\$\033[30m\] '

# 正しい設定 (2009-10-01追加)
export PS1='\[\033[31m\][\h: \w]\n\$\[\033[30m\] '

ちなみに、\[ ... \] で色変更の制御文字列を囲むのを絶対に忘れてはいけない。これを忘れると、コマンドラインのヒストリ検索を行った際に、表示がおかしなことになる。自分はこの現象の原因がわからなくて2年間積んだ。