MSYS2で快適なターミナル生活

# MSYS2で快適なターミナル生活

Windowsでコマンドラインの環境を整えるには、MSYS2が優秀だ。
デフォルトのターミナルはmintty、シェルはbash、パッケージマネージャとしてpacmanがついている。
Windowsのパッケージ管理ソフトChocolateyをインストールすれば体制は万全だ。
ソフトウェアのインストールをほぼコマンドラインだけで済ませることができる。
つまりシェルスクリプトを組めばバックアップやセットアップも自動化できるということだ。
あとは設定ファイルをgithubなどに格納してインストール用スクリプトを書けば完璧だろう。

## MSYS2 - Minimal SYStem 2

MSYS2はWindows上で動くUnixシェル環境だ。
詳しくは[Windowsで使えるターミナルとシェルのまとめ](http://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904)を参照されたし。

よくMinGWと一緒に語られているが、MinGWはGCCなどの開発ツールをまとめたツールチェインだ。
MinGWのインストーラーを使うと、古いMSYSを導入できるが、minttyはついていない。
古いMSYSはMSYS2ではないことも強調しておく。
なので、MSYS2からpacmanでMinGWをインストールするのが正解だ。

またMSYS2の競合相手としてCygwinが挙げられるが、こちらは使う人を選ぶ。
使いにくいパッケージインストーラー、独特のパス(cygdrive)、cygwin1.dll依存という問題があるからだ。
パッケージインストーラーの問題はapt-cygがあるので緩和されたが、最初にwgetかcurlまたはgitをいれておかないと、apt-cygスクリプトのダウンロードにも手間がかかる。
パスの設定もめんどくさいので、その辺りを自動で行ってくれるMSYS2の方が便利だ。

参考
[MSYS - Wikipedia](https://ja.wikipedia.org/wiki/MSYS)
[Cygwin - Wikipedia](https://ja.wikipedia.org/wiki/Cygwin)

### MSYS2のインストールと起動

[MSYS2 installer](https://msys2.github.io/)

i686が32bit版で、x86_64が64bit版だ。
ここでは32bit版を前提に話をすすめる。

msys2-i686-20160205.exeをダウンロードしてMSYS2をインストールする。
(年月日の記述はバージョンによって変化するので最新版をダウンロードすること)
デフォルトでは`C:\msys32`にインストールされる。

インストールフォルダに幾つか起動用のバッチファイルが見つかるが、それぞれ環境変数やパスの設定が変わるので用途によって使い分けるとよい。

* msys2_shell.bat
開発環境(MinGW)が必要でない場合のmintty+bashの起動スクリプト。

* mingw32_shell.bat
`\mingw32\bin`のパスなどが通った状態で起動できる。
MinGW自体はpacmanでインストールが必要となる。

MSYS2ではデフォルトではlnでシンボリックリンクの作成ができないのだが、起動batファイルの中にある行をアンコメントすると、シンボリックリンクの作成ができるようになる。
なお、シンボリックリンクの作成には管理者権限が必要だ。

    rem To activate windows native symlinks uncomment next line
    set MSYS=winsymlinks:nativestrict


参考
[MSYS2 による gcc 開発環境の構築](http://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049)
[msys2 + pacmanをproxy環境で使う](http://nantonaku-shiawase.hatenablog.com/entry/2014/10/11/163342)
[MSYS2小ネタ集](http://qiita.com/ubnt_intrepid/items/0d9ea1c792dd2049d71c)

### minttyの設定

ターミナルはminttyが使用されている。
起動したら早速設定を変更する。
Windows Glassのモダンな見た目を設定することができるのは他にはない特徴だ。
Glass表示は白背景には弱いが、黒背景を使っている場合は、カッコよさが際立つ。
実用優先なら透過率(Transparency)をHighにするのが良いだろう。

オススメは下記のとおりだ。

    Looks => Transparency => Glass
    Looks => Cursor => Block, Blinking

    Text => Font => Select...
    Ricty Diminished, 11-point
    OR
    MyricaM M, 11-point

    Text => Locale => ja_JP
    Text => Character set => UTF-8

    Window => Scrollbar => None

    Terminal => Type => xterm-256color


minttyの設定は`~/.minttyrc`(`C:/msys32/home/[user]/.minttyrc`)というファイルに保存される。
ファイルを直接編集した方が自由度が高い設定を行える。
下記は実際に使っている`.minttyrc`の内容だ。

    # .minttyrc
    BoldAsFont=no
    Font=MyricaM M
    FontHeight=11

    Columns=115
    Rows=58
    CursorType=block
    Scrollbar=none
    Transparency=glass
    BackgroundColour=0,0,0
    ForegroundColour=243,243,243

    Locale=ja_JP
    Charset=UTF-8
    Term=xterm-256color

    CopyOnSelect=yes
    RightClickAction=paste
    BackspaceSendsBS=yes

    IMECursorColour=255,0,0


フォントはRictyかMyricaが見やすい。
[yascentur/RictyDiminished - GitHub](https://github.com/yascentur/RictyDiminished)
Inconsolataベース。

Download ZIPボタンまたはreleases内の最新のZIPから入手できる。
解凍するとttfファイルがあるので複数選択して右クリックでインストールできるはずだ。
Discordと付いている方は数字の0がスラッシュではなくドットだったり、小文字のlが片足だったりと微妙な違いがある。

[tomokuni/Myrica - GitHub](https://github.com/tomokuni/Myrica)
Inconsolataベース。
濁点・半濁点が大きくて日本語が非常に見やすい。

参考
[man mintty](https://mintty.github.io/mintty.1.html)
[mintty/mintty/Wiki/Tips](https://github.com/mintty/mintty/wiki/Tips)

### pacman

pacmanはMSYS2のパッケージ管理システムだ。
ArchLinux由来でとても使い勝手がいい。
パッケージ管理システムの便利さに慣れてしまえば、もうそれ無しではいられない。
MSYS2(mintty+bash)を起動したら初めにやることはパッケージの更新だ。

    update-core
    # 更新があれば一度閉じて開き直す
    pacman -Su


`update-core`スクリプトが導入される以前は`pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime`というコマンドが使用されていた。

`pacman -Syu`で更新すると`update-core`を忘れた場合、システムがおかしくなる場合があるらしので、`pacman -Su`を使うべし。(現象は未確認だが、念のため)

以下pacmanコマンドのオプションについて、使用頻度の高い順に並べてみた。
ヘルプのやり方だけ覚えておけば、迷った時に確認できるだろう。

1. `pacman -h`でヘルプ。
1. `pacman -S -h`で-Sオプションのヘルプ。
1. `pacman -Su`でパッケージのアップデート(事前にupdate-coreが必要)。
1. `pacman -Ss [pattern]`でパッケージを検索。
1. `pacman -Sl | grep [pattern]`でもだいたい分かる。
1. `pacman -S [package]`でインストール。
1. `pacman -Rs [package]`でアンインストール。
1. `pacman -Sg`でパッケージグループの一覧を表示。
1. `pacman -Qqe`でインストール済みのパッケージ一覧を表示。
1. `pacman -Si [package]`で詳しい情報を表示。
1. `pacman -Sc`で使っていないキャッシュを削除。


参考
[pacman - Wikipedia](https://ja.wikipedia.org/wiki/Pacman)
[pacman - archlinux](https://wiki.archlinuxjp.org/index.php/Pacman)
[Arch Linux - wikipedia](https://ja.wikipedia.org/wiki/Arch_Linux)

### pacmanのリポジトリを制限

MSYS2をそのまま使うとmingw32, mingw64, msysという3つのリポジトリが有効になっている。
このまま使ってもよいのだが、32bit環境だとmingw64というリポジトリは必要ない。
無効にしておいたほうが表示がすっきりするだろう。

`/etc/pacman.conf`というファイルを開き、下記をコメントアウトすればよい。
ついでに`#Color`という行をアンコメントしておくとpacmanのメッセージがカラー表示となる。

    Color

    #[mingw64]
    #Include = /etc/pacman.d/mirrorlist.mingw64


### MinGWのインストール

MinGWとはWindows上で使えるGNUのツールチェインのひとつだ。
ツールチェインとはmake, gcc, gdb, binutils, ライブラリなどがセットになった開発用パッケージのことだ。
MinGWをインストールするとWindows上でconfigureやmake(mingw32-make)が可能となる。
その他にも役立つコマンドが入っているので入れておくべし。

MSYS2のMinGWはパッケージグループとして提供されている。
`pacmans -S [package-group]`とパッケージグループを指定すると多数のソフトウェアを一度にインストールすることができて便利だ。
AdaやFortranなど不要なものもあるがひとまず全て入れておけば間違いない。

    # パッケージグループの一覧を表示する
    pacman -Sg
    # ツールチェインをインストールする
    pacman -S mingw-w64-i686-toolchain


ツールチェインにこのような長い名前が付いているのは、GNUのツールチェインの命名規則に似せてわかりやすくしているからだ。
MinGW32ツールチェインでインストールされるクロスコンパイラは下記のような名前になっている。

`i686-w64-mingw32-gcc.exe`
`[architecture]-[vendor]-[system]-gcc.exe`
i686: PentiumPRO以降の互換機向けのarchitecture
w64: MinGW64というvendor(制作元)
mingw32: MinGW32(Win32API)

これはMinGW64が作成したi686向けMinGW32用GCCという意味になる。

他のツールチェインの一例も載せておく。

`arm-none-eabi-gcc.exe`
`[architecture]-[vendor]-[system]-gcc.exe`
arm: ARM向けのarchitecture
none: なし
eabi: eabiは組み込みベアメタル向け

ARMは組み込み向けで有名なプロセッサだ。
ベンダーがnoneということは、個人または小規模のグループが提供している場合が多い。
eabiとはABIのひとつで、ABIはバイナリにおけるAPIに該当するものだ。
ベアメタルはLinuxOSを使わない場合のシステム構成を指す言葉である。
以上のことから`arm-none-eabi-gcc`はARMプロセッサ向けのベアメタル用GCCということがわかる。

参考
[MinGW - Wikipedia](https://ja.wikipedia.org/wiki/MinGW)
[ツールチェーン - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%84%E3%83%BC%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)
[GNUツールチェーン - Wikiepdia](https://ja.wikipedia.org/wiki/GNU%E3%83%84%E3%83%BC%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)

### bashの設定

デフォルトのシェルはbashだ。
pacmanでzshやfishもインストールできるが、ここでは応用の効くbashを使うことにする。

他のシェルを使いたい場合は下記を参考にするとよい。
zsh
[MSYS2でWindowsにzsh環境を導入する](http://qiita.com/magichan/items/7702d7865deaaca2ad44)
※現在のバージョンでは履歴ファイルの問題は発生していない。

fish
[fishと出会った](http://kip-s.hateblo.jp/entry/2016/01/06/204119)
[Fish-ShellのDesign document読んでみたり、プラグイン試してみたり](http://qiita.com/missi/items/37d9129c52b4abe6184f)
[詳解 fishでモダンなシェル環境の構築](http://qiita.com/susieyy/items/ac2133e249f252dc9a34)

#### /etc/fstab

`/etc`にはMSYS2の設定ファイルが格納されている。
実際のパスは`C:/msys32/etc`だ。

`/etc/fstab`ファイルは起動時に読み込まれ、自動でマウントを行うことができる。
よく使うディレクトリを登録しておくと便利だろう。

    # /etc/fstab
    # パスは/でも\でもよい
    # スペースは\040に置き換える
    C:/workspace /wk
    C:/workspace/git /git
    C:\Program\040Files /pf
    C:\Windows\System32 /sys32


反映させるには再起動が必要となる。
開いているターミナルを一度終了し、もう一度起動させれば`/(ルート)`以下にマウントされているはずだ。

参考
[fstab - Wikipedia](https://en.wikipedia.org/wiki/Fstab)
※fstabはfile system tableの略

#### bashの設定ファイル

cdはカレントディレクトリを変更するコマンドだ。
オプションを省略した場合は、ユーザーのホームディレクトリへ移動する。

    cd
    # もしくは
    cd ~
    # もしくは
    cd ${HOME}
    # もしくは
    cd /home/${USER}

bashでは`~(チルダ)`は展開されてホームディレクトリと同じ意味となる。
実際のパスは`C:/msys32/home/[user]`だ。

ホームディレクトリ以下には、そのユーザー独自の設定ファイルなどが保存されている。
設定ファイルは`.(dot)`から始まるものが多く、それらを総称してdotfilesという。

bashの設定を変更する場合は、`.bash_profile`と`.bashrc`を変更する。
各ファイルの先頭に`echo '.bashrc'`と自身のファイル名を記述しておけば読み込み順がわかりやすい。

~/.bash_profile
ログイン時に一度だけ読み込まれる設定ファイル。
MSYS2の場合は、mintty(+bash)起動時となる。
exportで環境変数などを設定するとよい。

~/.bashrc
対話モードのbashを起動する度に読み込まれる設定ファイル。
起動時に`~/.bash_profile`または`~/.profile`から読み込まれる。
設定ファイルに付いているrcとは`run commands`の意味だ。
aliasやfunctionを設定するとよい。

#### ~/.bash_aliases

aliasの設定をまとめたファイル。
デフォルトでは存在しないので作成する。

`.bash_aliases`の内容は`.bashrc`に直接記述してもよい。
ファイルとして分割していると`.bashrc`に記述する量が減るので見通しが良くなる。
別のシェルから読み込ませて設定を共通化することもできる。

Windowsのエクスプローラー上では`.(dot)`から始まるファイルを作成できない。
bash上であれば、`echo>.bash_aliases`とすれば作成できる。
エクスプローラー上でhoge.txtを作成してから、bashで`mv hoge.txt .bash_aliases`と名前を変更してもよい。

    # .bash_aliasesの中身
    echo '.bash_aliases'

    # Aliases for MSYS2 bash
    # alias hogeを一時的に無効にするには\hoge

    # 移動しやすく
    alias ..='cd ..'
    alias ...='cd ../..'
    alias -- -='cd -'

    # lsを使いやすく
    alias ls='ls --color=auto --show-control-chars --time-style=long-iso -FH'
    alias ll='ls -lA'
    alias la='ls -A'
    alias sl=ls

    # 設定の読み込み
    alias relogin='exec $SHELL -l'
    alias re=relogin

    # 画面消去
    alias c=clear
    alias cls=reset

    # Windowsっぽく
    alias dir=ll
    alias path='echo -e ${PATH//:/\\n}'

    # ディスクサイズ
    alias df='df -h'
    alias du='du -h'
    alias du1='du -d1'

    # grepを使いやすく
    # grep -r hogeで./以下のファイルの中身からhogeを検索
    # find | grep hogeで./以下のファイル名からhogeを検索
    # whereis hogeでコマンドの関連場所を検索(bin, src, man)
    # type -a hogeでコマンドを検索
    alias grep='grep --color'

    # Windowsコマンド文字化け対策
    function wincmd()
    {
    	CMD=$1
    	shift
    	$CMD $* 2>&1 | iconv -f CP932 -t UTF-8
    }
    alias cmd='winpty cmd'
    alias psh='winpty powershell'
    alias ipconfig='wincmd ipconfig'
    alias netstat='wincmd netstat'
    alias netsh='wincmd netsh'
    # pingのコマンド名混同を避けるため絶対パスで指定
    alias ping='wincmd /c/windows/system32/ping'

    # ネットワーク確認用
    alias ping1='ping www.google.com'
    alias ping2='ping 192.168.0.1'

    # mingw32用
    # msysのmakeと被らないようにコマンド名が変えられている
    alias make='mingw32-make'
    alias m='make -j3'


`.bash_alias`を作成したら、読み込む設定を有効化する必要がある。
`.bashrc`内の該当箇所のコメントを解除するか、記述を追加する。

    # .bash_aliasesを読み込むようにする
    if [ -f "${HOME}/.bash_aliases" ]; then
      source "${HOME}/.bash_aliases"
    fi


変更を保存した後はbashを再起動するか、下記コマンドで設定ファイルを読み込ませれば有効になる。

    # 設定を読み込む
    source ~/.bashrc
    # もしくは
    cd;source .bashrc
    # もしくは
    exec bash -l

    # 一度読み込んだあとは下記aliasが有効になるので簡単に再読み込みできる
    relogin
    # もしくは
    re


GitHubなどで`bash_aliases`を検索すると参考にできる設定が多数見つかる。
`bashrc`, `dotfiles`, `zshrc`というキーワードでもよい。
`.zshrc`はzsh用だが、aliasの設定などはそのまま使えることが多い。
インストールされているコマンドは環境によってだいぶ異なるので注意されたし。

参考
Windowsコマンドの文字化け対策
[gnupackでCygwin導入した時に最初にすること](http://proger.blog10.fc2.com/blog-entry-119.html)

#### ~/.bash_functions

aliasと同様にfunctionの設定をまとめたファイル。
デフォルトでは存在しないので`.bash_aliases`と同様に作成する。

    # .bash_functionsの中身
    echo '.bash_functions'

    # Functions for MSYS2 bash

    # pacman for mingw32
    function pinst()
    {
    	pacman -S "mingw-w64-i686-$1"
    }
    function puninst()
    {
    	pacman -Rs "mingw-w64-i686-$1"
    }

    # others
    function snow()
    {
    	clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
    }

    function matrix()
    {
    	echo -e "\e[1;40m" ; clear ; while :; do echo $LINES $COLUMNS $(( $RANDOM % $COLUMNS)) $(( $RANDOM % 72 )) ;sleep 0.05; done|gawk '{ letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()"; c=$4; letter=substr(letters,c,1);a[$3]=0;for (x in a) {o=a[x];a[x]=a[x]+1; printf "\033[%s;%sH\033[2;32m%s",o,x,letter; printf "\033[%s;%sH\033[1;37m%s\033[0;0H",a[x],x,letter;if (a[x] >= $1) { a[x]=0; } }}'
    }


`.bashrc`内の該当箇所のコメントを解除するか、記述を追加する。

    # .bash_functionsを読み込むようにする
    if [ -f "${HOME}/.bash_functions" ]; then
      source "${HOME}/.bash_functions"
    fi


##### pinst, puninst
pacmanはパッケージ名が重複できないという制限がある。
その結果MinGW32のパッケージの場合は`mingw-w64-i686-`というプレフィックスが必要となる。
毎回打つのは面倒なので省略できるよう関数化しておくと便利。

##### snow
ターミナル上に雪を降らせるワンライナーを実行する。

##### matrix
ターミナル上にマトリックスのごとく文字を降らせるワンライナーを実行する。

参考
[役には立たないけどちょっとだけ面白いLinuxターミナルでのお遊びコード9個](http://orebibou.com/2014/08/%E5%BD%B9%E3%81%AB%E3%81%AF%E7%AB%8B%E3%81%9F%E3%81%AA%E3%81%84%E3%81%91%E3%81%A9%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%A0%E3%81%91%E9%9D%A2%E7%99%BD%E3%81%84linux%E3%81%AE%E3%82%BF%E3%83%BC/)
[英和・和英翻訳と今日明日明後日の天気をターミナルから調べる便利コマンドのご紹介](http://qiita.com/b-kaxa/items/0c81102f9e1fc6b78525)

#### ~/bin

ホームディレクトリにbinディレクトリを作成し、そこへオリジナルのスクリプトを追加しておくと便利だ。
`.bash_profile`でパスを通す必要があるので、該当箇所をアンコメントするか記述を追加する。

    # ~/binをPATHに追加
    if [ -d "${HOME}/bin" ] ; then
      PATH="${HOME}/bin:${PATH}"
    fi


以下、あると便利だと思われるスクリプトなど。
`.bash_profile`に関数として定義してもよいが、複数の関数を使う場合などは個別にスクリプト化したほうが見通しがよい。

なお、各ファイルの先頭にはシバン(shebang)が必要となるので、追加すること。
/bin/shでもbashが動くが、POSIXオプションがONとなるという違いがある。

    #!/bin/sh
    # もしくは
    #!/bin/bash
    # もしくは
    #!/usr/bin/env bash


##### colors
ターミナル上で256色を出力して、表示を確認したい時に使用するスクリプト。
`AnsiColors256.ans`はConEmuのbinフォルダに付属していたのをコピペしてきた。
minttyを使用している場合はこのスクリプトで確認する必要はないと思われる。

    # colors

    echo '16 colors and formatting:'
    echo ' ^[${attr};${bg};${fg}m'
    bg=40
    for fg in {30..38} {90..97}; do
    	for attr in 0 1 2 4 5 7; do
    		echo -en "\e[${attr};${bg};${fg}m ^[${attr};${bg};${fg}m \e[0m"
    	done
    	echo #Newline
    done

    echo #Newline
    cat "${HOME}/bin/AnsiColors256.ans"


##### backup
設定ファイルをバックアップしておけば環境の再構築は簡単だ。
git用にdotfilesというフォルダにコピーするようにしているが、環境に合わせてバックアップ先を変更すればよい。

    # backup

    function backup_()
    {
    	# バックアップ先の設定
    	BAK="${HOME}/dotfiles"
    	#BAK="/c/devx/backup/msys2"

    	# ディレクトリがなければ作成する(-p)
    	mkdir -p ${BAK}/bin
    	mkdir -p ${BAK}/etc

    	# ユーザーのbinファイルをコピーする
    	cp -u ~/bin/* ${BAK}/bin

    	# 設定ファイルをコピーする
    	cp -u ~/.??* ${BAK}/

    	# 起動時マウント設定をコピーする
    	cp -u /etc/fstab ${BAK}/etc/
    	cp -u /etc/pacman.conf ${BAK}/etc/
    }

    echo "start backup..."

    echo "copy files..."
    backup_

    #echo "git commit"
    #echo "git push"

    echo "finished!!"
    exit 0


##### restore
バックアップからの復元。

    # restore

    function restore_()
    {
    	# バックアップフォルダを指定
    	BAK="${HOME}/dotfiles"
    	#BAK="/c/devx/backup/msys2"

    	# ユーザーのbinファイルをコピーする
    	cp -u ${BAK}/bin/* ~/bin

    	# 設定ファイルをコピーする
    	cp -u ${BAK}/.??* ~/

    	# 起動時マウント設定をコピーする
    	cp -u ${BAK}/etc/fstab /etc/
    	cp -u ${BAK}/etc/pacman.conf /etc/
    }

    while true; do
        read -p "Do you want to run the restore?(Enter to yes): " yn
        case $yn in
            "" | [Yy]* ) break;;
            * ) echo "exit!!"; exit;;
        esac
    done

    echo "start restore..."

    #echo "git fetch"

    echo "copy files..."
    restore_

    echo "finished!!"
    exit 0


##### install-msys2-apps
msys2用のソフトウェアを一括でインストールする。
実行前に`update-core`と`packman -Su`を忘れずに実行しておく。

    # install-msys2-apps

    function try_pacman()
    {
    	if type $1 &>/dev/null; then
    		echo -e "${1} installed"
    	else
    		echo "${1} install..."
    		pacman -S --noconfirm --color=auto $1
    	fi
    }

    function install_()
    {
    	###
    	# for packman
    	###

    	# パッケージグループは判別できないのでGCCで判定
    	if type /mingw32/bin/gcc &>/dev/null; then
    		echo -e "mingw-w64-i686-toolchain installed"
    	else
    		echo "mingw-w64-i686-toolchain install..."
    		pacman -S --noconfirm --color=auto mingw-w64-i686-toolchain
    	fi

        try_pacman winpty
    	try_pacman git

    	try_pacman vim
    	try_pacman nano

    	# makeはMinGW32でmingw32-makeとなっているのでaliasで対応
    	#try_pacman make

    	# autotoolsをインストール
    	try_pacman autoconf
    	try_pacman automake

    	try_pacman cmake
    	try_pacman doxygen
        try_pacman tree
    	try_pacman wget
        try_pacman w3m
    	try_pacman man

    	# キャッシュを消去
    	echo
    	pacman -Sc --noconfirm
    }

    echo "start install-msys2-apps...\\n"
    install_

    echo
    echo "finished!!"
    exit 0


参考
[$HOME/binにあるスクリプトを晒してみる](http://tyru.hatenablog.com/entry/20090510/1241935374)

#### dotfiles
dotfilesをgitで管理するのが便利だ。
msys2の`ln`でシンボリックリンクを作成するには起動時に環境変数を設定する必要がある。
管理者権限が必要となるが、MSYS2でもdotfilesのインスールスクリプトがそのまま使えそうだ。

参考
[最強の dotfiles 駆動開発と GitHub で管理する運用方法](http://qiita.com/b4b4r07/items/b70178e021bef12cd4a2)

## ConEmu

minttyをそのまま使ってもよいが、他のターミナルをためしてみるのもよい。

### ConEmuのインストールと設定

下記からインストーラーをダウンロードして実行する。
256色使いたい場合は、後述するALPHA版をダウンロードすべし。

[ConEmu](https://conemu.github.io/)

設定を開いてシェルをmsys32のbashに変更する。
Startupの中のSpecified named taskに{Bash::Msys2-32}という設定がある。
中身を見ればわかるが、`/msys32/usr/bin/sh.exe --login`として起動している。
存在しなければ、Startup - Tasksで追加できる。

参考
[ConEmu タスク・起動設定](http://yanor.net/wiki/?Windows-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%2FConEmu%2F%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%BB%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A)
ConEmuから起動するTasksのオプションを設定するときに参考になる。

[ConEmu 突っ込んだら Git for Windows の Git Bash がカッコよくなった](http://tech.nitoyon.com/ja/blog/2014/03/07/fancy-git-bash/)
タブのコンテキストメニューに言及している。
Restart系のメニューが地味に便利で、画面分割や管理者権限も可能。

### ConEmuで256色を使用する

ConEmuでmsys2やcygwinを利用する場合、そのままでは256色を表示できない問題がある。
詳しくは参考のリンク先で説明されているが、簡単にやり方を載せておく。
ALPHA版の最新版でしか対応していないので注意されたし。

ダウンロード
[ConEmu(ALPHA)](http://www.fosshub.com/ConEmu.html)
[cygwin-connector](https://github.com/Maximus5/cygwin-connector/releases)

1. ConEmuの最新のALPHAバージョンを使用する。
1. cygwin-connectorの最新版を使用する。
1. 解凍し、該当するファイルをsh.exeと同じディレクトリに入れる。
1. ConEmuの起動Taskを追加する。

msys2の32bitを使用する場合はconemu-msys2-32.exeをc:/msys2/usr/binに入れる。

追加するタスク: Bash::Msys2-32(conn)

    set CHERE_INVOKING=1 & set MSYSTEM=MINGW32 & %ConEmuDrive%\msys32\usr\bin\conemu-msys2-32.exe -new_console:C:"%ConEmuDrive%\msys32\msys2.ico"

参考
ConEmuで256色が使えない理由
[Cygwin and pty related issues](http://conemu.github.io/en/CygwinAnsi.html)
ConEmuで256色を使う方法
[cygwin/msys terminal connector](http://conemu.github.io/en/CygwinMsysConnector.html)
[ANSI X3.64 and Xterm 256 colors](http://conemu.github.io/en/AnsiEscapeCodes.html)