Posted at

プロンプトをカスタマイズしてgitブランチを表示する

More than 3 years have passed since last update.


はじめに

linuxとかでコマンドを入力する際に常に左にでるアレ。カスタマイズできる。表示する情報や、色が変更できるので自分好みにカスタマイズすればすごく便利。

ex.png


  • Ubuntu 14.04


シェルについて

ユーザーがカーネルとコミュニケーションを図る時、その仲介役として存在するのがシェルだ。シェルは様々な種類があるが、ほとんどのlinuxディストリビューションの標準シェルはbashで、Macも同様である。

bashはPS1という環境変数がある。これはThe primary prompt stringの略のようだ(bashマニュアルより)。このPS1を変えれば左に出るアレ、つまりプロンプトを自由にカスタマイズできる。

そもそもディストリビューションごとにばっちりカスタマイズされており、例えばRaspberry PiとUbuntuではプロンプトの表示が異なっていたりする。


bashrcの編集

自分は以下のようにカスタマイズしている。


  • 表示は<user>@<hostname>:<現在のディレクトリ> [<gitブランチ>]$

  • カレントディレクトリがgitプロジェクト内なら現在のブランチが表示される

  • ディレクトリはフルパスだと長くなるのでディレクトリのみ

  • 端末エミューレータ(GUI)の場合、ウィンドウに現在のディレクトリ名を表示

コードは以下の通り

function parse_git_branch {

git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}
function promps {
# 色は気分で変えたいかもしれないので変す宣言しておく
local BLUE="\[\e[1;34m\]"
local RED="\[\e[1;31m\]"
local GREEN="\[\e[1;32m\]"
local WHITE="\[\e[00m\]"
local GRAY="\[\e[1;37m\]"

case $TERM in
xterm*) TITLEBAR='\[\e]0;\W\007\]';;
*) TITLEBAR="";;
esac
local BASE="\u@\h"
PS1="${TITLEBAR}${GREEN}${BASE}${WHITE}:${BLUE}\W${GREEN}\$(parse_git_branch)${BLUE}\$${WHITE} "
}
promps

(by gist)

一番はgitブランチ名が表示するところだ。いちいちgit statusしなくていいのですごく便利。

ユーザ名(hoge)、ホスト名(hoge-host)として、何も考えずに上記のコードをUbuntuなら~/.bashrc、Macなら~/.bash_profileに追記してファイルを読みなおすと以下のようになる。($ . ~/.bashrc)


  • 通常時

    Screenshot from 2015-05-08 15:43:10.png


  • Gitプロジェクト内

    Screenshot from 2015-05-08 15:38:23.png


なんとなく環境変数を表示して確認してみる

$ echo $PS1

\[\e]0;\W\007\]\[\e[1;32m\]\u@\h\[\e[00m\]:\[\e[1;34m\]\W\[\e[1;32m\]$(parse_git_branch)\[\e[1;34m\]$\[\e[00m\]


コードを読み解く

そのままで十分ならコピペでいいと思う。だが自分好みにカスタマイズしたい場合は、ある程度コードを理解しておく必要がある。まあでも簡単に言うと特殊文字があって、それの組み合わせでカスタマイズできる。色付けの部分が少し見にくいだけで特に難しいことはないと思う。


特殊文字

ここで使っている特殊文字は以下のとおりである。詳細が知りたいのであればman bashコマンドか公式サイトを是非一読してほしい。

制御特殊文字
概要

\u
ユーザ名

\h
ホスト名

\W
カレントディレクトリ

\w
カレントディレクトリ(フルパス)

\$
'$'という文字(一般ユーザ)。rootユーザの場合は'#'。UIDが0かそうでないか。

\e (\033)
ASCIIのエスケープ文字

[
表示されない文字列の開始、端末制御シーケンスをプロンプトに埋め込む

]
表示されない文字列の終了


フォント装飾 (ASCII Escape Sequence)

ASCIIエスケープシーケンスを設定すれば色の変更が可能だ。フォントの色や特性、背景色まで変えることができる。例えば青文字表示を開始するのは\[\e[1;34m\]なのだが、これを分解してみる。

No
制御特殊文字
概要

1
\[
表示されない文字列の開始

2
\e
ASCIIエスケープシーケンス文字指定

3
[1;34m
ASCIIエスケープシーケンス設定

4
\]
表示されない文字列の終了

注目すべきは4.ASCIIエスケープシーケンス設定だ。ここを変えれば見た目が変わる。ここSet Graphics Modeを参考すれば好きなようにカスタマイズできると思う。以下にそのままコピーしてきた表を追記しておく。


  • Text attributes

value
description

0
All attributes off

1
Bold on

4
Underscore (on monochrome display adapter only)

5
Blink on

7
Reverse video on

8
Concealed on


  • Foreground colors

value
description

30
Black

31
Red

32
Green

33
Yellow

34
Blue

35
Magenta

36
Cyan

37
White


  • Background colors

value
description

40
Black

41
Red

42
Green

43
Yellow

44
Blue

45
Magenta

46
Cyan

47
White

上記のサイトによると、\e[<value>;...<value>mとなっている。装飾する番号をいくつも設定して最後にm。色々実験したが、例えばフォント色がいくつも被った時は最後のフォント色が採用される。(当然かw)


実際に変えてみる

遊びながら確認できるので自分好みにカスタマイズできると思うのだが、、正直迷うよね!!


  • Text attributes

    Screenshot from 2015-05-08 17:25:32.png


  • Foreground colors

    Screenshot from 2015-05-08 17:30:22.png


  • Background colors

    Screenshot from 2015-05-08 17:32:00.png


  • ごちゃまぜ

    Screenshot from 2015-05-08 17:36:33.png



おしまい

Gitブランチ表示は本当に便利なのでおすすめです。