Skip to content

Windows+EmacsのShellが動かない

2013年12月31日

Windowsの上でEmacsが動作しているとき、
M-x shell でSpawning child process: invalid argument
が出て動作しない問題。

大抵はパスの問題であるため、正しくパスを通せば良い。
LinuxとWindowsではパスの場所や表記が異なるために、Windowsだとそのまま動作させることができない。面倒。

動作中のOSにより処理を分ける。
http://d.hatena.ne.jp/pogin/20120530/1338328354
に従って、
+++ ~/.emacs.d/init.el

(defvar run-cygwin (equal system-type ‘cygwin))
(defvar run-meadow (featurep ‘meadow))
(defvar run-nt     (equal system-type ‘windows-nt))
(defvar run-ms-dos (equal system-type ‘ms-dos))

;; Windowsかどうかの判定
(defvar run-windows
(or run-cygwin
run-meadow
run-nt
run-ms-dos))

;; Linuxかどうかの判定
(defvar run-linux (eq system-type ‘gnu/linux)

さらに、

(if (eq run-windows t) (load-file “~/.emacs.d/Windows_PATH_Setting.el”))

をinit.elに追記。
以降(eq run-windows)がtと評価されれば、Windows環境であることが特定できる。
もしLinuxのみ使うのであれば、この追記は不要。

さらに、Windows_PATH_Setting.elと追加の設定ファイルを作成する。
本来はinit.elにベタ書きするのかもしれないが、EmacsLispのif文が1行しか読めない?ため(即時関数を使えばよいと思うがわからない)、load-fileで読み込ませる。

syati.info/?p=1958
を参考にする。このままでは元々のパスを上書きしてしまうので、パスの最初に追記するよう改める。

+++ ~/.emacs.d/Windows_PATH_Setting

(setq append-path (list
“/bin”
“/usr/bin”
“/usr/local/bin”
“/sbin”
“/usr/sbin”
))
(setq exec-path (append exec-path append-path))
(setenv “PATH” (mapconcat ‘identity exec-path “;”))
(setq shell-file-name “zsh”)
(setenv “SHELL” shell-file-name)
(setq explicit-shell-file-name shell-file-name)

zshが上るようになっているため、zsh以外が必要であれば、shell-file-nameを適切に変更する。

広告

From → Emacs, Windows

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。