プロンプトにRubyのバージョンを表示したい

  • rbenvによって、Rubyバージョンは素早く、簡単に切り替えられるようになった。
  • すると、作業中にいったい自分はどのRuby環境にいるのか、見失ってしまうことがある...。
  • そうならないように、コマンドプロンプトRubyのバージョンを表示しておきたい。

やってみた。

プロンプト

  • Rubyバージョンの由来を調べて(rbenvのglobal・local・shellのどれか)
  • systemの場合は、ruby -vのバージョンを使う。
__ruby_ps1()
{
  if [ -e "$HOME/.rbenv" ] ; then
    if [ "$RBENV_VERSION" != "" ]; then
      rbenv_scope="shell"
    else
      if [ -e ".ruby-version" ]; then
        rbenv_scope="local"
      else 
        rbenv_scope="global"
      fi
    fi

    rbenv_version=`rbenv version | awk '{print $1}'`
    if [ "$rbenv_version" = "system" ] ; then
      ruby_version=`ruby -v | awk '{print $2}'`
      printf "[$rbenv_scope system-ruby-$ruby_version]"
    else
      printf "[$rbenv_scope ruby-$rbenv_version]"
    fi
  fi
}

PS1='\u@\h \w $(__ruby_ps1)\$ '
  • すると、以下のように表示される。
zari@MacBook-Pro-Retina15 ~/Downloads [global ruby-1.8.7-p375]$ 

実際に使っているプロンプト

自分が実際に使っているのは、以下のプロンプト。


  • カラー&2行(長く伸び過ぎてしまったので...)表示にしている。
zari@MacBook-Pro-Retina15 ~/Downloads [496 items] [global ruby-1.8.7-p375]  11 07  04:14:18
$
  • バックグラウンドjobが稼働している時は、job数を表示する。
  • Gitリポジトリの中では、ブランチ名を表示する。
zari@MacBook-Pro-Retina15 ~/Documents/github/jcal [12 items] [global ruby-1.8.7-p375]  11 07  04:18:55
(jobs:1)(master)$ 
. /usr/local/git/contrib/completion/git-prompt.sh
. /usr/local/git/contrib/completion/git-completion.bash

__ruby_ps1()
{
  if [ -e "$HOME/.rbenv" ] ; then
    if [ "$RBENV_VERSION" != "" ]; then
      rbenv_scope="shell"
    else
      if [ -e ".ruby-version" ]; then
        rbenv_scope="local"
      else 
        rbenv_scope="global"
      fi
    fi

    rbenv_version=`rbenv version | awk '{print $1}'`
    if [ "$rbenv_version" = "system" ] ; then
      ruby_version=`ruby -v | awk '{print $2}'`
      printf "[$rbenv_scope system-ruby-$ruby_version]"
    else
      printf "[$rbenv_scope ruby-$rbenv_version]"
    fi
  fi
}

__jobs_ps1()
{
  jobs_number=`jobs | grep -cE "Running|Stopped"`
  if [ $jobs_number -gt 0 ]; then
    printf "(jobs:$jobs_number)"
  fi
}

PS1='\[\033[1;32;40m\]\u\[\033[0;2;37;40m\]@\[\033[0;32;40m\]\h \[\033[1;36;40m\]\w \[\033[0;36;40m\][$(ls|wc -l|awk {print\$1}) items] $(__ruby_ps1) \[\033[0;37;40m\]\d  \t\[\033[0m\]\n\
$(__jobs_ps1)$(__git_ps1 \(%s\))\$ '

解読のヒント

  • この、エスケープと制御コードにまみれたプロンプト文字列は、難解である...。
  • 1カ月後の別人の自分が見ても、きっと悩むと思う。(絶対悩む、間違いない)
  • よって、解読のヒントとなる情報を書いておくのだ。
PS1='\[\033[1;32;40m\]\u\[\033[0;2;37;40m\]@\[\033[0;32;40m\]\h \[\033[1;36;40m\]\w \[\033[0;36;40m\][$(ls|wc -l|awk {print\$1}) items] $(__ruby_ps1) \[\033[0;37;40m\]\d  \t\[\033[0m\]\n\
$(__jobs_ps1)$(__git_ps1 \(%s\))\$ '
  • \[\033[1;32;40m\]のような\[ ... \]で囲まれた部分は、色や属性を指定している。
  • 色や属性については、エスケープシーケンスを参照するのだ。
  • 色や属性をすべて取り除くと以下のようになる。
    • これで、かなり見やすくなったはず。
  • モノクロだけど出力されるテキストは全く同じ。
PS1='\u@\h \w [$(ls|wc -l|awk {print\$1}) items] $(__ruby_ps1) \d  \t\n\
$(__jobs_ps1)$(__git_ps1 \(%s\))\$ '
  • $( ... )の中は、コマンドとして実行され、出力結果に置き換えられる。
  • \バックスラッシュの意味については、エスケープ文字を参照するのだ。
  • その他の文字は、そのまま表示される。

エスケープ文字

エスケープ文字 意味
\a ASCIIのベル文字(07)を表示する。(ビープ音を鳴らす)
\d 金 11 7 「曜日 月 日」の形式で日付を表示する。
\D{} 16時00分01秒 strftime(FORMAT)の結果がプロンプトに挿入される。
\e \[\e[31m\] ASCIIのエスケープ文字(\033)を意味する。
\h MacBook-Pro-Retina15 ホスト名のうち最初の「.」までの部分を表示する。
\H MacBook-Pro-Retina15.local ホスト名を表示する。
\j 0 シェルによって現在管理されているジョブの数を表示する。
\l ttys002 シェルの端末デバイスのベース名 (basename)を表示する。
\n 改行する。
\r 復帰する。
\s -bash シェルの名前を表示する。
\t 16:00:01 現在の時刻を24時間の「HH:MM:SS」形式で表示する。
\T 04:00:01 現在の時刻を12時間の「HH:MM:SS」形式で表示する。
\@ 04:00 PM 現在の時刻を12時間の「HH:MM am/pm」形式で表示する。
\A 16:00 現在の時刻を24時間の「HH:MM」形式で表示する。
\u zari 現在のユーザー名を表示する。
\v 3.2 bashのバージョンを表示する。
\V 3.2.53 bashのリリースを表示する。
\w ~/Desktop 現在の作業ディレクトリを、ホームディレクトリからの絶対パスで表示する。
\W Desktop 現在の作業ディレクトリを表示する。
\! 2160 このコマンドの履歴番号を表示する。
\# 5 このコマンドのコマンド番号を表示する。(そのシェルで実行されたコマンドの回数)
\$ $ 実効UIDが0の場合に#となり、それ以外の場合に$となる。
\nnn \[\033[31m\] 8進数nnnに対応する文字を表示する。
\\ \ バックスラッシュを表示する。
\[ \[\033[31m\] 非表示文字のシーケンスを開始する。端末の制御コードを埋め込む時に使う。
\] \[\033[31m\] 非表示文字のシーケンスを終了する。

エスケープシーケンス

Text attributes(属性) Foreground colors(文字色) Background colors(背景色)
0 attributes off(リセット) 30 Black 40 Black
1 Bold(太字) 31 Red 41 Red
2 Low intensity(減光) 32 Green 42 Green
3 33 Yellow 43 Yellow
4 Underscore(下線) 34 Blue 44 Blue
5 Blink(点滅) 35 Magenta 45 Magenta
6 36 Cyan 46 Cyan
7 Reverse(反転) 37 White 47 White
8 Invisible text(非表示)
  • 属性については0リセットしない限り、他の属性と相乗してその効果が継続する。
    • よって、プロンプトの先頭と末尾で0リセットしておいた方が良さそう。
    • 0リセット=属性・文字色・背景色すべての設定を指定無しの状態に戻す。
PS1="\[\033[0m\]通常\[\033[2m\]減光\[\033[1m\]太字\[\033[7m\]反転\[\033[0m\]\$ "
  • 制御コードは ; で区切って、複数同時に指定できる。
PS1="\[\033[0;1;32;40m\]0リセット;太字;文字緑;背景黒\[\033[0m\]\$ "

PROMPT_COMMAND

さらに...

  • PROMPT_COMMAND変数を利用すると、さらに凝ったプロンプトを演出できそう。