Edited at

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

More than 1 year has passed since last update.


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

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

この記事でPikachuに一目惚れした。

:heartbeat:爆速でターミナルをポケモンにする:heartbeat:

以前Hyper(v1.x)を触ったときには、日本語のディレクトリ名が表示できなくて諦めたていた。

開発版は不具合があるが、Hyperは使っていて楽しいので、これからも常用していきたい。

なお、OSはWindows 10 Pro 64bitを使用している。


MSYS2


MSYS2のインストール

MSYS2(本家)

MSYS2 - SourceForge

本家の方の更新が止まっているようなので、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

Hyper - GitHub

公式の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

設定ファイル(C:\Users\[User]\.hyper.js)を書き換える。

Hyperにポケモンのプラグインを設定する。


.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を設定している。

リロード(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", 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が動いているはず!!

リロード(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のブランチ名を表示

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かMSYS2かの原因の切り分けは行っていない。

前回と比較していろいろと改善され、使いやすくなっているのがわかる。


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}!"



遅い(解決済)

たまに画面更新に時間がかかることがある。

ポケモンプラグインが悪さをしているのかも?