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

zshのプロンプトを256色表示にする+好きなフォーマットで時刻表示

More than 3 years have passed since last update.

先日、今まで頑なにBashを使い続けていたもののついにZshに乗り換えました。
世の中には様々な理由でBashしか使えない環境も多いということでずっとBashにこだわってきましたが、zsh-syntax-highlightingの存在ででついに落ちました。

この話はまた今度にして今回はプロンプトのカスタマイズについて書いていきます。
特に256色表示と時刻表示でハマったのでその話をメモとして残しておこうと思います。

環境

名称 version等
OS OS X El Capitan 10.11.6
zsh 5.3.1
ターミナルエミュレータ iTerm2 3.0.14

zshとiTerm2はhomebrewでインストールしています。
また、VMですがCentOS 7.1などでもちゃんと反映できました。

プロンプトをカラフルに

単にプロンプトの色を変更すること自体は.zshrcでcolorsを呼び出して、PROMPTに文字の色なら$fg[hoge]、背景色なら$bg[hoge]を指定してあげるだけです。

例:~/.zshrc
autoload -Uz colors
colors

PROMPT="%{$fg[green]}%}[%n@%m]%{${reset_color}%}"

なんとまあ、お手軽簡単。しかしこの方法では8色しか指定できません。
元々、僕はデザイナー出身で色にうるさいエンジニアなので、CUIでも色に拘りたいのです。
なので早速プロンプトを256色表示でカラフルにしてあげようと思い調べました。

256色表示

256色表示する方法は複数あります。
例はいずれも緑(082)背景の赤(001)文字です。

ANSI利用

例1
PROMPT="%{^[[30;48;5;082m%}%{^[[38;5;001m%}[%n@%m]%{^[[0m%}"

一つ目はANSIカラーコードの256色モードを利用したもの。
^[で表されているのは制御文字でVimの場合はCtrl+v入力後にCtrl+[ or ESCで入力できます。
[30;48;5;色番号mで背景色、[38;5;色番号mで文字色を指定できます。最後に[0mで色リセット。

余談ですが、^[\033\eでも代用できるはずなんですが、僕の環境では何故か正常に反映されませんでした。何か分かる人は教えてください。

(2017/3/20 追記)
コメントより

例1’
PROMPT=$'%{\e[30;48;5;082m%}%{\e[38;5;001m%}[%n@%m]%{\e[0m%}'

\が使われたエスケープはプロンプトでの解釈には含まれず、$'~'やzsh組み込みのechoの引数で解釈されるそうです。
なので、PROMPTの指定で\を使うならば、上の例のように代入時に$'~'を使って\が解釈されるようにすると良いようです。ちなみに例では\eですが、\033でも大丈夫です。

Zshパラメータ利用

例2
PROMPT="%K{082}%F{001}[%n@%m]%f%k"

もう一つはman zshmiscで見れるZshのパラメータを利用した方法。
%K{色番号}で背景色、%F{色番号}で文字色を指定、%kで背景色リセット、%fで文字色リセット出来ます。
こちらのほうがスッキリしていて見やすいので僕はこちらで指定しています。

ちなみに、指定できる色は以下のワンライナー実行で確認できます。

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

好きなフォーマットで時刻表示

Bash時代のプロンプトには僕は[曜日 月/日 時:分:秒]なフォーマットで時刻を表示していたのですが、Zshで標準で提供されているパラメータではこのようなフォーマットは存在しません。
しかし、Zshではstrftime関数を用いて自由に時刻フォーマットできる%D{string}が用意されています。

PROMPT="[%D{%a %m/%d %T}]"

上記のフォーマットはこのようになります。
詳しいフォーマットについてはman strftimeこのサイトで。

参考

あとがき

manコマンドはさいつよ。
あと、Sublime textで^[入力できないのなんか悔しい。

butaosuinu
Webエンジニア的なことをしている人。フロントエンド多め。Golang, Node.js/JavaScript, PHP, Perl, Vue.js, Web Design, UI
http://butakikyo.net/
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