EmacsでWSLを使っている/いないを判断する


WSLを使っている時に行いたい処理がある時はどうしようか。
system-typeの値はgnu/linux。これはWindowsサブシステムではないLinuxと同じなので、プラス何かの情報がほしいです。

外部コマンドを使う

uname -runame -vにはWSL固有らしい文字列が含まれているので、それを参考にします。

$ uname -r
4.4.0-17763-Microsoft
$ uname -v
#379-Microsoft Wed Mar 06 19:16:00 PST 2019

unameの出力にMicrosoftが含まれていればWSLだとすると、こんな感じか。

(when (and (eq system-type 'gnu/linux)
           (string-match-p "Microsoft" (shell-command-to-string "uname -v")))
  (do-something))

この先ずっとカーネルバージョンにMicrosoftが含まれているとは限らないのが悩ましいところです。数カ月先、数年先に落とし穴が待ってそう……

環境変数を探す

Windows 10はビルド17063以降WSLENVという環境変数を提供しています。1
WSLENVはWindowsとWSLの間でファイルパスのようなシステム固有のデータを橋渡しする役目がある環境変数だそうで。これがあればWSLの環境下にあると言えそうです。

(when (and (eq system-type 'gnu/linux)
           (getenv "WSLENV"))
  (do-something))

外部コマンドを使う場合と同様、WSLENVがずっと使える保証がないところは泣き所です。
とはいえ、カーネルバージョンの文言よりは後方互換性を期待できるので、使うとしたらこちらかなーと考えています。