今回は Emacs で OS を判定する方法を紹介します。
2022-02-03 WSL についても追記しました。
環境によって設定を切り替える
Emacs は WindowsやLinux、MAC OS X などいろんな OS 上で動作します。そこで、複数の OS で設定ファイル(.emacs, .emacs.d/init.el)を共有したい場合があります。その方法の一つとして、ログイン名(ユーザ名)で処理を分岐する方法を下記の記事で紹介しました。
今回は別法として Emacs の設定ファイル上で OS を判定して処理を分岐する方法を紹介します。
いま使用している OS を表示させてみる|massage 関数と system-type 変数
まずは、いま使用している OS を確認してみましょう。 massage 関数と system-type変数を使用します。message 関数は C言語でいう printf と同じようなフォーマット表示関数で、system-type変数はOS の情報が格納されいています。
下記の elisp を評価してみてください。評価の仕方は、閉じ括弧の所で C-x C-e とします。
(message "OS is %s." system-type)
するとエコーエリアにメッセージが表示されます。OS によって表示されるメッセージが異なります。下記のようになるはず、です。
Linux の場合
"OS is gnu/linux."
Mac OS X の場合
"OS is darwin."
Windows の場合
Windows ネイティブで使っている場合は下記のようになります。
"OS is windows-nt."
WSL の場合
Windows の WSL で使っている場合は下記のように Linux と同じになります。
"OS is gnu/linux."
WSL と Linux の判別 | WSL_DISTRO_NAME 環境変数
上述の通り system-type では Linux と WSL の区別がつきません。そこでもうひと手間かけます。WSL には WSL_DISTRO_NAME という環境変数にディストリビューションの名前が設定されます。たとえば Ubuntu-20.04 のように設定されているはずです。
そこで下記のように WSL_DISTOR_NAME の長さが0かそれより大きいかで判断します。
(when (eq system-type 'gnu/linux) (if (= (length (getenv "WSL_DISTRO_NAME")) 0) (message "OS is Linux") (message "OS is WSL")))
OS を判定して処理を分岐させる設定ファイル例
これを利用して OS によって処理を分岐させることで、設定ファイルを共有させます。
例として、OS によって PATH設定の切り替えをする例を書きます。今回は Windows と Mac OS X の例です。Linux でも OS 判定の方法は同様です。
;; OS によって設定を切り替える例
(when (eq system-type 'windows-nt) ; Windows
(setenv "PATH" (concat "C:\\Programs\\msys64\\usr\\bin;" (getenv "PATH"))) ; msys2 の PATH 設定を追加
(when (eq system-type 'darwin) ; Mac OS X
(exec-path-from-shell-initialize)) ; PATH 設定を引き継ぐ
(when (eq system-type 'gnu/linux)
(if (/= (length (getenv "WSL_DISTRO_NAME")) 0) ; WSL
(w32-ime-initialize)))
まとめ
今回は、system-nt変数とWSL_DISTRO_NAME環境変数を利用して複数の OS で設定ファイル(.emacs, .emacs.d/init.el)を共有する方法を紹介しました。ついでに massage 関数の簡単な使い方も出ましたね。こんな感じで OS により処理を分けることで、設定ファイルをうまく共有できますよ!
コメント