ZSHうちの味噌ダレ


この記事は Recruit Engineers Advent Calendar 2016 の13日目の記事です。

はじめに

弊グループのアドベントカレンダーに参戦したは良いものの、特にネタが思いつきませんでした(なんとなくあったけど時間無くてぽしゃった)。
そこで、年の瀬ということで、今年一年を振り返ってみたとき、自分の中で大きな変化が一つあったことを思い出しました。
そういえばbashからzshに乗り換えたなと。
そこで、ここ一年で僕のzshrc(味噌ダレ)がどのように育ったのか振り返ってみます。

黎明期

ずっと使ってきたbashから乗り換えた理由は正直覚えてないのですが、確かどこぞやのzsh使いに煽られたからだったと思います。
彼があまりにも真に迫って煽ってくるので、なんとなく悔しくなって、長年連れ添ったbashから乗り換えを決意しました。
ただ、煽ってきた彼がoh-my-zshを使っていたので、絶対に生のzshrcだけで設定してやろうと決めました。
zshヌーブな僕は、こちらのzshrcを参考にさせていただきました。
今でも大枠はこのzshrcから離れておらず、とてもお世話になっております。
starするくらいしかできなくてごめんなさい。

PROMPTに凝る期

とりあえず、ベースのzshrcでしばらくは満足していたのですが、まもなくオリジナリティの無さに苦しみ始めました。
人と同じものを使ってなにがカスタマイズじゃと。
そこで、安直な僕はとりあえず、promptをいじることに決めました。

FACES=("(*´ω`*)" "(・∀・)ノ" "( ゚Д ゚ )" "(。╹ω ╹。)" "(´・ω ・`)" "٩(\`・ω ・´)و" "(๑˃̵ᴗ˂̵)و" "( ・⊝ ・ )" "(p*・ω ・)p")
function _update_prompt_with_cute_faces() {
  PROMPT="%{$fg[yellow]%}%~
%{$fg[cyan]%}$FACE_CHAR[$[$RANDOM % ${#FACES[@]} + 1]] ${reset_color}%(!.#.$)"
}
add-zsh-hook precmd _update_prompt_with_cute_faces

で、できたのが上記のコードです。
一行目にはパスを、二行目にはコマンドの実行ごとにランダムに顔文字を表示するようにしてあります。
zsh-hookを使ってコマンド毎に生成し直しているのが味噌でしょうか。(もっといい方法あったら教えてください)
ただ、顔文字を表示すると、右プロンプトまで入力が届いてしまうことがままあり、その場合表示が崩れてしまいます。
なので、setopt TRANSIENT_RPROMPTの設定を追加して、うまい感じに右プロンプトが隠れてくれるようにしてあります。
また、zshのプロンプトに表示すると、顔文字の文字間の詰めが微妙に独特になるので、表示させながら微調整する必要があります。
また、ここで色を使っていますが、zshで色を使うようにするには

autoload -Uz colors
colors

とする必要があります。

RPROMPTもいじりたくなる期

ベースのzshrcの時点で、 右プロンプトにVCSの情報を表示してくれているようになってはいるのですが、普段gitを使っていると、もう少しこうなってほしいなという要望が生じます。
好みの問題なのですが。
というわけで、少し微調整を掛けました。
元の右プロンプトのスタイル設定はこんな感じになっています。

zstyle ':vcs_info:*' formats '%F{green}(%s)-[%b]%f'
zstyle ':vcs_info:*' actionformats '%F{red}(%s)-[%b|%a]%f'

この時点で全く問題なく機能します。
ですが、gitの場合、ステージされていない変更がある場合や、ステージされている変更がある時で色を変えたく思います。
なので、git用の設定を追加し

zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats '%F{green}[%s] %c%u%b%f'
zstyle ':vcs_info:*' actionformats '%F{red}[%s]%c%u%b|%a%f'

とすることで、ステージングの状況がひと目で分かるようになります。
上記左右プロンプトの状況を踏まえると、こんな見た目になります。

上記は、ステージされていない変更がある場合の表示です。
変更がない場合はこう。

ステージされた変更があるときはこうなります。

alias増やす期

本来、僕はalias使うのあまり好きじゃないんです。
自分のでない環境に行くととたんにいじれなくなるのが嫌なので。
ですが、結局日々のめんどくささには勝てないので、最近は気づく度にaliasを増やしてしまっています。

特ににgitのaliasは、gitで設定するよりも短くできるので(gitだと結局gitって打たなきゃいけないし)、割とalias入れてます。
addとかcmとかそもそも被らないし、zsh自体のaliasに入れちゃっていいと思うんですよ。

alias g='git'
alias gl='git log --oneline'
alias gg='git log --graph --oneline --decorate=full'

そして現在

かなりざっくり振り返ってみましたが、案外慣れたものだなあと思いました。
学生時代からbashを捨てろという誘惑は数多くあったのですが、なんとなく慣れんからだとか、標準で入ってるのが偉いんじゃという謎のこだわりで移行しないでいました。
ですが、移行して慣れてみるともうbashには戻れなくなってるんですから、本当食わず嫌いはいけませんね、

一応うちの味噌ダレ