Ari-Press

エンジニアAriのブログ.

なんか便利らしいzshをOSXに導入してみる

Z shell

自分はずっとbash派だったわけですが、便利とよく聞くzshにここらで乗り換えてみてもいいんじゃないか・・・?ということで、色々設定をしてみました。

当然まだ全然使いこなせてはいないですが、なんだか便利そうな薫りはしています。ちょっとずつ慣れていこうかなという感じですね。

まあそんなわけで、zshをOSXに導入してみます。

Homebrewによるインストール

OSXにはデフォルトでzshがインストールされていますが、バージョンを確認してみると。。

1
2
$ /bin/zsh --version
zsh 4.3.11 (i386-apple-darwin12.0)

ちょっと古い模様。古いバージョンで使い始めてもなぁ、、ということでHomebrewを使って別途インストールします。

1
2
3
$ brew install zsh
$ /usr/local/bin/zsh --version
zsh 5.0.0 (x86_64-apple-darwin12.2.0)

いい感じに新しいものが入りました。せっかく新しく手を付けるんだから新しいバージョンがいいですよね。

ログインシェルに設定

これをログインシェルに設定しないといけないんですが、OSXにはusermodが無いみたいですね。

どうやら システム環境設定 -> ユーザとグループ -> ユーザの詳細オプション から設定可能なようなので、/usr/local/bin/zshをログインシェルに設定しました。

ちょっとした設定

次に細かい設定をしていきます。

まず、「これだけは書いとけ」とのことなので以下の設定を.zshrcに追加します。 (出典: 漢のzsh)

1
2
autoload -U compinit
compinit

これでzshが誇る補完機能が有効になりました。

ついでに補完候補を選択できるように以下の一行も追加。

1
zstyle ':completion:*:default' menu select

この設定をするとtab連打で各補完候補がハイライトされつつ順に選択されて、Enterで決定!といった動きをするようになります。

軽く困ったこと

git diff HEAD^が打てない。^がメタ文字になっているみたいです。回避方法は拡張グロブextended_globを無効にすること、git diff HEAD\^のようにエスケープを使用することなどがありましたがどちらも微妙。。

どうしたものかと思っていたら、どうやらHEAD~HEAD^の代用になるみたいなので、これを使うことにしました。キーも一緒だしshiftキーを押しているか離しているかくらいの違いだったので。

1
git diff HEAD~

こんな感じ。

プロンプトのカスタマイズ

デフォルトのプロンプトはマシン名% 〜〜といった感じで、カレントディレクトリすらわからない状態だったのでこれをなんとかしてみます。

ついでにgitのブランチとかも表示されないかなぁということで検索をしてみると・・・?いやー、あるもんですね。

git のブランチ名を zsh の右プロンプトに表示+ status に応じて色もつけてみた

そんなわけで、上のリンク先のコードをコピペしつつ少し好みの表示に書き換えて、以下の様な設定をこれまた.zshrcに追加しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# prompt
# ${fg[...]} や $reset_color をロード
autoload -U colors; colors

function rprompt-git-current-branch {
  local name st color

  if [[ "$PWD" =~ '/\.git(/.*)?$' ]]; then
    return
  fi
  name=$(basename "`git symbolic-ref HEAD 2> /dev/null`")
  if [[ -z $name ]]; then
    return
  fi
  st=`git status 2> /dev/null`
  if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
    color=${fg[green]}
  elif [[ -n `echo "$st" | grep "^nothing added"` ]]; then
    color=${fg[yellow]}
  elif [[ -n `echo "$st" | grep "^# Untracked"` ]]; then
    color=${fg_bold[red]}
  else
    color=${fg[red]}
  fi
  # %{...%} は囲まれた文字列がエスケープシーケンスであることを明示する
  # これをしないと右プロンプトの位置がずれる
  echo "[%{$color%}$name%{$reset_color%}]"
}

# プロンプトが表示されるたびにプロンプト文字列を評価、置換する
setopt prompt_subst

RPROMPT='%40<...<%~`rprompt-git-current-branch`($?)'
PROMPT="%m %n%# "

これで左側にマシン名とユーザ名、右側にカレントディレクトリと(gitリポジトリ内なら)gitブランチ名と直前のコマンドの終了コードを表示するようになりました。

ちなみに、ちょっと長いコマンドを打ったりして右プロンプトにかぶりそうになるとプロンプトがさっと消えます。粋です。

とりあえずこんな感じを初期設定として、後から好みに応じて色々弄っていこうと思います。

Comments