Emacsの設定ファイルをOSの判定をして共有する方法|system-type

この記事は約4分で読めます。

今回は Emacs で OS を判定する方法を紹介します。
2022-02-03 WSL についても追記しました。

スポンサーリンク

環境によって設定を切り替える

Emacs は WindowsやLinux、MAC OS X などいろんな OS 上で動作します。そこで、複数の OS で設定ファイル(.emacs, .emacs.d/init.el)を共有したい場合があります。その方法の一つとして、ログイン名(ユーザ名)で処理を分岐する方法を下記の記事で紹介しました。

Emacs の設定ファイルを複数環境で共有する方法|user-login-name
Emacs を使うなかで設定ファイル(通称 .emacs)を複数の環境で共有したい場合があります。複数のOS(Windows & Linux など)で1つの .emacs を共有する時や、 tramp(Windows なら plink)で他...

今回は別法として 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 により処理を分けることで、設定ファイルをうまく共有できますよ!

コメント