MSYS2とHyperでPikachuなターミナル環境を構築

# MSYS2とHyperでPikachuなターミナル環境を構築

![MSYS2とHyperでPikachuなターミナル環境を構築_01.png](https://qiita-image-store.s3.amazonaws.com/0/91573/e8eaaf2c-8dcf-69ea-b940-f8593a084467.png)

この記事でPikachuに一目惚れした。
:heartbeat:[爆速でターミナルをポケモンにする](https://qiita.com/chanuu/items/b5c3d11e089ad0c7356d):heartbeat:

以前Hyper(v1.x)を触ったときには、日本語のディレクトリ名が表示できなくて諦めたていた。
開発版は不具合があるが、Hyperは使っていて楽しいので、これからも常用していきたい。
なお、OSはWindows 10 Pro 64bitを使用している。


## MSYS2

### MSYS2のインストール

[MSYS2(本家)](http://www.msys2.org/)
[MSYS2 - SourceForge](https://sourceforge.net/projects/msys2/)

~~本家の方の更新が止まっているようなので、SourceForgeからダウンロードする。~~

- msys2-x86_64-20180531.exe

デフォルトのパス(`C:\msys64`)にインストールする。
msys2-launcherというパッケージがインストールされており、exe形式が使用できるようになった。
起動するには`C:\msys64\msys2.exe`を実行すればよい。


## Hyper

### 古いバージョンのアンインストール

すでにHyperをインストールしたことがある場合は、一度アンインストールを行い、
`C:\Users\[user]`にある設定ファイル(`.hyper.js`)を削除しておくことをおすすめする。
上書きインストールだと正常に動作しない場合があった。
筆者の場合はポケモンの上に背景が表示されるようになってしまった。


### Hyperのインストール

[Hyper.is](https://hyper.is/)
[Hyper - GitHub](https://github.com/zeit/hyper)

公式のHyper.isは、Stable(安定版)へのリンクとなっている。
Pre-releaseの最新版を試したければGitHubからダウンロードできる。
今回はプレリリースの2.1.0-canary.2を使用してみる。

- hyper-Setup-2.1.0-canary.2.exe

インストール場所は下記の通り。
`C:\Users\[User]\AppData\Local\hyper\`


### Pikachuゲットだぜ！

[Hyper Pokemon - npm](https://www.npmjs.com/package/hyper-pokemon)

設定ファイル(`C:\Users\[User]\.hyper.js`)を書き換える。
Hyperにポケモンのプラグインを設定する。

```js:.hyper.js
config: {
    // 以下を追加
    pokemon: ['random', 'pikachu'],
    pokecursor: 'false',
    pokemonSyntax: 'dark',
    unibody: 'false',
    poketab: 'true',
},

plugins: [
    'hyper-pokemon',
    'hyper-opacity',
    //'hyper-statusline',
],
```

pluginsに書き込むと自動でインストールが実行される。
ダウンロードを含むので少しだけ時間がかかるだろう。
他のプラグインを入れるタイミングでエラーが発生することがあるが、Hyperを再起動すれば問題ない。

randomとpikachuを設定したので、ピカチュウが多めに出現する。
canary.8ではpokecursorは使えなかったのでfalseを設定している。
リロード(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F5</kbd>)するとポケモンが変わる。

設定できるポケモンは以下を参照のこと。
[Hyper Pokemon - GitHub](https://klauscfhq.github.io/hyper-pokemon/)

プラグインは以下を参照のこと。
[Awesome Hyper - GitHub](https://github.com/bnb/awesome-hyper)


### HyperにMSYS2のbashを設定する

Hyperの設定を変更し、bashを起動できるようにする。
ついでにフォントも設定しておく。
[mzyy94/RictyDiminished-for-Powerline](https://github.com/mzyy94/RictyDiminished-for-Powerline)

```js:.hyper.js
config: {
    // フォントの設定
    fontSize: 12,
    fontFamily: '"Ricty Diminished for Powerline", Menlo, Consolas',

    // カーソルを点滅させる
    cursorBlink: true,
    
    // MSYS2のbashを指定
    shell: 'C:\\msys64\\usr\\bin\\bash.exe',

    shellArgs: ['--login', '-i'],
    
    // 下記はWindowsの環境変数に書き込んでもよい
    env: {
      // ln -sでシンボリックリンクが作成できる(要管理者権限)
      MSYS: 'winsymlinks:nativestrict',
  
      // WindowsのPATHを有効にする
      MSYS2_PATH_TYPE: 'inherit',
      
      // /mingw64/binのパスを追加で読み込む
      MSYSTEM: 'MINGW64',
  
      // カレント ディレクトリの変更は効かない
      // CHERE_INVOKING: 1,
      
      // Windows形式のパスへの自動変換を抑制する
      // ipconfig /all
      // adb push test.txt /sdcard/0/
      MSYS2_ARG_CONV_EXCL: '/all;/sdcard;/storage',
    },

	// 選択で自動コピー
    copyOnSelect: true,
},
```


設定を変えたらHyperを開き直す。
すると、MSYS2のbashが動いているはず!!

リロード(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F5</kbd>)だと、環境変数など一部の設定が正常に反映されないことがある。


## 再びMSYS2

### MSYS2の更新

[MSYS2における正しいパッケージの更新方法](https://qiita.com/k-takata/items/373ec7f23d5d7541f982)

HyperでMSYS2のbashの起動を確認したら、まず更新を行う。
昔のMSYS2では、別のスクリプト(`update-core`)を実行する必要があったが、現在はこれだけでよい。

```sh:Hyper
pacman -Syuu
```


おそらく、ターミナルウィンドウの再起動を求められるので、Hyperをリロード(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F5</kbd>)する。
Hyperのリロードが地味に便利だ。
リロードしてからもう一度更新する。


### bashの設定

[MSYS2で快適なターミナル生活#bashの設定](https://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c#bash%E3%81%AE%E8%A8%AD%E5%AE%9A)

`.bash_aliases`と`.bash_functions`を晒しておく。
Hyperだとwinptyは不要。
fstabsはHyperのリロードだけでは反映されないようなので、きちんと開き直すこと。

```sh:.bash_aliases
echo '.bash_aliases'

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

# 文字化け対策
function wincmd()
{
    CMD=$1
    shift
    $CMD $* 2>&1 | iconv -f CP932 -t UTF-8
}
case "$TERM" in
xterm*)
    # Windowsのコマンドを追加
    # 出力をSJIS(CP932)からUTF-8に変換できる
    # MSYS2のコマンドはUTF-8しか受け付けない(less, grep, etc...)
	for name in ipconfig ping route
	do
		case "$(type -p "$name".exe 2>/dev/null)" in
		''|/usr/bin/*) continue;;
		esac
		alias $name="wincmd $name.exe"
	done
	;;
esac


# 設定の読み込み
#alias reload='source ~/.bashrc'
alias relogin='exec $SHELL -l'
alias reset='echo -ne "\033c"'
alias rr='reset;relogin'
alias re='rr'

# 移動しやすく
#alias cd='cd_func'
alias ..='cd ..'
alias ...='cd ../..'
alias -- -='cd -'
alias cdd='cd $HOMEPATH'
alias ee='explorer .'

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

# Windowsっぽく
alias dir='ll'
alias path='echo -e ${PATH//:/\\n}'
alias lang='echo LANG=$LANG;locale -a | grep ja'

# ディスクサイズ
alias df='df -Th'
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'

# IPアドレスを簡単に
alias ifconfig='ipconfig'
alias ip='ipconfig | grep --text IPv4'
alias r4='route print -4;echo "ROUTE ADD is \"route -p add [dst] msk 255.255.255.0 [gw]\""'

# pingのコマンド名混同を避けるため絶対パスで指定
alias ping='/c/windows/system32/ping'
# ネットワーク確認用
alias ping1='ping www.google.com'
alias ping2='ping 192.168.0.1'

# 圧縮解凍
# tar.gz
alias targz='tar -xcvf'
alias untar='tar -zxvf'
```

```sh:.bash_functions
echo '.bash_functions'

function sudo()
{
    command=$1
    shift
    powershell -Command Start-Process -Verb runas ${command} { $@ }
}
```

### MinGWの導入

[MSYS2ではpacmanの代わりにpacboyを使おう](https://qiita.com/k-takata/items/04d252c464986d6280a6)

開発環境はあったほうがmakeできるし便利。
日本語manを入れる場合もmakeしている。

MSYS2のMinGW環境は、パッケージ名が長くてめんどくさかったのだが、いつの間にか簡単にインストールできるようになっていた。
なお、pacboyを使うのはMinGWパッケージだけで、他は今まで通りpacmanでよい。もちろんpacboyを使い続けても良い。
`:`を付けるとそのまま、`:x`を付けるとMinGW 64-bitの名前に展開されて実行される。

```sh:Hyper
pacboy help
pacboy -S git: base-devel: toolchain:x
```

### 日本語manの導入

[https://linuxjm.osdn.jp/download.html](https://linuxjm.osdn.jp/download.html)

日本語manのアーカイブを`wget`でダウンロードして`make`する。
毎月15日に更新されるので、それに合わせたファイル名となる。
READMEやINSTALLファイルに日本語でやり方が書かれている。

```sh:Hyper
# 作業ディレクトリ(どこでも良い)
cd /tmp

# ダウンロードする
wget https://linuxjm.osdn.jp/man-pages-ja-20171115.tar.gz

# 展開する
tar -zxvf man-pages-ja-20171115.tar.gz
cd man-pages-ja-20171115

# makeする
make config
```


`make config`は<kbd>Enter</kbd>押しっぱなしで、たまに<kbd>y</kbd>を入力していればよい。
終わったらrootで`make install`しろと言われるが、MSYS2には`su`は存在しないので修正が必要だ。
Makefileを見ると、`installman.sh`を呼んでいるだけなのがわかる。
`installman.sh`を開いて、`-o root -g root -m 644`の部分を全て空白に置換して削除してしまう。

```diff:installman.sh
-install -o root -g root -m 644 manual/netatalk/man5/AppleVolumes.default.5 /usr/share/man/ja_JP.utf8/man5
+install manual/netatalk/man5/AppleVolumes.default.5 /usr/share/man/ja_JP.utf8/man5
```


ファイルを修正したら、そのままインストールできる。

```sh:Hyper
# インストールを実行
make install

# manが日本語になっているか確認する
man bash

# 日本語になっていなければ、ロケールを確認する
# 現在のロケール
echo $LANG

# 使用できるロケール一覧
locale -a | grep ja

# 正しいロケールを設定する
# 日本語manのエンコードはUTF-8
echo "export LANG='ja_JP.utf8'" >> ~/.bash_profile
source ~/.bash_profile

# 日本語になっているはず
man bash
```


### Gitのブランチ名を表示

![MSYS2とHyperでPikachuなターミナル環境を構築_02.png](https://qiita-image-store.s3.amazonaws.com/0/91573/162a1448-f18f-105b-4f3d-18bef55b1e5b.png)

Git-for-WindowsのGit BashはMSYS2が使われている。
Git Bashだとリポジトリへアクセスした場合、プロンプトにブランチ名が表示されている。
これを通常のMSYS2のプロンプトでも実現したい。

[https://github.com/git-for-windows/git/releases](https://github.com/git-for-windows/git/releases)

GitHubのリリースからPortableGitを落としてくる。
通常のGit-for-Windowsでもよいのだが、一度インストールしないといけないので手間がかかる。

- PortableGit-2.15.1.2-64-bit.7z.exe

解凍し`PortableGit/etc`を通常のMSYS2と比較してみる。
`PortableGit/etc/profile.d/git-prompt.sh`というソレっぽいのが見つかるのでMSYS2の方へコピーしておく。
読み込みは`/etc/profile`内の`profile_d()`が、`profile.d`以下の`*.sh`を呼び出している。

色も変えているようだが、hyper-pokemonプラグインの方が強くて反映されないようだ。

```sh:git-prompt.sh
if test -f /etc/profile.d/git-sdk.sh
then
	TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
	TITLEPREFIX=$MSYSTEM
fi

if test -f ~/.config/git/git-prompt.sh
then
	. ~/.config/git/git-prompt.sh
else
	PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]' # set window title
	PS1="$PS1"'\n'                 # new line
	PS1="$PS1"'\[\033[32m\]'       # change to green
	PS1="$PS1"'\u@\h '             # user@host<space>
	PS1="$PS1"'\[\033[35m\]'       # change to purple
	PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
	PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
	PS1="$PS1"'\w'                 # current working directory
	if test -z "$WINELOADERNOEXEC"
	then
		GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
		COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
		COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
		COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
		if test -f "$COMPLETION_PATH/git-prompt.sh"
		then
			. "$COMPLETION_PATH/git-completion.bash"
			. "$COMPLETION_PATH/git-prompt.sh"
			PS1="$PS1"'\[\033[36m\]'  # change color to cyan
			PS1="$PS1"'`__git_ps1`'   # bash function
		fi
	fi
	PS1="$PS1"'\[\033[0m\]'        # change color
	PS1="$PS1"'\n'                 # new line
	PS1="$PS1"'$ '                 # prompt: always $
fi

MSYS2_PS1="$PS1"               # for detection by MSYS2 SDK's bash.basrc
```


`git-prompt.sh`を呼び出しているのは`bash.bashrc`の最後の行だ。
その部分もコピーすれば、ブランチ名を表示できるようになった。

```sh:bash.bashrc
# Fixup git-bash in non login env
shopt -q login_shell || . /etc/profile.d/git-prompt.sh
```


### Python(Anaconda)の導入

素のPythonを使いたいだけなら`pacman -S python3`でよい。
しかし、MSYS2のPythonでやるとpipでうまく入らないパッケージが多い。
WindowsのPythonでもSciPyなど一部のパッケージが上手くインストールできなかったはずだ。
なので、最初からいろいろと揃っているAnacondaで導入するのが安心だ。
condaコマンドでインストールできるパッケージはビルド済みなので失敗することもない。
余計なパッケージを極力減らしたければMinicondaを使うという選択肢もある。
Anacondaは互換性のないPython2とPython3を切り替えて使えるのも便利だ。

VisualStudio2017でGit for WindowsとAnacondaをインストールできるが、
最新版を使いたければVisualStudioInstallerではなく、個別にインストールするのがよい。

[https://www.anaconda.com/download/](https://www.anaconda.com/download/)

インストール場所は下記の通りだ。
`C:\Users\[User]\Anaconda3`

condaコマンドを使えるようにパスを通す。

```sh:.bash_profile
export PATH=/c/Users/[User]/Anaconda3/Scripts/:$PATH
```


この状態で、rootと名前の付いたPython2.7の環境が使えるようになっている。
特に問題がなければ、このままでよい。

Python3.6の環境を構築し、パッケージをインストールするには、以下のようにする。
`create`に少し時間がかかるので慌てずに待つ。
`activate`で環境を読み込んで使える。

```sh:Hyper
conda -V
conda create -n py36 python=3.6 anaconda
source activate py36
source deactivate
```


### Powerlineの導入

うまく動作していないようなので保留。

Powerlineを導入するのにPythonが必要なので、前項を参考に導入しておく。

[msys2 + MinGW64 でWindows10にターミナル環境構築](https://qiita.com/ShoutaWATANABE/items/2167c6886f6e63501069)
[Powerlineを導入する](https://unskilled.site/powerline%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B/)

```sh:Hyper
python -V
pip -V

# 他にも使えそうなパッケージがPyPiにあったが、powerline-statusを使ってみる。
pip install powerline-status
powerline-daemon -h

pacman -S socat
pip install psutil
pip install pyuv
```


下記パスを追加。

```sh:.bash_profile
export PATH=~/.local/bin/:$PATH
```


普通に動かすと遅いので、powerline-daemonを使う。
シェルの種類によって、読み込むスクリプトが変わる。

```sh:.bashrc
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /c/Users/[user]/Anaconda3/lib/site-packages/powerline/bindings/bash/powerline.sh
#. ~/.local/lib/python3.6/site-packages/powerline/bindings/bash/powerline.sh
```


これでPowerlineが使えるようになったが、Hyperでは相変わらずポケモンプラグインが強く、色がおかしくなる。
どうやらプロンプトの見た目だけで、git連携などはできていない様子。
スクリプトを追えば原因もわかるかもしれないが、色が解決しないと残念な結果になりそう。


## 不具合および回避策
HyperかMSYS2かの原因の切り分けは行っていない。
前回と比較していろいろと改善され、使いやすくなっているのがわかる。

### clearコマンドが正常に動かない
`clear`しても画面の内容は残ったままとなった。
代わりに`echo -ne "\033c`をaliasに設定しておくとよい。
Hyperの機能でBuffer Clear(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>K</kbd>)してもよい。

### ~~行が画面下までいくと、文字が半分隠れてしまう~~(解決済)
MSYS2のbashのプロンプトが二行になっているためと思われる。
一度ウィンドウサイズを変更すると直る。
<kbd>Win</kbd>+<kbd>Left</kbd>等でリサイズしても直る。
プロンプトの表示を1行に変更してみるのもよいだろう。(未確認)

### ~~Hyperのウィンドウが半透明にならない~~(解決済)
いくつかプラグインがあったが、いずれもmacOS向けのようだった。
GitHubのIssueでも話題になっていたが、Windows 10だと何か不具合がある様子。
同じElectron製のVisual Studio CodeではGlassIt-VSCという拡張で半透明化できている。
時間はかかるだろうが、そのうちHyperでも可能になると思われる。

### winptyは不要
不具合ではないが、一応。
MSYS2ではvimやpythonなどインタラクティブなインターフェイスが必要なコマンドは、winptyが必須だった。
これはMSYS2のターミナルであるminttyでよく知られた問題なので、Hyperでは必要ない。

### SJISとUTF-8
不具合ではないが、一応。
Windowsの外部コマンドはSJISだが文字化けしない。(ipconfig, route, etc...)
MSYS2の外部コマンドはUTF-8のみ処理できる。SJISを入力しようとするとバイナリ扱いになる。(less, cat, grep, etc...)
つまり、HyperはSJISでもUTF-8でも表示できるが、MSYS2外部コマンドはUTF-8しか扱えない。
Windowsコマンドは文字化けはしなくともUTF-8への変換が必要。
Windowsコマンドの出力をiconvまたはnkfで変換するとよい。
`.bash_aliases`で文字化け対策済み。

### 起動時にHOMEディレクトリにならない
起動時のカレント ディレクトリが何故か$HOMEにならない。
その場合は`/c/Users/[User]/`になる。
CHERE_INVOKE=1が効いていない。
起動時に`cd`するのが面倒なら以下を追加するとよい。

```sh:.profile
cd "${HOME}" || echo "WARNING: Failed attempt to cd into ${HOME}!"
```


### ~~遅い~~(解決済)
たまに画面更新に時間がかかることがある。
ポケモンプラグインが悪さをしているのかも？