プロンプトにRubyのバージョンを表示したい
- rbenvによって、Rubyバージョンは素早く、簡単に切り替えられるようになった。
- すると、作業中にいったい自分はどのRuby環境にいるのか、見失ってしまうことがある...。
- そうならないように、コマンドプロンプトにRubyのバージョンを表示しておきたい。
やってみた。
プロンプト
__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)$
- 上記プロンプトのシェルスクリプト
- 二つのcompletionファイルは、以下のページからダウンロードできる。
. /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変数を利用すると、さらに凝ったプロンプトを演出できそう。
- いろいろ試してみると面白そうな気がする。(素晴らしい情報に感謝です!)