どんなテーマがあるのか調べる
一番簡単なのはoh-my-zshのwikiのthemesページを見るのが良いと思いますが、このページには全てのテーマが紹介されているわけではありませんし、自分の使ってるカラースキームだとどんな感じに表示されるのかが分かりません。
というわけでそういう問題を解決するためにtheme_chooser.shというのがあります。
ターミナルでtheme_chooser.sh -s
を実行するとこんな感じに全てのテーマのプレビューをしてくれます。
ここで注意点があって
-
$ZSH
をexportしておく必要がある。 - 環境に依存するテーマがある(上記スクショだとrvmに依存してるっぽいけど私が入れてないのでエラーになってるのがありますね)
-
$RPROMPT
(右端に表示されるプロンプト)が正しい位置に表示されない。 -
$RPROMPT
が手前の設定を引き継いでしまう。
後ろ2つは↓こんな感じ
右側のプロンプトがずれているのと、後者のテーマには右端にカレントパス表示をしないんですが、前者のテーマを引き継いでしまって表示されてしまっています(これに関してはすぐ直せるのであとでプルリク送ってみようかと思ったりしてます)
また、テーマを指定してプレビューすることも出来ます。
.zshrcの再読み込みを行わずにテーマを変える
テーマは基本的に.zshrcに設定を書いて読み込みなおして初めて使えると思いますが、themesプラグインを使うと.zshrcの再読み込みを行わずにテーマを変えることができます。
themesプラグインの導入のしかたは、.zshrcでplugins
にthemes
を追加してからsource $ZSH/oh-my-zsh.sh
します。
plugins=(git themes) # ここのカッコの中にthemesが入ってればおk。gitプラグインに依存するテーマがあるのでgitも入れておくのがおすすめ
source $ZSH/oh-my-zsh.sh
これやってからzshを起動し直すと、theme
コマンド(実体はfunction)が使えるようになります。使い方は引数にテーマ名を指定するだけです。
ただ前項と同じく$RPROMPT
を引き継ぐバグがあります。
オリジナルテーマを作って使う
oh-my-zshは以前はテーマ作ったら送ってくれ、って言ってたんですが今はいっぱい集まったからやめてくれ、って言ってます。
というわけで自分でテーマ作っても本家に取り入れてもらうのは諦めましょう。ただそうなると、oh-my-zsh/themesディレクトリに野良テーマを入れるとgitのuntracked filesに出てきて気持ち悪かったりします。
そういう時はoh-my-zsh/custom/ディレクトリに入れると良いです。このディレクトリは.gitignoreに登録されていて、かつテーマの読み込み先のディレクトリになっています。
オリジナルテーマを作った
tips、というのとはちょっと違いますが、さっきからスクショでちらちら見えてるデフォルトのテーマは自分で作りました、と言う話。
# this theme depends on git plugin.
function str_with_color() {
echo "%{$fg[$1]%}$2%{$reset_color%}"
}
ZSH_THEME_GIT_PROMPT_ADDED=$(str_with_color cyan '+')
ZSH_THEME_GIT_PROMPT_MODIFIED=$(str_with_color yellow '*')
ZSH_THEME_GIT_PROMPT_DELETED=$(str_with_color red 'x')
ZSH_THEME_GIT_PROMPT_RENAMED=$(str_with_color blue 'o')
ZSH_THEME_GIT_PROMPT_UNMERGED=$(str_with_color magenta '!')
ZSH_THEME_GIT_PROMPT_UNTRACKED=$(str_with_color grey '?')
function my_git_status() {
[ $(current_branch) ] && echo "($(current_branch)$(git_prompt_status))"
}
DATE_TIME=$(str_with_color yellow '%D{%Y-%m-%d %K:%M}')
PROMPT_PREFIX=$(str_with_color white '#')
SEPARATOR1=$(str_with_color white '|')
USER_NAME=$(str_with_color blue '%n')
SEPARATOR2=$(str_with_color white '@')
HOST_NAME=$(str_with_color cyan '%m')
SEPARATOR3=$(str_with_color white ':')
CURRENT_DIRECTORY=$(str_with_color green '%~')
PROMPT_CHAR=$(str_with_color white '$ ')
PROMPT='${PROMPT_PREFIX}${DATE_TIME}${SEPARATOR1}${USER_NAME}${SEPARATOR2}${HOST_NAME}${SEPARATOR3}${CURRENT_DIRECTORY} $(my_git_status)
$PROMPT_CHAR'
PROMPT2=$(str_with_color white '> ')
これを作る要件は
- 日時, ユーザ名, ホスト名, カレントディレクトリ名が見える
- 日時は作業ログをコピペした時にいつやったから知りたいので
- 上記情報を含んだせいでコマンド入力部分が右によらないようにする
- そのために2行にして全部1行目に詰め込む
-
$RPROMPT
は使わない- 作業ログをコピペした時ひどくなるので
- git管理ディレクトリの状態が視覚的に分かる
- ブランチ名(ブランチ上にいなかったらhash)が分かる
- addされたものがある、diffがある、deleteされたものがある等が分かる
な感じ。
ちなみにysってテーマがこの要件をほぼ満たしているので、似たようなプロンプト欲しいと思ってる人はそっちのが本家oh-my-zshにあるのでいいかもしれません(ただこのテーマはgit管理ディレクトリがcleanかそうじゃないかしか分かりません)
ほぼ満たしてるのになんでわざわざ作ったかと言うと、作ってる最中にそれに気づいたからです...
gitディレクトリの状態表示は次のスクショで大体伝わるかと思います。
これいい!って思ってくれた方はコードをコピペしてoh-my-zsh/custom/NAME.zsh-theme
に保存して(NAMEは好きな名前で)ZSH_THEME=NAME
して使って下さい。あとgitプラグイン使ってるので、plugin=(git)
も設定しておく必要があります。
ちなみに散々customに入れろと言いつつ自分ではoh-my-zshをforkしたリポジトリのoh-my-zsh/themes/ディレクトリにおいてバージョン管理してます。