zshのhistoryを便利に使うためのTips

ここで言う`history`とは､コマンド履歴のことです｡シェルはもちろん`zsh`です｡この投稿を読んでくれている人は､多分`zsh`を使っていると思いますが､まだ入れてないという人は以下の様な手順を踏むと､`zsh`をインストールすることができます｡

#zshのインストール
##Windowsユーザーの場合
`Cygwin`というものを使います｡まず､`Ctrl`+`R`を押して､`powershell`と入力し､`Enter`を押しましょう｡そして､以下のスクリプトを実行します｡または､[こちら](http://www.cygwin.com/)からダウンロードして､実行ファイルをダブルクリックするのもいいかもしれません｡その際は､`Wget`だけにはチェックを入れておきましょう｡

```
function Install-Cygwin {
   param ( $TempCygDir="$env:temp\cygInstall" )
   if(!(Test-Path -Path $TempCygDir -PathType Container))
    {
       $null = New-Item -Type Directory -Path $TempCygDir -Force
    }
   $client = new-object System.Net.WebClient
   $client.DownloadFile("http://cygwin.com/setup.exe", "$TempCygDir\setup.exe" )
   Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin"
   Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin -P openssh"
   Start-Process -wait -FilePath "$TempCygDir\setup.exe" -ArgumentList "-q -n -l $TempCygDir -s http://mirror.nyi.net/cygwin/ -R c:\Cygwin -P wget"
}
```


```
Install-Cygwin
```

インストールできたら､早速起動し､[apt-cyg](http://code.google.com/p/apt-cyg/)コマンドを使えるようにします｡

```
wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg 

mv apt-cyg /usr/bin
 
chmod +x /usr/bin/apt-cyg
```

最後に､`zsh`をインストールして使えるようにします｡

```
apt-cyg install zsh vim

sed -i 's/bash/zsh/g' /Cygwin.bat

touch ~/.zshrc

/Cygwin.bat
```

詳しくは､[こちら](http://yanother.blogspot.jp/2011/02/zsh.html)の記事が参考になります｡

##Linuxユーザーの場合
```shell:Ubuntu
sudo apt-get install -y zsh

sudo chsh -s /bin/zsh
```

##Macユーザーの場合
Macユーザーの場合は､デフォルトでインストールされていると思います｡よって､`chsh`コマンドだけでもOKです｡しかし､最新版を使いたかったら､`Homebrew`などを使ってインストールします｡

```shell:Homebrewの導入 
/usr/bin/ruby -e "$(/usr/bin/curl -fksSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
```
```
brew install zsh

which zsh

chsh -s /usr/local/bin/zsh
```

#zshのhistoryを便利に使うためのTips
##historyを使う
基本的には､`C-r`を押すと､history検索できます｡

```shell:~/.zshrc
# 履歴ファイルの保存先
export HISTFILE=${HOME}/.zsh_history

# メモリに保存される履歴の件数
export HISTSIZE=1000

# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000

# 重複を記録しない
setopt hist_ignore_dups

# 開始と終了を記録
setopt EXTENDED_HISTORY
```

##全履歴を一覧表示する

```shell:~/.zshrc
function history-all { history -E 1 }
```

ここで､特定のキーワードのみを覚えていた場合､それらをつなぎあわせて検索することで､複雑なワンライナーの再利用も簡単になります｡

```
history-all | grep find | grep tr
```


##historyの選択
historyを選択したいのなら[zaw.zsh](https://github.com/zsh-users/zaw)が便利です｡`Git`をインストールした状態で以下のように設定します｡

```
echo -e "function mkcd(){mkdir -p \$1 && cd \$1}" >> ~/.zshrc && exec $SHELL

mkcd ~/zsh_plugin/

git clone git://github.com/zsh-users/zaw.git

echo "source ${PWD}/zaw/zaw.zsh" >> ~/.zshrc && exec $SHELL
```

デフォルトでは､`Ctrl-x ;`で起動します｡



以下のようなキーバインドを設定することで､`C-h`を押すと､容易にhistory一覧を表示し､選択できるようになります｡ちなみに､`auto-fu.zsh`などを導入している場合は､`C-g`を押してから入力しましょう｡

```shell:~/.zshrc
bindkey '^h' zaw-history
```

##historyの検索
入力に合わせてhistoryを検索したい場合は､以下のキーバインドを設定しておくと簡単に検索できて便利です｡

```shell:~/.zshrc
# history search
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
```

##historyの共有
```~/.zshrc
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
```