MSYS2 にてコマンドライン環境をつくる: セットアップ編

# 目次
- [x] セットアップ編（ここ）
- [ ] シェル編
- [ ] リポジトリ管理編

# はじめに
プログラマーたるもの、やはりコマンドライン環境には憧れるものがあります。黒い画面に何やらコマンドを打ち込み、作業を行う姿は如何にもプログラマーらしく、かっこいいものですね。もしくは、開発に必要なツールがＣＬＩ環境用にしかなくて、必要にかられているのでしょうか？

現在 MSYS2 が提供されており、Windows でも簡単にコマンドライン環境が構築できるようになりました。環境を極力汚さないため、不要になってもアンインストールすればすっきり消えてくれます。

インストールするだけなら公式サイトの説明通りでよいのですが、便利な環境を構築するには若干の手間が必要となりますので、個人的メモも兼ねて記述させていただきます。

# 注意
## 筆者はエキスパートではありません
筆者も一応プログラマーですが、コマンドライン環境については MSYS2 を最近インストールしたばかりの初心者です。故に間違った記述、不足した内容などがあるかもしれませんが、もしよろしければご指摘いただければ幸いです。

## 諦めが肝心
MSYS/MinGW とは、Windows へ Unix 向けの GNU ツールチェーンやその他ソフトウェアを移植した環境であり、移植版である以上できることにも限界があります。インストールが上手く行かない、パッケージが古い、正しく表示されない、うまく動かないなど、枚挙に暇がありません。

そんな時は、すっぱりと諦めましょう。今時は便利な GUI ソフトウェアも充実しており、コマンドライン環境に無理に拘る必要もありません。どうしても必要なのであれば、Windows 以外の環境で作業する必要があるかもしれませんね。

## Mac や Linux に移行する
ぶっちゃけた話、Windows で無理にコマンドライン環境を構築するよりは、Mac や Linux を使ったほうが楽だと思いますし、問題も起きにくいと思います。とはいえ、今までに Windows しか使ったことがない、あるいは持っていないのであれば、移行コストは無視できるものではありません。お金や時間と相談してみてくださいね。

# MSYS2 セットアップ
## インストーラのダウンロード
以下のサイトから、インストーラをダウンロードしてきます。
[MSYS2 installer](https://msys2.github.io/)
ファイル `msys2-i686-YYYYMMDD.exe` が 32-bit 環境向け、ファイル `msys2-x86_64-YYYYMMDD.exe` が 64-bit 環境向けとなります。

今時の Windows は大抵 64-bit でしょうから、ここでは後者のファイルをダウンロードしたとして進行します。32-bit 開発環境もセットで付いてきますので、32-bit 向けに開発をしたい場合でも問題ありません。

## インストール
インストーラを実行すれば、日本語でインストールが始まりますので、指示通り進めましょう。

インストール先も自由ですが、ここではデフォルトのインストール先 フォルダ `C:\msys64` にインストールしたとして進行します。

## アップデート
`MSYS 64bit を実行中` をチェックして完了するか、インストール先フォルダにある `msys2_shell.bat` を実行すると、ターミナル（mintty）が起動します。

MSYS2 の基本システムを更新するため、`update-core` と入力し、実行してください。特にエラーも発生せず、アップデートが無事完了したら、一旦ターミナルを終了します。`Alt+F4` か、ウィンドウの閉じるボタンで終了してください。

インストール先フォルダにある `msys2_shell.bat` を実行して、もう一度ターミナルを起動します。

次は、インストール済みのパッケージをアップデートするため、`pacman -Su` と入力し、実行します。

正常に終了すれば、MSYS2 のセットアップは完了です。お疲れ様でした！

# winpty セットアップ
しかし、このままでは一部問題のあるソフトウェアが出てきます。以下のサイトにて詳しい解説がありました。

[MinGW の mintty で対話モード、ついでに vim 設定 | ユニマージュ](http://dogwood.skr.jp/blog/2013/11/406/)
> MinGW に含まれる mintty は対話モードを必要とする Windows ネイティブ・アプリケーションをうまく扱えません。sqlite3 や Python、Node.js や Git などが、この影響を受けます。対話モードで起動するオプションを持っているものは、"-interactive" や "-i" オプションをつけて起動すれば利用できますが、オプションがないものは手がありません。

問題のあるソフトウェアを避ければよいのですが、どれもこれも重要なソフトウェアで避けるわけにも行きません。この問題を解決するために、winpty をインストールします。

## インストール
MSYS2 では、既にパッケージとして用意されているソフトウェアなら、コマンド一発でインストールすることが出来ます。

`pacman -Ss winpty` と入力して実行し、winpty が用意されているか検索してみましょう。

```
msys/winpty-git 1~0.2.2.365.79c9859-1
    A Windows software package providing an interface similar to a Unix
    pty-master for communicating with Windows console programs
```

無事見つかりました。

次に、`pacman -S winpty-git` と入力して実行します。先ほどの出力からパッケージ名をコピーする際は、右クリックメニューからコピーを選択するか、`Ctrl+Ins` でコピーできます。

インストールが完了したら、`winpty --version` と入力して実行し、正しくインストールされているか確認します。大抵は `-v` か `--version` でバージョン情報が、`-h` か `--help` でヘルプが出力されますので、インストールした直後は確認するようにする習慣をつけるといいでしょう。

## シェルをラップする
必要に応じて winpty を使用する場合、`winpty python` などコマンドの前に winpty を指定します。あるいは予めエイリアスを指定しておく手段もありますが、一つ一つ対応するのは面倒かもしれません。

もう一つの手段として、シェル自体をラップしてしまう方法があります。

ターミナルを起動する際のバッチファイルは３種類（`msys2_shell.bat`, `mingw32_shell.bat`, `mingw64_shell.bat`）用意されておりますが、基本的な内容は同一です。そのうちの任意のファイル、あるいは全てのファイルを編集します。

デフォルトでは、３９行目あたりに以下の記述があります。

```
start %WD%mintty -i /msys2.ico /usr/bin/bash --login %*
```

この行の、`/usr/bin/bash` の手前に `/usr/bin/winpty` を挿入します。

```
start %WD%mintty -i /msys2.ico /usr/bin/winpty /usr/bin/bash --login %*
```

これで、このバッチファイルから起動すれば、シェル自体がラップされるようになりました。個別にラップしなくても、自動的にラップされます。

ただし、全てラップされるということは、ラップによる不具合が出る可能性もあるということです。筆者が確認した限りでは tmux が起動できなくなってしまいました。今のところ使用しないということで割りきっておりますが、使用したい方は個別にラップするか、ラップの必要のあるソフトウェアを諦める必要が出てきます。

# フォント
MSYS2 ではなく mintty の領域となりますが、見やすいプログラミング向けフォントなどを設定することをおすすめします。

## Ricty
https://github.com/yascentur/Ricty
有名なフォントで、Mac や Linux でも使用している方が多いようです。
ただし、ライセンスの問題から生成スクリプトのみが配布されており、インストールにはやや知識が必要となります。

## Ricty Diminished
https://github.com/yascentur/RictyDiminished
こちらは使用可能な漢字が少ないものの、フォントファイルが配布されているためインストールが簡単です。

## Myrica
http://myrica.estable.jp/
（ASCII文字のみ）ヒンティング付きのため、文字が小さい環境でも文字が潰れません。
また、可読性のためにデザインが調整されており、似ている文字も見分けがつくようになっています。

# 参考
* [MSYS2 による gcc 開発環境の構築](http://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049)
* [MSYS2における正しいパッケージの更新方法](http://qiita.com/k-takata/items/373ec7f23d5d7541f982)