Help us understand the problem. What is going on with this article?

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

More than 5 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ブランチ表示は本当に便利なのでおすすめです。

caad1229
自転車とUbuntuが好きです。
http://caad1229.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした