Emacs でシェルを好きな時に呼び出す その 2

追記:より使いやすいように修正しました。こちらが最終版です。

荒削りだった前回の以下の 2 点を修正してみた。

■修正点

  • 1. フレームが複数のウィンドウに分割されていた場合、トグル後に全ウィンドウを削除してひとつにしてしまっていたので、元のウィンドウ/元のバッファを保持するように修正。
  • 2. *shell* バッファの高さが 50% 固定だったのを調整できるように修正。変数 my-shell-buffer-height に% で与える。デフォルトは 10%。

■実装

(defvar my-shell-buffer "*shell*")
(defvar my-last-buffer nil)
(defvar my-last-window nil)
(defvar my-shell-buffer-height 10) ; percentage for shell-buffer window height

(defun my-search-buffer (buffer)
  (if (catch 'found
        (dolist (b (buffer-list))
          (if (string-match buffer (buffer-name b))
              (throw 'found t))))
      t
    nil))

(defun my-toggle-shell-buffer ()
  (interactive)
    (let ((cb (buffer-name))) ;cb = current-buffer
      (if (equal cb my-shell-buffer)
          (progn
            (delete-window)
            (select-window my-last-window)
            (switch-to-buffer my-last-buffer))
        (progn
          ; save my-last-buffer and my-last-window to return
            (setq my-last-buffer (buffer-name))
            (setq my-last-window (selected-window))
            (split-window (selected-window)
                          (* (/ (window-height) 10)
                             (/ (- 100 my-shell-buffer-height) 10)))
            (other-window 1)
            (if (not (my-search-buffer my-shell-buffer))
                (shell)
              (switch-to-buffer my-shell-buffer))))))

スクリーンショット

■shell-toggle.el との比較した個人的な感想 (^_^;

  • - *shell* バッファのためのウィンドウを選択しているウィンドウを分割してその下に用意するので視点移動が少なく使いやすい(たぶん)。
  • - *shell* バッファのための高さを調節可能なので使いやすい。