MSYS2でWindowsにzsh環境を導入する

## 【はじめに】
MSYS2でmintty+zshなシェル環境を構築する為の手順をまとめておきます。
[以前の記事](http://qiita.com/magichan/items/81fc400a9bf2c94c135b) と重複になる部分が多々ありますので、既にMSYS2を導入されている方は適当に読み飛ばしてください。

##【MSYS2のインストール】
まずは
http://sourceforge.net/projects/msys2/files/Base/
より、最新のMSYS2をダウンロードします。
ファイルは64bit版/32bit版、インストーラ形式/アーカイブ形式が
それぞれありますので自分の環境に合ったものをお好みで選択したください。

次に、ダウンロードしたファイルを適当なディレクトリにインストール（又は展開）します。
インストールするディレクトリとしては

* パス名にASCII文字以外使用しない
* パス名にスペースを使用しない

の制限があります。また最大パス長の制限もあるようなので、出来るだけドライブ直下にインストールするのが良いと思われます。

##【MSYS2の起動】
MSYS2をインストールしたディレクトリー以下に
・msys2_shell.bat
・mingw64_shell.bat
・mingw32_shell.bat
の３つの起動スクリプトが提供されています。
どれを使ってもshellが立ち上がりますので、通常は*msys2_shell.bat*から起動しておけば問題ありません。
以後、MSYS2の起動を楽に行えるように*msys2_shell.bat*のショートカットをデスクトップやスタートメニューに作成しておくことを推奨します。

##【パッケージマネージャ(pacman)の起動】
MSYS2を起動したら、はじめにパッケージマネージャを起動して、パッケージのリポジトリとローカルパッケージのデータベースの同期処理＆インストール済みパッケージのアップデート処理を行います。

```
$ pacman -Suy
```
終了したら、MSYS2を一旦終了させ再起動してください。
再起動したら、パッケージマネージャより最低限必要なパッケージを取得して環境を整えます。

```
$ pacman -S vim git wget sed diffutils grep tar unzip
```

pacman の使用法としては

|機能      |コマンド|
|:--------:|:------|
|パッケージのインストール|pacman -S パッケージ名|
|パッケージの削除|pacman -R パッケージ名|
|パッケージの情報表示|pacman -Si パッケージ名|
|パッケージ一覧|pacman -Sl|
|パッケージ検索|pacman -Ss キーワード|
|パッケージファイルのインストール|pacman -U ファイル名|
|データベース同期処理|pacman -Sy|
|パッケージのアップデート処理|pacman -Su|
あたりを押さえておけば問題ないと思います。

##【minttyの導入】
MSYS2では minttyがデフォルトで動作するので特にする事はないのですが、見た目を良くするためのカスタマイズを若干しておきす。

カスタマイズは、minttyのウィンドウズ上で「右クリック」から[Options...]から行ってください。
主な変更箇所としては
[Looks] -> Colours : 文字色・背景色の変更
[Looks] -> Transparency : ウィンドウの透過度を設定
[Window] -> Default size : 起動時のウィンドウサイズを設定
[Text] -> Font : でフォントの設定
あたりをお好みで変更すると良いと思います。また、
[Text] -> Locale : ja_JP
[Text] -> Character set : UTF-8
に設定しておくことをお勧めします。

私の場合は
Colors : Default
Transparency : High
Font : [Migu 1M](http://mix-mplus-ipa.sourceforge.jp/migu), 11-point
Font smoothing : Partial
Default size : 80 x 60
と設定しております。

##【winptyラッパのインストール】
winptyはminttyを使用する上での**必須**パッケージです。
*mintty*はとても使い勝手が良い環境なのですが、**「一部のアプリで対話モードが動作しない」**といった問題点が存在します。（これは、Python/Node.js等をを使用する上では致命的な問題となります。）

この問題を解決するのが[winptyラッパ](https://github.com/rprichard/winpty) となります。
例えば C:\Python27 以下にPython2がインストールされている場合、直接

```
$ /c/Python27/python.exe
 (無反応・・)
```

としても応答を得ることができません。このような場合は winptyラッパを使って

```
$ winpty /d/Python27/python.exe
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>>

```
のようにpythonを起動すると問題なく応答を得ることができます。

幸いなことにMSYS2でwinptyのパッケージが提供されておりますので、これをインストールします。

```
$ pacman -Ss winpty
msys/winpty-git 1.1.1.148.47a69d0-2
    A Windows software package providing an interface similar to a Unix
    pty-master for communicating with Windows console programs

$ pacman -S winpty-git
```

> Note : 従来リポジトリ上から取得したwinptyラッパのソースコードをビルドた際に得られるコマンドの名称は'console.exe' でしたが、このwinptyパッケージでは 'winpty.exe' というコマンドの名称になっておりますので注意してください。

##【zshのインストール】
次にzshのパッケージをインストールします。
zshもMSYS2よりパッケージが提供されていますので、パッケージマネージャ(pacman)から

```
$ pacman -Ss zsh
msys/zsh 5.0.7-3
    A very advanced and programmable command interpreter (shell) for UNIX
msys/zsh-doc 5.0.7-3
    Info, HTML and PDF format of the ZSH documentation

$ pacman -S zsh
```
で簡単にインストール出来ます。

動作を確認してみます。

```
$ zsh --version
zsh 5.0.7 (x86_64-pc-msys)

$ zsh
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---

```

初期起動時の設定メニュー表示され、問題なく動作しているようです。ここでは一旦[q]を押してメニューを終了してください。


##【zshをログインシェルに設定する】
MSYS2には */etc/passwd*も chshコマンドもありませんので、起動スクリプトを編集することで、ログインシェルをbashからzshに変更することにします。

*/msys2_shell.bat* をエディタを開いて、minttyを起動している部分を編集します。

```msys2_shell.bat
start %WD%mintty -i /msys2.ico /usr/bin/bash --login %*
```
 の箇所を

```msys2_shell.bat
start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %*
```
と変更するだけです。

> ここでは*msys2_shell.bat*を編集していますが*mingw64_shell.bat*と*mingw32_shell.bat*も同様です。

変更が完了した後に、再度起動スクリプトを実行してみると・・

```
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---

```
と問題なくzshが起動します。
ところがメニュー終了後にzsh上で

```
% echo $SHELL
```
と入力しても何も表示されません（原因不明）。
特に問題はないかと思いますが少しのが気になりますので対応しておきます。
これは*/etc/profile*を編集して

```/etc/profile.
elif [ ! "x${ZSH_VERSION}" = "x" ]; then
  HOSTNAME="$(/usr/bin/hostname)"
  profile_d zsh
  PS1='(%n@%m)[%h] %~ %% '
  SHELL=`which zsh`                                     <------------これを追加
elif [ ! "x${POSH_VERSION}" = "x" ]; then
```
の追加部分を修正してください。
修正後、MSYS2を再起動すると

```
% echo $SHELL
/usr/bin/zsh
%
```
と表示されるようになります。


##【残念ながら問題が・・】
以上でzsh環境構築完了です。あとはzshをカスタマイズして素敵なzshライフをお楽しみください。

と言いたいところですが残念ながら**問題発生**。

どうやらこのMSYS2のzshでは履歴ファイルが扱えないみたいです。（履歴機能自体は問題ないのですが、HISTFILEを設定してもファイルに書き出せないようです）
調べてみるとヒストリファイルのロック部に問題があるようで、[本家](https://github.com/Alexpux/MSYS2-packages/issues/129)でも問題が指摘されております。

履歴ファイルが使えないと「zshの魅力半減じゃーん」という方もいると思いますので、次は対策を行いたいとおもいます。

こちらに続く → 「[MSYS2のZSHで履歴ファイルが扱えない不具合を修復する](http://qiita.com/magichan/items/6b89c97170ad2b2616f0)」