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

## はじめに

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

![ex.png](https://qiita-image-store.s3.amazonaws.com/0/77816/f6e5fa69-1d91-172f-7f43-8c4c0b29b9b0.png)

- Ubuntu 14.04

## シェルについて

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

bashは`PS1`という環境変数がある。これは`The primary prompt string`の略のようだ([bashマニュアルより](https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Variables))。この`PS1`を変えれば左に出るアレ、つまりプロンプトを自由にカスタマイズできる。
そもそもディストリビューションごとにばっちりカスタマイズされており、例えばRaspberry PiとUbuntuではプロンプトの表示が異なっていたりする。

## bashrcの編集

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

- 表示は`<user>@<hostname>:<現在のディレクトリ> [<gitブランチ>]$`
- カレントディレクトリが`git`プロジェクト内なら現在のブランチが表示される
- ディレクトリはフルパスだと長くなるのでディレクトリのみ
- 端末エミューレータ(GUI)の場合、ウィンドウに現在のディレクトリ名を表示

コードは以下の通り

```bash
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](https://gist.github.com/caad1229/f6c64ef41d58f15f5148))

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


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

- 通常時
![Screenshot from 2015-05-08 15:43:10.png](https://qiita-image-store.s3.amazonaws.com/0/77816/ed112ab5-c212-a014-a1cb-437cef7a9ea0.png)

- Gitプロジェクト内
![Screenshot from 2015-05-08 15:38:23.png](https://qiita-image-store.s3.amazonaws.com/0/77816/85c3ef15-d239-b2fd-1d3c-4dd1adf655c4.png)

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

```bash
$ 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`コマンドか[公式サイト](https://www.gnu.org/software/bash/manual/bash.html#Controlling-the-Prompt)を是非一読してほしい。

|制御特殊文字|概要|
|---|---|
|\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エスケープシーケンス設定**だ。ここを変えれば見た目が変わる。[ここ](http://ascii-table.com/ansi-escape-sequences.php)の`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](https://qiita-image-store.s3.amazonaws.com/0/77816/701aea5f-0de7-3ebc-a866-42606d44c0cf.png)

- Foreground colors
![Screenshot from 2015-05-08 17:30:22.png](https://qiita-image-store.s3.amazonaws.com/0/77816/dfad6b15-e3da-2b87-03dd-61d2cb747e72.png)

- Background colors
![Screenshot from 2015-05-08 17:32:00.png](https://qiita-image-store.s3.amazonaws.com/0/77816/5b85b980-c8a4-97bf-43c4-5b3643193d90.png)

- ごちゃまぜ
![Screenshot from 2015-05-08 17:36:33.png](https://qiita-image-store.s3.amazonaws.com/0/77816/9daf31ea-25cd-0e71-c0f8-5f57c91f1552.png)

## おしまい

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