2016/08/24


Bash on Ubuntu on Windows (以下 BoW) は Windows コマンドプロンプトを使って実行される。今までであれば Windows のコマンドプロンプトはエスケープシーケンスを認識しなかったので cmd.exe そのものでは vt100 等の端末環境を用意できませんでした。しかし Windows10 の cmd.exe では新しいコンソールモードが用意されています。

Console Virtual Terminal Sequences (Windows)

Virtual terminal sequences are control character sequences that can control cursor movement, color/font mode, and other operations.

https://msdn.microsoft.com/ja-jp/library/windows/desktop/mt638032(v=vs.85).aspx

SetConsoleMode の第二引数に ENABLE_VIRTUAL_TERMINAL_PROCESSING を指定するとエスケープシーケンスを認識する様になります。Windows10 が当たり前の世の中になってきたら、ようやく Windows でエスケープシーケンスを使った CLI を実装できる様になります。それまで我慢できない人は ansicolor-w32.c を使うと良いです。

BoW ではこの新しい API のおかげでコマンドプロンプトを使って Linux の CLI を表現できている訳ですが、いかんせん完全ではありません。日本語を表示すると幅が合わず描画崩れを起こします。

BoW

これを見て「あぁ、msys2 は素晴らしい mintty は素晴らしい」と思う方も多いと思います。もしくはこれを見て BoW を使うのをやめる人もいるかもしれません。ただちょっとまって下さいよ。もし mintty の中で BoW が動いたら、しかも ssh 超しに使ったり Visual Studio Code の端末機能を使うといったナンチャッテハックをやる必要無かったとしたら、BoW 超便利だと思いませんか?以下でその方法をお教えします。まずこれからお伝えする環境を作る為にコンパイラが必要です。msys2 をお持ちならばそれをそのまま使って下さい。次に以下のリポジトリを git clone します。

GitHub - rprichard/wslbridge: Bridge from Cygwin to WSL pty/pipe I/O

wslbridge is a Cygwin program that allows connecting to the WSL command-line environment over TCP sockets, as with ssh, but without the overhead of configuring an SSH server.

https://github.com/rprichard/wslbridge

ビルドは mingw ではなく msys2 側でビルドして下さい。frontend を msys2 でビルドし、backend を BoW の中でビルドします。wslbridge は BoW の bash を起動すると共に backend を起動させてソケットを張り BoW の標準入出力とのパイプを作成します。そのパイプを msys2 の pty と繋げる事で msys2 レイヤと BoW を結び付け、如何にも msys2 の上で BoW が動いている様に見せるプログラムです。この wslbridge を mintty から起動すれば mintty の中で BoW が起動する、という仕組みです。mintty から wslbridge を起動するには以下の様に引数を指定します。

mintty -t "Bash on Ubuntu on Windows" -e c:/dev/wslbridge/out/wslbridge.exe

これをショートカットファイル等に指定すれば

BoW

すばらしいですね。かっこいいですね。画面崩れもありませんね。ちなみに以下の設定を行うと、エクスプローラのフォルダの右クリックから「Bash on Ubuntu on Windows」が選べる様になり、更に便利になります。

まずレジストリエディタを起動し、以下のキーを作成します。

HKEY_CLASSES_ROOT\Folder\shell\bow

右のペーンで「(規定)」の値に「Bash on Ubuntu on Windows」を入力します。

BoW

次にさらに下の階層に以下のキーを作ります。

HKEY_CLASSES_ROOT\Folder\shell\bow\command
「(規定)」に以下を設定します。 c:\msys64\usr\bin\mintty.exe -t "Bash on Ubuntu on Windows" -e c:/dev/wslbridge/out/wslbridge.exe

wslbridge へのパスは環境に合わせて設定して下さい。これでフォルダを右クリックして「Bash on Ubuntu on Windows」が表示される様になり、選択すると mintty が起動する様になります。

BoW
Posted at by