Emacs で Shell を使うには何がいいかを模索中。

僕は MacBook を使っていて、昔は iTerm を使っていたけども、現在は標準の Terminal.app + Visor で、どこでもターミナル環境を使っておりますた。
ですが、Emacer たるもの、Shell も Emacs でという思いもあり、どうするべかなーと考えていましたが、一念発起して Shell 環境を整えてみることにしました。

Emacs で使える Shell。

とりあえず、Emacs で Shell を使うには、有名な3つのモードがあります。

上の記事に紹介がありますが、

  • shell
  • term (ansi-term)
  • eshell

の、3つです。それぞれ、M-x でコマンドをうちこむ事で使うことができます。
とりあえず、どれを使うのがいいかという判断は、やっぱり全部使ってみないと分からないので、一応全部使ってみたところ、以下の感想になりました。
主に普通の shell は貧弱と言われていますが、Emacs 上でのカスタマイズは term よりも優れていると思います。
逆に term は、terminal としての使いやすさは shell よりも上で、純粋に terminal を使いたければ term を使うのがベストと言えるでしょう。
eshell は他の2つと違い、bash でも zsh でもなくて、Elisp によって書かれた shell です。なので、elisp で書かれた(interactive な)関数が使えるなど、他の shell とはぜんぜん違います。

結局、どれを使うのか。

結局、1日くらいでは、まだ決められないので、昨日書いた shell 用の設定を貼っておきたいと思います。

;; eshell
(when (require 'eshell-auto nil t)
  (add-hook 'eshell-mode-hook
			(lambda () 
			  (define-key eshell-mode-map (kbd "C-a") 'eshell-bol)
			  (define-key eshell-mode-map (kbd "C-r") 'eshell-isearch-backward)))

  (when (require 'pcmpl-auto nil t)
	(when (require 'pcmpl-ssh nil t)
	  (add-hook 'eshell-mode-hook 'pcomplete-shell-setup)))

  (setq eshell-cmpl-ignore-case t)	; 補完時に大文字小文字を区別しない
  (setq eshell-glob-include-dot-dot nil) ; ../ を * でマッチさせない
  (setq eshell-ask-to-save-history (quote always)) ; 確認なしでヒストリ保存
  (setq eshell-history-file-name "~/.zsh_history") ; zsh のヒストリと共有
  (setq eshell-history-size 100000)				   ; ヒストリサイズ
  (setq eshell-hist-ignoredups t))		; ヒストリの重複を無視

;; shell
(when (require 'shell-history nil t)
  (when (require 'anything-complete nil t)
	(add-hook 'shell-mode-hook
			  (lambda ()
				(define-key shell-mode-map (kbd "C-r") 'anything-complete-shell-history)))

	(use-anything-show-completion 'anything-complete-shell-history
								  '(length anything-c-source-complete-shell-history))))

;; ansi-colorでエスケープシーケンスをfontifyする設定
;; http://d.hatena.ne.jp/rubikitch/20081102/1225601754
(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)

(when (require 'shell-pop nil t)
  (setq shell-pop-window-height 60) ; percentage for shell-buffer window height
  (define-key global-map [(super t)] 'shell-pop))

shell のときに、C-r で anything-complete-shell-history を使う設定が気に入っています。anything-show-completion を使うようにしているのがみそです。
shell-pop は、id:kyagi さんの Emacs でシェルを好きな時に呼び出す その 3 - 8tree にっきのものを利用しております。term と eshell も対応させようかと思ったのですが、それについてはまたこんど。
そんなことを言っていたら、作者の kyagi さんが Emacs でシェルを好きな時に呼び出す その 4 - 8tree にっきで eshell と term にも対応してくれました!
あと、Eshell の最新版を利用すると、僕の環境では、cl-pop 関数がないよ(Symbol's function definition is void: cl-pop)というエラーが出て、使いものにならなかったのですが、esh-util.el の eshell-copy-tree に使われている cl-pop 関数が存在せず、代りに cl-pop2 という関数が Emacs 同封の cl-macs.el に定義されているので、そちらに書き換えると無事動作しました。