Windows で快適なシェル生活を送りたい

# MSYS2
MSYS2 は，最新の Cygwin と MinGW-w64 をもとにした UNIX ライクのシェル環境です．
デフォルトのターミナルとシェルは mintty と bash，パッケージ管理には Arch Linux の pacman を採用しています．

MSYS の msys，MinGW の mingw32 と mingw64 の 3 種類のバイナリがあり，それぞれ別々のディレクトリにインストールされます．
MSYS の gcc で生成したバイナリは msys-2.0.dll に依存するため，MSYS2 環境下でしか実行することができませんが，MinGW の gcc で生成したバイナリは単独で実行することができます．

## インストール
インストーラは [ここ](https://msys2.github.io/) からダウンロードできます．

セットアップが完了すると，

- MSYS2 MSYS
- MSYS2 MinGW 32-bit
- MSYS2 MinGW 64-bit

の 3 つのシェルが使えるようになります．
いずれも実体は `C:\msys64\msys2_shell.cmd` です．
これらはすべて MSYS のバイナリがインストールされたディレクトリをパスに含みますが，起動時のオプションによっては MinGW のディレクトリもパスに含めます．
とりあえず，MSYS2 MinGW 64-bit を使えばいいでしょう．

続いて，pacman の更新を行います．
まず，パッケージデータベースを更新し，pacman の更新を行います．

```
pacman -Sy pacman
```

必要があればターミナルを再起動します．
次に，パッケージデータベースとコアシステムパッケージを更新します．

```
pacman -Syu
```


必要があれば，再度ターミナルを再起動してパッケージの更新を継続します．

```
pacman -Su
```

以上でインストールは終了です．


## パッケージの管理

pacman は非常に使いやすいパッケージ管理システムです．

```
パッケージの検索
% pacman -Ss [パッケージ名]

パッケージのインストール
% pacman -S [パッケージ名]

パッケージの削除
% pacman -R [パッケージ名]

パッケージとそれ以外で使用されていない依存関係にあるパッケージを削除
% pacman -Rs [パッケージ名]

リポジトリとローカルパッケージデータベースとの同期およびアップグレード
% pacman -Syu

インストール済みパッケージの検索
% pacman -Qs [パッケージ名]

インストール済みパッケージの情報
% pacman -Qi [パッケージ名]

キャッシュと使われていないリポジトリのクリーンアップ
% pacman -Scc

インストール済みパッケージの表示
% pacman -Q
```

Windows にこだわる必要が無いのであれば，この機会に Arch Linux に移行してみてはいかがでしょうか．

## pacman の設定

パッケージを検索したときに msys, mingw32, mingw64 それぞれのバイナリが表示されて見づらいので，mingw32 のバイナリを表示しないようにします．

```diff:pacman.conf
-[mingw32]
-Include = /etc/pacman.d/mirrorlist.mingw32
+#[mingw32]
+#Include = /etc/pacman.d/mirrorlist.mingw32
```

カラー表示を有効にします．

```diff:pacman.conf
-#Color
+Color
```

## Zsh のインストール

pacman から Zsh 本体と設定をインストールしておきます．

```
pacman -S zsh grml-zsh-config
```

次に，ターミナル起動時に Zsh が起動するように `C:\msys64\msys2_shell.cmd` の設定を変更します．

```diff:msys2_shell.cmd
-start "%CONTITLE%" "%WD%mintty" -i /msys2.ico /usr/bin/bash --login %1 %2 %3 %4 %5 %6 %7 %8 %9
+start "%CONTITLE%" "%WD%mintty" -i /msys2.ico /usr/bin/zsh --login %1 %2 %3 %4 %5 %6 %7 %8 %9
```

ターミナルを再起動すると Zsh がお出迎えしてくれます．

## gcc のインストール

pacman で gcc のパッケージを検索してみます．

```
pacman -Ss gcc
```

```shell-session
mingw64/mingw-w64-x86_64-gcc 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-ada 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Ada) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-fortran 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libgfortran 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libs 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (libraries) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-objc 6.2.0-2 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
mingw64/mingw-w64-x86_64-lcov 1.12-1
    front-end for GCC's coverage testing tool gcov
msys/gcc 5.3.0-3 (msys2-devel)
    The GNU Compiler Collection - C and C++ frontends
msys/gcc-fortran 5.3.0-3 (msys2-devel)
    Fortran front-end for GCC
msys/gcc-libs 5.3.0-3 (base)
    Runtime libraries shipped by GCC
msys/mingw-w64-cross-gcc 5.3.0-1 (mingw-w64-cross-toolchain mingw-w64-cross)
    Cross GCC for the MinGW-w64
```

`mingw64/mingw-w64-x86_64-gcc` と `msys/gcc` の 2 種類のバイナリがあることが確認できます．

MinGW の gcc をインストールする場合は，

```
pacman -S mingw-w64-x86_64-gcc
```

MSYS の gcc をインストールする場合は，

```
pacman -S gcc
```

とします．

余談ですが，開発環境をまとめてインストールしたい場合は次のグループをインストールすればだいたいのものはそろいます．


- `base-devel` - いろんなパッケージのビルド
- `msys2-devel` - msys2 パッケージのビルド
- `mingw-w64-i686-toolchain` - mingw32 パッケージのビルド
- `mingw-w64-x86_64-toolchain` - mingw64 パッケージのビルド


# 参考

- [MSYS2 / Wiki / Home](https://sourceforge.net/p/msys2/wiki/Home/)
- [Windowsで使えるターミナルとシェルのまとめ - Qiita](http://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904)
- [MSYS2でWindowsにzsh環境を導入する - Qiita](http://qiita.com/magichan/items/7702d7865deaaca2ad44)
- [MSYS2を試してみる - kashiの日記](http://verifiedby.me/adiary/055)
- [Arch Linux のパッケージ管理システム<Pacman, Yaourt>でよく使用するコマンド](https://gist.github.com/9H/e4534bf276ca908a63f7)