とりあえずZshを使えば良いんだろう？


Zshに移行するにあたってやった事。

# Why zsh.
#### Only this one.(嘘というか受け売り)
- 軽量で強力な補完機能

#### Only this one.(本当)
- 凄腕の人たちが使っているので、自分も使ってみたらzshの良さの恩恵を受けられるかなと思ったから。


# zshのインストール
Macの場合デフォルトでも入っているけど、新しいのをインストールする。

```
brew install zsh
brew install zsh-completions
```
2個目の```zsh-completions```は非標準コマンドを補完できるようになる素敵なプラグイン

## ログインシェルをzshにする

さらbash(さらば bash)

### brewでインストールしたzshをシェル一覧に登録する。

```ターミナル
vi /etc/shells
```

```/usr/local/bin/zsh``` を追加する

```
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```

### デフォルトの変更 -Goodbye bash-

```ターミナル
$ chsh -s /usr/local/bin/zsh
```

- Zshをデフォルトシェルとして起動するには、ログアウト・ログインが必要

# zshの力を40秒で味わう

## 設定に魔法の2行の追加

```vi ~/.zprofile``` して魔法の2行を付け加える。たぶん新規作成。

```~/.zprofile
autoload -U compinit
compinit
```

```.source ~/.zprofile``` (もしくは、ターミナル再起動して再ログイン)をする。

#### ```ls -```を入力したら```tab```キーを押す。

そこには幸せが見えるはず。
```rm -``` ```tab```とか ```mysql -``` ```tab``` とか ```git ``` ```tab```とか試したくなるはず。

### .zprofile? or .zshrc?

**コメントにて[@mollifier](http://qiita.com/mollifier)さんにご指摘頂いたので、本項で補足いたします。ありがとうございます。**

[漢のzsh](http://news.mynavi.jp/column/zsh/001/)初め、先駆者の方々曰く、profileがロードされるのは以下のようなタイミングと順序となる。

> ログインシェルとしてzshが起動された場合
> 
>> 1 ~/.zshenv
>> 2 ~/.zprofile
>> 3 ~/.zshrc
>> 4 ~/.zlogin
> 
> インタラクティブシェル（ログインシェルとしてではない）としてzshが起動された場合
> 
>> 1 ~/.zshenv
>> 2 ~/.zshrc
> 
> シェルスクリプトを実行するコマンドとしてzshが起動された場合
> 
>> 1 ~/.zshenv

そして多くの諸兄たちは.zshrcを推奨しているが、ここではあえて.zprofileに記述することにする。
これはインタラクティブシェルとしてzshを起動した場合、通常にログインした場合との挙動の違いに気が付き設定ファイルを理解して移行したいと思っているため。
コピペなので少しでも自分で考えてprofileを書こうと思う私なりの防御策。
なお、.zshenvに記述するとzshをスクリプトとした場合に、環境固有の設定が読み込まれるため汎用性が損なわれる。

## 元の設定の移行

PATHの設定等だけであれば ```.bash_profile``` がそのまま使えるので、```.zprofile``` に追加する。
ただし、プロンプトとかを弄っている場合はプロンプトの書き方が異なるので注意。

邪道なやり方なのかも知れないけど、これでOK。

```ターミナル
cat .bash_profile >> .zprofile
```

もしくは

```ターミナル
echo "source ~/.bash_profile" >> .zpofile
```

これで今まで使っていたbashのPATHとかを引き継ぎつつzshが使える。

### プロンプトを書き換える

shのカスタマイズというとまずはプロンプトでしょ。
と言うか、Mac(Yosemite)の場合、bashのプロンプトの設定は```/etc/bashrc```に書いてあり、あまり不便は感じない設定である。
当たり前だけどzshにすると ```/etc/bashrc``` は読み込まないためプロンプトが今までとは変わる。
恐らくzshのデフォルトだとホスト名しか表示されず、ユーザもカレントディレクトリも表示されない。

Macのデフォルトと同じにするには```.zprofile```をこんな感じにする。

```.zprofile
# prompt
PROMPT='%m:%c %n$ '
```

#### 使いそうなパラメタ

|パラメタ|意味|例|
|:--|:--|:--|
|%M|ホスト名|localhost.localdomain|
|%m|ホスト名|localhost|
|%d|カレントディレクトリ(フルパス)|/Users/ktr_type23/work|
|%~|カレントディレクトリ(フルパス2)|~/work|
|%C|カレントディレクトリ(相対パス)|ktr_type23|
|%c|カレントディレクトリ(相対パス)|~|
|%n|ユーザ名|ktr_type23|
|%#|ユーザ種別|#(root) %(root以外)|
|%?|直前のコマンドの戻り値|0|
|%D|日付(yy-mm-dd)|15-02-10|
|%W|日付(yy/mm/dd)|15/02/10|
|%w|日付(day dd)|Tue 10|
|%*|時間(hh:mm:ss)|12:34:56|
|%T|時間(hh:mm)|12:34|
|%t|時間(hh:mm(am/pm))|00:34PM|


#### 装飾

なお、```%F{色}%f``` で囲むと、その文字を色付け出来る。
これでカレントディレクトリがgreenに色付けされる。

```.zprofile
# prompt
PROMPT='%m:%F{green}%c%f %n$ '
```

背景を変えたい場合は ```F(f)``` ではなく ```K(k)``` で囲えば良い。

```.zprofile
# prompt
PROMPT='%m:%K{green}%c%k %n$ '
```
※ backgroundの **k** らしい。わかんねーよ。。

なお、色の指定は文字だけでなく、数値でも指定出来るらしい。

|文字|数値|
|:--|:--|
|black|0|
|red|1|
|green|2|
|yellow|3|
|blue|4|
|magenta|5|
|cyan|6|
|white|7|


# Tips

## 最初の.zprofile
.zprofileを晒すと共にメモ。

```.zprofile
# zsh最強の2行
autoload -U compinit
compinit

# promptinitを使う場合はこちらを読み込む
# 利用可能なpromptの設定を見る
# $ prompt -l
# promptを設定する
# $ prompt [prompt名]
autoload -U promptinit
promptinit
# promptを独自で変更
PROMPT='%m:%F{green}%c%f %n%# '

# 履歴ファイルの保存先
export HISTFILE=${HOME}/.zhistory
# メモリに保存される履歴の件数
export HISTSIZE=1000
# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000
# 重複を記録しない
setopt hist_ignore_dups
# 開始と終了を記録
setopt EXTENDED_HISTORY
# historyを共有
setopt share_history
# ヒストリに追加されるコマンド行が古いものと同じなら古いものを削除
setopt hist_ignore_all_dups
# スペースで始まるコマンド行はヒストリリストから削除
setopt hist_ignore_space
# ヒストリを呼び出してから実行する間に一旦編集可能
setopt hist_verify
# 余分な空白は詰めて記録
setopt hist_reduce_blanks  
# 古いコマンドと同じものは無視 
setopt hist_save_no_dups
# historyコマンドは履歴に登録しない
setopt hist_no_store
# 補完時にヒストリを自動的に展開
setopt hist_expand
# 履歴をインクリメンタルに追加
setopt inc_append_history
# インクリメンタルからの検索
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward

# migration .bash_profile
source ~/.bash_profile
```

## 幸せに思った事
### ヒストリー検索
上記の.zprofileを設定している(正確には以下の設定があれば良い？)場合、
```Control + r```を入力すると過去のヒストリを検索出来る。
途中まで入力して、```Control + r(or s)```を入力すると前方一致でインクリメンタルに検索してくれる。

```.zprifile
# 履歴ファイルの保存先
export HISTFILE=${HOME}/.zhistory
# 履歴をインクリメンタルに追加
setopt inc_append_history
# インクリメンタルからの検索
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward
```


### 参考
[漢のzsh](http://news.mynavi.jp/column/zsh/001/)
[ヾ(oﾟωﾟo)ﾉﾞbashからzshに移行して2014年を迎えよう！[ログインシェル]](http://qiita.com/harapeko_wktk/items/47aee77e6e7f7800fa03)
[zshのhistoryを便利に使うためのTips](http://qiita.com/syui/items/c1a1567b2b76051f50c4)