Windows10 WSLのターミナル事情

この記事はkb Club Advent Calendar 2019 2日目の記事です。 https://adventar.org/calendars/4021

Windows10から導入されたWSL(Windows Subsystem for Linux)ですが、その進化は凄まじいです。 2020年中にリリースされるWSL2では現在のカスタムカーネルから素のLinuxKernelに差し替えられ、 Docker等のKernelに強く依存するアプリケーションも自然に動く予定だそうです。

そんな進化に取り残されているのが…

windows wsl terminal 2019 12 04 08 37 11

ターミナルです。 上の図は、qemuでDebianを -curses オプションを与えて起動させ、ログイン後に man ps を叩いて無事崩壊した様子です。 安定性・互換性が低いだけでなく、標準のターミナルは実質 cmd.exe なので機能も不足していると言わざるを得ません。

この記事では、現時点で雑に設定してみてどう動くかを検証していきます。

Windows Terminalを試す

Microsoftも気付いているようで、 Windows Terminal というストアアプリを公開しています。 https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701 タブ・ペイン分割等の機能も有り、少ない機能ながらしっかりと作られている印象です。 ただし、2019年の現時点では色の処理等が不十分で、カラースキームを調整したい自分は実用的では無いと判断しました。

windows wsl terminal 2019 12 04 08 41 27

背景色・文字色等の処理の都合で、重要な箇所が読めなくなっています。 多分、暗いテーマを利用していれば問題にならないと思います。

また、UACを通して管理者特権としてシェルを実行するための機能は無く、一部の操作で成約が有ります。

Fluent Terminalを試す

公式が提供しているものを導入するのが難しいので、コミュニティ開発のOSSに目を向けていきます。

WPFアプリケーションのFluentTerminalを試します。 Chocolateyで利用できるので、 choco install fluent-terminal や、 正しくリポジトリ設定を行えばPowerShellの Get-Package fluent-terminal コマンドから導入できます。 https://github.com/felixse/FluentTerminal

こちらも、明るいカラースキームでの挙動が少々怪しいですが、騙し騙し使っているとやはりcurses周りの処理が不安定です。

windows wsl terminal 2019 12 04 08 55 08

標準のターミナルと同じく、qemuでDebianを起動してmanを叩いた様子です。 こちらも崩壊しており、実用には向かないようです。 また、こちらもWPFで作られている都合上、Windows Terminalと同様に管理者特権としてシェルを実行するための手段が有りません。

ConEmuを試す

個人的に、Windows向けのターミナルの中では最も定評が有ると思っているOSSです。 https://conemu.github.io/

タブやペイン機能が有り、カラースキーム等も概ね正しく扱え、ショートカットキーを含む動作の調整がとても細部まで行えます。 また、cursesや色周りの処理も概ね正しく扱えます。 管理者特権としてシェルを実行するための仕組みも存在します。 事実、PowerShell/WSLのターミナルとして4年ほど既に使用しています。

windows wsl terminal 2019 12 04 09 14 38

ただし、スクロールバッファの処理に多少の問題が有るようで、何かの条件で壊れてしまうとタブを再起動するまでスクロールが行えなくなります。 この壊れた状態では、curses周りの処理も怪しくなり画面をかき混ぜたような状態になります。 構成管理ツールなど、標準出力に変更内容が出力されるツールをよく使うのでこの問題は頻度が低くても致命的です。

また、管理者特権でシェルを起動する事に対応しているものの、タブを開く毎にUAC画面が出るのは少々ストレスでした。

ただ、これらを考慮してもWindowsで最も高機能・安定的なターミナルはConEmuだと考えています。

結局… VcXsrv + gnome-terminal

結局の所、Linuxで広く使われているツールを利用する事で落ち着こうとしています。

LinuxのGUIアプリケーションは、設定を行うことでWSL上でも起動することが出来ます。 Windows上でX-Serverを起動し、WSL上のGUIアプリケーションに接続情報を環境変数で渡す事で実現します。

Windowsでよく使われるX-ServerとしてVcXsrvが有るので、コレをインストール・設定します。 方法は標準的なので割愛します。 https://sourceforge.net/projects/vcxsrv/

そして接続情報をWSLの環境変数に設定します。

echo 'export DISPLAY=:0.0' >> ~/.profile
. ~/.profile

次に gnome-terminal を導入します。 カラースキームはGithubのOSSプロジェクトである Mayccoll/Gogh を使用しました。

$ sudo apt install gnome-terminal
$ bash -c  "$(wget -qO- https://git.io/vQgMr)" # カラースキームの導入

結構時間はかかりますが、完了すれば gnome-terminal コマンドでターミナルが起動します。

windows wsl terminal 2019 12 04 08 50 07

おわり

Windows Terminalの進化に圧倒的な期待…!