MSYS2とHyperでPikachuなターミナル環境を構築
この記事でPikachuに一目惚れした。
爆速でターミナルをポケモンにする
以前Hyper(v1.x)を触ったときには、日本語のディレクトリ名が表示できなくて諦めたていた。
開発版は不具合があるが、Hyperは使っていて楽しいので、これからも常用していきたい。
なお、OSはWindows 10 Pro 64bitを使用している。
MSYS2
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は、Stable(安定版)へのリンクとなっている。
Pre-releaseの最新版を試したければGitHubからダウンロードできる。
今回はプレリリースの2.1.0-canary.2を使用してみる。
- hyper-Setup-2.1.0-canary.2.exe
インストール場所は下記の通り。
C:\Users\[User]\AppData\Local\hyper\
Pikachuゲットだぜ!
設定ファイル(C:\Users\[User]\.hyper.js
)を書き換える。
Hyperにポケモンのプラグインを設定する。
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
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の更新
HyperでMSYS2のbashの起動を確認したら、まず更新を行う。
昔のMSYS2では、別のスクリプト(update-core
)を実行する必要があったが、現在はこれだけでよい。
pacman -Syuu
おそらく、ターミナルウィンドウの再起動を求められるので、Hyperをリロード(Ctrl+Shift+F5)する。
Hyperのリロードが地味に便利だ。
リロードしてからもう一度更新する。
bashの設定
.bash_aliases
と.bash_functions
を晒しておく。
Hyperだとwinptyは不要。
fstabsはHyperのリロードだけでは反映されないようなので、きちんと開き直すこと。
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'
echo '.bash_functions'
function sudo()
{
command=$1
shift
powershell -Command Start-Process -Verb runas ${command} { $@ }
}
MinGWの導入
開発環境はあったほうがmakeできるし便利。
日本語manを入れる場合もmakeしている。
MSYS2のMinGW環境は、パッケージ名が長くてめんどくさかったのだが、いつの間にか簡単にインストールできるようになっていた。
なお、pacboyを使うのはMinGWパッケージだけで、他は今まで通りpacmanでよい。もちろんpacboyを使い続けても良い。
:
を付けるとそのまま、:x
を付けるとMinGW 64-bitの名前に展開されて実行される。
pacboy help
pacboy -S git: base-devel: toolchain:x
日本語manの導入
https://linuxjm.osdn.jp/download.html
日本語manのアーカイブをwget
でダウンロードしてmake
する。
毎月15日に更新されるので、それに合わせたファイル名となる。
READMEやINSTALLファイルに日本語でやり方が書かれている。
# 作業ディレクトリ(どこでも良い)
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
はEnter押しっぱなしで、たまにyを入力していればよい。
終わったらrootでmake install
しろと言われるが、MSYS2にはsu
は存在しないので修正が必要だ。
Makefileを見ると、installman.sh
を呼んでいるだけなのがわかる。
installman.sh
を開いて、-o root -g root -m 644
の部分を全て空白に置換して削除してしまう。
-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
ファイルを修正したら、そのままインストールできる。
# インストールを実行
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のブランチ名を表示
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プラグインの方が強くて反映されないようだ。
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
の最後の行だ。
その部分もコピーすれば、ブランチ名を表示できるようになった。
# 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コマンドを使えるようにパスを通す。
export PATH=/c/Users/[User]/Anaconda3/Scripts/:$PATH
この状態で、rootと名前の付いたPython2.7の環境が使えるようになっている。
特に問題がなければ、このままでよい。
Python3.6の環境を構築し、パッケージをインストールするには、以下のようにする。
create
に少し時間がかかるので慌てずに待つ。
activate
で環境を読み込んで使える。
conda -V
conda create -n py36 python=3.6 anaconda
source activate py36
source deactivate
Powerlineの導入
うまく動作していないようなので保留。
Powerlineを導入するのにPythonが必要なので、前項を参考に導入しておく。
msys2 + MinGW64 でWindows10にターミナル環境構築
Powerlineを導入する
python -V
pip -V
# 他にも使えそうなパッケージがPyPiにあったが、powerline-statusを使ってみる。
pip install powerline-status
powerline-daemon -h
pacman -S socat
pip install psutil
pip install pyuv
下記パスを追加。
export PATH=~/.local/bin/:$PATH
普通に動かすと遅いので、powerline-daemonを使う。
シェルの種類によって、読み込むスクリプトが変わる。
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
するのが面倒なら以下を追加するとよい。
cd "${HOME}" || echo "WARNING: Failed attempt to cd into ${HOME}!"
遅い(解決済)
たまに画面更新に時間がかかることがある。
ポケモンプラグインが悪さをしているのかも?