Bash
Terminal
msys2
pokemon
hyper

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

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

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

この記事でPikachuに一目惚れした。
:heartbeat:爆速でターミナルをポケモンにする:heartbeat:

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

MSYS2

MSYS2のインストール

MSYS2(本家)
MSYS2 - SourceForge

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

  • msys2-x86_64-20170918.exe

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

Hyper

Hyperのインストール

Hyper.is
Hyper - GitHub

公式のHyper.isは、1.x系のリンクとなっている。
現在の最新版である1.4.8の方が安定動作するが、日本語フォントの幅が狭い不具合がある。

Pre-releaseの2.x系はGitHubからダウンロードできる。
2.x系は、日本語フォントを正常に表示できるが、開発中のため不具合が多い。
今回は2.x系を使用する。

  • hyper-Setup-2.0.0-canary.8.exe

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

HyperにPikachuを召喚する

Hyper Pokemon - npm

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

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

plugins: ['hyper-pokemon'],

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

設定できるポケモンは以下を参照のこと。
Hyper Pokemon - GitHub

プラグインは以下を参照のこと。
Awesome Hyper - GitHub

HyperにMSYS2のbashを設定する

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

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

    // カーソルを点滅させる
    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が動いているはず!!

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

再びMSYS2

MSYS2の更新

MSYS2における正しいパッケージの更新方法

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

Hyper
pacman -Syuu

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

bashの設定

MSYS2で快適なターミナル生活#bashの設定

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

.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'
.bash_functions
echo '.bash_functions'

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

MinGWの導入

MSYS2ではpacmanの代わりにpacboyを使おう

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

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

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

日本語manの導入

https://linuxjm.osdn.jp/download.html

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

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

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

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

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のブランチ名を表示

Powerlineを入れるなら、やる必要はない。

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

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

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プラグインの方が強くて反映されないようだ。

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の最後の行だ。
その部分もコピーすれば、ブランチ名を表示できるようになった。

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/

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

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

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

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

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

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

Powerlineの導入

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

msys2 + MinGW64 でWindows10にターミナル環境構築
Powerlineを導入する

Hyper
python -V
pip -V

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

pacman -S socat
pip install psutil
pip install pyuv

下記パスを追加。

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

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

.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 2.x系は開発中のため不具合が多い。
Hyper系列のバグなのか、その他の要因によるものなのかは切り分けていない。

clearコマンドが正常に動かない

clearしても画面の内容は残ったままとなった。
代わりにecho -ne "\033cをaliasに設定しておくとよい。
Hyperの機能でBuffer Clear(Ctrl+Shift+K)してもよい。

行が画面下までいくと、文字が半分隠れてしまう

MSYS2のbashのプロンプトが二行になっているためと思われる。
一度ウィンドウサイズを変更すると直る。
Win+Left等でリサイズしても直る。
プロンプトの表示を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するのが面倒なら以下を追加するとよい。

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

遅い

たまに画面更新に時間がかかることがある。
ポケモンプラグインが悪さをしているのかも?