Emacsを1つの設定ファイルで複数の環境で使うために、 設定をEmacsバージョンや OS、ログインユーザー名によって切り替える方法を紹介します。


Emacs のバージョンで設定を切り分ける

2016-09-17 にEmacs 25.1がリリースされましたね!早速アップデートした方もいらっしゃるかと思います。 Emacsを新しいバージョンにアップデートしたときに問題になるのが、互換性の問題です。 メンテナンスが追いついていないパッケージがあったり機能の仕様が変わったりすることがあります。 例えば今回のEmacs 25.1では、以前開いたファイルを再度開いたときに元のカーソル位置を復元する機能であるSavePlaceを有効にするための記述方法が変わりました。 詳細はEmacsWiki Save Place に記載があります。

そこで、Emacsのバージョンで処理を分けます。emacs-major-version emacs-minor-versionを使えばよいです。 例として、下記のようになります。

1
2
3
4
5
6
;;; enable saveplace
(if (and (>= emacs-major-version 24) (>= emacs-minor-version 5))
    ;; For GNU Emacs 24.5 and older versions.
    (progn (require 'saveplace) (setq-default save-place t))
  ;; For GNU Emacs 25.1 and newer versions.
  (save-place-mode 1))

これで、新しいバージョン Emacs 25.1 でも古いバージョンでも、同じ Emacs初期化ファイルで共有させることができます。 ちなみに、今使っているEmacsのバージョンを確認するコマンドは M-x versionです。 エコーエリアに下記のように Emacsの情報が表示されます。

1
GNU Emacs 24.5.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21) of 2015-04-11 on builder10-9.porkrind.org

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

Emacs は WindowsやLinux、Mac OS X などいろんな OS上で動作します。 そこで複数の OSで設定を切り替える方法を説明します。

いま使用している OS を表示させてみる|message 関数と system-type 変数

まずは、いま使用している OS を確認してみます。 message 関数と system-type 変数を使用します。 message 関数はC言語でいう printf と同じようなフォーマット表示関数で、 system-type 変数はOSの情報が格納されています。 下記の elispを評価してみてください。閉じ括弧のところで C-x C-e とします。

1
(message "OS is %s." system-type)

するとエコーエリアにメッセージが表示されます。OS によって表示されるメッセージが異なります。下記のようになるはずです。

  • Mac OS X の場合
    • OS is darwin.
  • Windows
    • OS is windows-nt.
  • Linux
    • OS is gnu/linux.
  • WSL
    • OS is gnu/linux.

Linux と WSL は同じになりますね。

WSL と Linux の判別

上述の通り system-type では Linux と WSLの区別がつきません。 そこでもうひと手間かけます。WSL には WSL_DISTRO_NAME という環境変数にディストリビューションの名前が設定されます。 たとえば Ubuntu-20.04 のように設定されているはずです。 そこで下記のようにWSL_DISTRO_NAME の長さが0かそれより大きいかで判断します。

1
(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 判定の方法は同様です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
;; 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)))

ログインユーザー名で設定を切り替える

ログインユーザー名でも切替可能です。 user-login-nameを利用します。

1
2
3
4
5
6
;; ログイン名に応じてプロキシの設定を行う.
(if (equal (user-login-name) "hoge_user_name")
    (setq url-proxy-services
          '(("http" . "proxy.hoge.co.jp:8080")
            ("https" . "proxy.hoge.co.jp:8080")
            )))

まとめ

今回は、Emacsバージョン、OS, ユーザー名で設定を切り替える方法を説明しました。 これで複数の環境で設定ファイルをうまく共有できますよ!