Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

プラグインを使わず、プロンプトをかっこよく(zsh)

こんにちは、nechinechiです。
今回はzshにおいて、oh-my-zshなどのプラグインなくして、かっこいいプロンプトを作る方法を紹介します。
これを知っておくと、プラグインなどでは提供されていない形式で、自分の好きにプロンプトを変えらます。
また、プラグインを使うとzshの反応が遅くなってしまうと書かれた記事を目にすることがあります。特に、oh-my-zshは特によく目にします。私もoh-my-zshを使って、プロンプトを変えたことがありましたが、起動が遅かったりしていました。なので、そのような問題も解決してくれると思います。

はじめに

ここでは最終的に、以下のようなプロンプトができます。

f:id:nechinechi:20160712111006p:plain

何がかっこいいのか

私がこのプロンプトでかっこいいと思う点は、以下のような点です。

  • ユーザ名やカレントディレクトリの表示部分で、背景がシャープになってる
  • ブランチの表示の部分にあるマーク
  • 左側のプロンプトでは、色を256色から選択している
    選択できる色は、以下のコマンドで確認できます。(こちらより)

    for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo 実際の実行画面。 f:id:nechinechi:20160712110941p:plain

準備

私は、以下の環境、ソフトウェアなどを用いました。

  • OS: Windows 8.1
  • ターミナル: Cygwin
  • フォント: Ricty for Powerline

ブランチ表示の部分のマークや、背景をシャープにしている部分では、Unicodeで特殊な文字を使用しているため、それに対応していなければなりません。
コマンドラインで、以下のようにコマンドを打って、同じ結果となれば、同じフォントでなくても、問題ありません。

f:id:nechinechi:20160712111031p:plain

また、Ricty for PowerlineでUnicodeの全ての文字が表示できるという意味ではありません。ただ、このフォントは半角と全角文字の比が 1:2 で、文字の区別もつきやすいため、私は好んで使っています。

実際にやってみる

では、実際にやっていきましょう。
以下のように説明していきます。

  • gitのブランチ表示
  • 256色を使う方法
  • 背景色をシャープに表示

gitのブランチ表示

ブランチの表示そのものに関しては、以下をご覧ください。こちらの4行目以降の、右プロンプトの設定部分のみを利用します。
その設定部分をright_prompt.zshなどの名前のファイルにコピーします。そして、.zshrcから、sourceを使って、そのファイルを読み込むようにします。
それでは、right_prompt.zshに対して、変更を加えます。

zshのプロンプトにブランチ名とかステータスとか出すアレ

そして、以下に示す各行をそれぞれ以下のように編集します。

  • 5L: RPROMPT=$'`branch-status-check` %~'RPROMPT=$'`branch-status-check`
    元はカレントディレクトリが表示されるようになってますが、カレントディレクトリの表示は消しています。
  • 25L: echo ${prefix}${branchname}${suffix}echo ${prefix}'\ue0a0 '${branchname}${suffix}
    ブランチのマークが表示されるように変更を加えています。

以上で、gitブランチを表示してる部分は完成です。

256色を使う方法

256色から色を選択する場合は、%{^[[38;5;xxxm%}のようにします。xxxの部分は、0~255の数字が入ります。また、^[の部分は特殊な文字で、Ctrl-vを押して、それに続けてESCを押すことで入力できます。
色を選ぶ場合には、始めの方にも書きましたが、以下のコマンドを実行して、出力された中から好きな色の数字をxxxの部分に当てはめるのが良いと思います。

for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo

また、背景色を指定する場合には、%{^[[30;48;5;xxxm%}のようにします。
また、色のリセットをする場合は、%{^[[0m%}のようにします。この場合も^[の部分は特殊文字です。
例えば、以下のように左プロンプトを設定すると、下の画像のように表示されるようになります。

PROMPT='%{^[[30;48;5;237m%}%{^[[38;5;178m%}%n@%m %{^[[30;48;5;067m%}%{^[[38;5;007m%}%~%{^[[0m%}

f:id:nechinechi:20160712111156p:plain

背景色をシャープに表示

背景色をシャープに表示する場合には、以下のコマンドを実行して表示される三角形を利用します。つまり実際には、背景をとがらせてるのではなく、背景と同じ色の三角形を続けて表示することで、背景をシャープに表示見せています。

つまり、

f:id:nechinechi:20160712111156p:plain

から

f:id:nechinechi:20160712111620p:plain

にするには、以下のようにします。

  • ユーザ・ホスト名部分
    • ユーザ・ホスト名の表示部分の背景色と同色の三角を続けて表示
    • このとき、三角の背景色には、次のカレントディレクトリを表示してる部分の背景色と同じ色を選択
  • カレントディレクトリ部分
    • カレントディレクトリの表示部分が終わった後に、色をリセットする
    • リセット直後に、背景色と同色の三角を表示する

以上を、コードにすると以下のようになります。このコードを、left_prompt.zshなどの名前を付け多ファイルに保存し、.zshrcから読み込むようにすると、.zshrcもコードがみやすいと思います。また、処理は全てleft-promptという関数で行うようになっています。

PROMPT='`left-prompt`'

function left-prompt {
  FIRST='178m%}'
  FIRST_B='237m%}'
  SECOND='007m%}'
  SECOND_B='067m%}'

  sharp='\uE0B0'
  FG='%{^[[38;5;'
  BG='%{^[[30;48;5;'
  RESET='%{^[[0m%}'
  USER_AND_HOST="${BG}${FIRST_B}${FG}${FIRST}"
  DIR="${BG}${SECOND_B}${FG}${SECOND}"

  echo "${USER_AND_HOST}%n@%m${BG}${SECOND_B}${FG}${FIRST_B}${sharp} ${DIR}%~${RESET}${FG}${SECOND_B}${sharp} ${RESET}"
}

何度も繰り返しますが、^[の部分は特殊文字です。Ctrl-vを押して、それに続けてESCを押すことで入力できます。
以下のコードでは、色の変更が楽なように、FIRSTFIRST_Bでユーザ・ホスト名の文字色と背景色をそれぞれ指定しています。SECONDSECOND_Bでは、カレントディレクトリの文字色と背景色をそれぞれ指定しています。
その下のsharpには三角形の文字コードを、FGFBにはそれぞれ、文字色、背景色を指定するときの、始めの部分の文字列を入れています。RESETには、色をリセットする文字列を入れてます。
USER_AND_HOSTDIRには後のecho文で、少しでも見やすくするため、文字を表示する部分の、背景色と文字色を入れています。
最後に、echo文で返される値をPROMPTに入れて表示してます。このようにしておかなければ、三角形がうまく表示されません。例えば、PROMPT='\uE0B0'とすると、ぷろんぷとに'\uE0B0'という文字列が表示されるだけになってしまいます。

完成

以上を終えると、始めの方にもお見せした、以下のようなプロンプトができあがります。

f:id:nechinechi:20160712111006p:plain

終わりに

プロンプトを自分好みに変更すると、気分も上がりますし、今どのサーバにいるかなど見やすくもなります。 プロンプトは、人それぞれで個性が大きく出ると思うので、自分の好きに、使いやすいようにしておくのがいいと思います。
ここでは簡単なプロンプト表示を例としました。rbenvnvmを使っている場合は、rubyやnodeのバージョンを表示すると、今がどのバージョンなのか、すぐにわかるようになります。
ぜひ、設定をいじりながら、プロンプトを自分好みに変えていってください。