先日、今まで頑なに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]を指定してあげるだけです。
autoload -Uz colors
colors
PROMPT="%{$fg[green]}%}[%n@%m]%{${reset_color}%}"
なんとまあ、お手軽簡単。しかしこの方法では8色しか指定できません。
元々、僕はデザイナー出身で色にうるさいエンジニアなので、CUIでも色に拘りたいのです。
なので早速プロンプトを256色表示でカラフルにしてあげようと思い調べました。
256色表示
256色表示する方法は複数あります。
例はいずれも緑(082)背景の赤(001)文字です。
ANSI利用
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 追記)
コメントより
PROMPT=$'%{\e[30;48;5;082m%}%{\e[38;5;001m%}[%n@%m]%{\e[0m%}'
\が使われたエスケープはプロンプトでの解釈には含まれず、$'~'やzsh組み込みのechoの引数で解釈されるそうです。
なので、PROMPTの指定で\を使うならば、上の例のように代入時に$'~'を使って\が解釈されるようにすると良いようです。ちなみに例では\eですが、\033でも大丈夫です。
Zshパラメータ利用
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かこのサイトで。
参考
- zshのプロンプトカラーを設定を変更してみた - HAM MEDIA MEMO
- zshのプロンプトを256色にする方法 - 余白の書きなぐり
- colors - 256 colour prompt in Zsh - Unix & Linux Stack Exchange
- zsh_ 13 Prompt Expansion
- zsh で全 256 色を試しに表示みたい - Qiita
- strftime - ライブラリコールの説明 - Linux コマンド集 一覧表
あとがき
manコマンドはさいつよ。
あと、Sublime textで^[入力できないのなんか悔しい。