oh-my-zshのテーマに関するTips

# どんなテーマがあるのか調べる
一番簡単なのは[oh-my-zshのwikiのthemesページ](https://github.com/robbyrussell/oh-my-zsh/wiki/Themes)を見るのが良いと思いますが、このページには全てのテーマが紹介されているわけではありませんし、自分の使ってるカラースキームだとどんな感じに表示されるのかが分かりません。
というわけでそういう問題を解決するために[theme_chooser.sh](https://github.com/robbyrussell/oh-my-zsh/blob/master/tools/theme_chooser.sh)というのがあります。
ターミナルで`theme_chooser.sh -s`を実行するとこんな感じに全てのテーマのプレビューをしてくれます。

![スクリーンショット 2013-12-22 23.28.21.png](https://qiita-image-store.s3.amazonaws.com/0/94/04d1b033-665f-013a-2304-18a6d1fd47e3.png)

ここで注意点があって

- `$ZSH`をexportしておく必要がある。
- 環境に依存するテーマがある（上記スクショだとrvmに依存してるっぽいけど私が入れてないのでエラーになってるのがありますね）
- `$RPROMPT`(右端に表示されるプロンプト)が正しい位置に表示されない。
- `$RPROMPT`が手前の設定を引き継いでしまう。

後ろ2つは↓こんな感じ

![スクリーンショット 2013-12-22 23.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/94/5b6e13ee-9ad3-3768-beb1-6dad91ee2b29.png)

右側のプロンプトがずれているのと、後者のテーマには右端にカレントパス表示をしないんですが、前者のテーマを引き継いでしまって表示されてしまっています（これに関してはすぐ直せるのであとでプルリク送ってみようかと思ったりしてます）

また、テーマを指定してプレビューすることも出来ます。

![スクリーンショット 2013-12-22 23.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/94/7b5057d9-8067-05dc-5024-0077668a1c6e.png)

# .zshrcの再読み込みを行わずにテーマを変える
テーマは基本的に.zshrcに設定を書いて読み込みなおして初めて使えると思いますが、themesプラグインを使うと.zshrcの再読み込みを行わずにテーマを変えることができます。
themesプラグインの導入のしかたは、.zshrcで`plugins`に`themes`を追加してから`source $ZSH/oh-my-zsh.sh`します。

```
plugins=(git themes)  # ここのカッコの中にthemesが入ってればおｋ。gitプラグインに依存するテーマがあるのでgitも入れておくのがおすすめ
source $ZSH/oh-my-zsh.sh
```

これやってからzshを起動し直すと、`theme`コマンド(実体はfunction)が使えるようになります。使い方は引数にテーマ名を指定するだけです。

![スクリーンショット 2013-12-22 23.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/94/9e1c835f-fba7-cf7b-be29-2b4ebd74483b.png)

ただ前項と同じく`$RPROMPT`を引き継ぐバグがあります。

# オリジナルテーマを作って使う
oh-my-zshは以前はテーマ作ったら送ってくれ、って言ってたんですが[今はいっぱい集まったからやめてくれ、って言ってます](https://github.com/robbyrussell/oh-my-zsh#dont-send-us-your-theme-for-now)。
というわけで自分でテーマ作っても本家に取り入れてもらうのは諦めましょう。ただそうなると、oh-my-zsh/themesディレクトリに野良テーマを入れるとgitのuntracked filesに出てきて気持ち悪かったりします。
そういう時はoh-my-zsh/custom/ディレクトリに入れると良いです。このディレクトリは.gitignoreに登録されていて、かつテーマの読み込み先のディレクトリになっています。

# オリジナルテーマを作った
tips、というのとはちょっと違いますが、さっきからスクショでちらちら見えてるデフォルトのテーマは自分で作りました、と言う話。

```zsh
# 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ディレクトリの状態表示は次のスクショで大体伝わるかと思います。

![スクリーンショット 2013-12-23 1.02.46.png](https://qiita-image-store.s3.amazonaws.com/0/94/5374e3db-5f27-83bf-01f2-6aa8d41387af.png)

これいい！って思ってくれた方はコードをコピペして`oh-my-zsh/custom/NAME.zsh-theme`に保存して（NAMEは好きな名前で）`ZSH_THEME=NAME`して使って下さい。あとgitプラグイン使ってるので、`plugin=(git)`も設定しておく必要があります。

ちなみに散々customに入れろと言いつつ自分ではoh-my-zshをforkしたリポジトリのoh-my-zsh/themes/ディレクトリにおいてバージョン管理してます。