EmacsのM-x shellでzshを使う設定

.zshrcの設定内容によっては、EmacsのM-x shellでは動作しなくなる。それは、zleをいじっているから。だけど、zshでもEmacsの中で動かす方法はある。以下の行を.zshrcに入れるだけでよい。

[[ $EMACS = t ]] && unsetopt zle

この設定は環境変数 EMACS が t であるならば zle を使わなくするという意味。で、環境変数 EMACS は誰が設定しているかというと comint.el の comint-exec-1 だ。以下の部分で環境変数を設定している。

  (let ((process-environment
	 (nconc
	  ;; If using termcap, we specify `emacs' as the terminal type
	  ;; because that lets us specify a width.
	  ;; If using terminfo, we specify `dumb' because that is
	  ;; a defined terminal type.  `emacs' is not a defined terminal type
	  ;; and there is no way for us to define it here.
	  ;; Some programs that use terminfo get very confused
	  ;; if TERM is not a valid terminal type.
	  ;; ;; There is similar code in compile.el.
	  (if (and (boundp 'system-uses-terminfo) system-uses-terminfo)
	      (list "TERM=dumb" "TERMCAP="
		    (format "COLUMNS=%d" (window-width)))
	    (list "TERM=emacs"
		  (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width))))
	  (unless (getenv "EMACS")
	    (list "EMACS=t"))
	  (list (format "INSIDE_EMACS=%s,comint" emacs-version))
	  process-environment))

zleをいじってからM-x shellが動かなくなったから諦めていたのだが、助かった。やっと疑問が解けたよ。

zshエスケープシーケンスが有効な場合は以下の設定がよい。ansi-colorでエスケープシーケンスをfontifyする設定。

(autoload 'ansi-color-for-comint-mode-on "ansi-color"
  "Set `ansi-color-for-comint-mode' to t." t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

履歴は共有した状態で anything-complete-shell-history を使う。これを使うと素のzshの履歴が貧弱でしょうがなくなる。だけど逆に補完は貧弱だから素のzshと併用するのが現実的だろうね。
anything.elとプラグイン等をリリース - http://rubikitch.com/に移転しました

M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/anything.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/anything-config.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/anything-match-plugin.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el
M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/anything-complete.el