Last Modified:
EmacsとShellの環境を共有する(NTEmacs対応) #Emacs
一時ファイル作成するよりパイプでつなぎたい派です。 パイプが無理でもコマンド置換や名前付きパイプでがんばりたい派です。
そんな私は環境変数のインポートを一時ファイルを作らずにEmacs内で完結するようにしています。
;; NTEmacsでCygwinを使っている場合はcygwin-mountを使う
(when (require 'cygwin-mount nil t)
(setq cygwin-mount-cygwin-bin-directory "c:/cygwin/bin")
(cygwin-mount-activate))
;; 環境変数のインポート
(let* ((output (with-output-to-string (call-process "/bin/sh" nil standard-output nil "--login" "-c" "env")))
(lines (split-string output "\n" t))
(pairs (mapcar (lambda (x) (split-string x "=")) lines)))
(dolist (pair pairs)
(setenv (pop pair) (mapconcat 'identity pair "="))))
;; HOMEとPATHの再構築
(when (eq system-type 'windows-nt)
(setenv "HOME" (expand-file-name (getenv "HOME")))
(setenv "PATH" (mapconcat 'expand-file-name (split-string (getenv "PATH") ":" t) path-separator)))
;; exec-pathの設定
(setq exec-path (append (split-string (getenv "PATH") path-separator) exec-path))
/bin/sh --login -c env
を実行して得られた環境変数一覧をsetenv
しまくってます。NTEmacsのためにHOMEとPATHを再構築します。
shell-command-to-string
を使っていないのは、この処理をかなり早い段階(シェルの設定を行なう前)で実行しているからです。shell-file-name
の設定よりも早いので"/bin/sh"
を直書きしてます。
が、特に早い段階でやらないといけないわけじゃないので、この辺はafter-init-hook
に入れるかもです。