Eshell でもコマンドラインスタックを使いたい.

Zshコマンドラインスタックって地味ながら結構便利な機能ですよね.
そんな機能知らないって方は以下のリンクを見つつぜひ使ってみてください.

OS X ハッキング! (55) 究極のシェル「zsh」を知る(その2)

Eshell にはこの便利機能がなくてションボリするわけです.
Zsh にできるんだから Eshell にできないわけはない!
というわけで実装しました,コマンドラインスタック.

以下を ~/emacs.d/init.el などにコピ&ペーストすれば,M-q で入力中の
コマンドをスタックに積むことができます.

(require 'esh-mode)

(defvar *eshell-command-stack* nil
  "コマンドラインスタック")
(make-variable-buffer-local '*eshell-command-stack*)

(defun eshell-push-command (cmd)
  "コマンドラインスタックに cmd を追加する."
  (interactive
   (let ((str (progn
                (eshell-bol)
                (buffer-substring (point) (point-max)))))
     (delete-region (point) (point-max))
     (list str)))
  (unless (equal cmd "")
    (push cmd *eshell-command-stack*)))

(defadvice eshell-send-input (after esh-pop-com activate)
  (when *eshell-command-stack*
    (insert (pop *eshell-command-stack*))))

(add-hook 'eshell-mode-hook
          (lambda ()
            (local-set-key "\M-q" 'eshell-push-command)))