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

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

前回に続き、さらに以下の 3 点を修正してみた。

■修正点

  • 1. リファクタリングを実施し、関数を 3 つに分割。インタフェイス関数名を shell-pop に変更。
  • 2. *shell* バッファを映しているウィンドウから移動した際に再度関数を呼ぶと新たにウィンドウを作成してしまっていたので、その場合既存の *shell* バッファに移動するように修正。
  • 3. *shell* バッファの高さの計算方法が間違っていたので修正。また高さ調節のためのインタフェイス関数 shell-pop-set-window-height を新規に作成。

■実装

;;; shell-pop.el --- pop up and out shell buffer on the bottom of the window.

(defvar shell-pop-buffer "*shell*")
(defvar shell-pop-last-buffer nil)
(defvar shell-pop-last-window nil)
(defvar shell-pop-window-height 30) ; percentage for shell-buffer window height

(defun shell-pop-up ()
  (let ((w (get-buffer-window shell-pop-buffer)))
    (if w
        (select-window w)
      (progn
        ; save shell-pop-last-buffer and shell-pop-last-window to return
        (setq shell-pop-last-buffer (buffer-name))
        (setq shell-pop-last-window (selected-window))
        (split-window (selected-window)
                      (round (* (window-height) (/ (- 100 shell-pop-window-height) 100.0))))
        (other-window 1)
        (if (not (get-buffer shell-pop-buffer))
            (shell)
          (switch-to-buffer shell-pop-buffer))))))

(defun shell-pop-out ()
  (delete-window)
  (select-window shell-pop-last-window)
  (switch-to-buffer shell-pop-last-buffer))

(defun shell-pop ()
  (interactive)
  (if (equal (buffer-name) shell-pop-buffer)
      (shell-pop-out)
    (shell-pop-up)))

(defun shell-pop-set-window-height (n)
  (interactive "nInput the number of percentage for shell-pop window height: ")
  (setq shell-pop-window-height n))

(provide 'shell-pop)

;;; shell-pop.el ends here.

■使い方

  • 1. shell-pop.el をパスの通った場所に置く。
  • 2. (require 'shell-pop) する。
  • 3. M-x shell-pop で呼び出す。どこかのキーに割り当てておくと便利。
  • 4. シェルでコマンドを打つ。
  • 5. もういらない、と思ったらも一度 M-x shell-pop すると消える。

ポップアップするウィンドウは現在のウィンドウの真下になる。オプションとして、M-x shell-pop-set-window-height に 10 〜 90 ぐらいまでの数字(元のウィンドウに対するパーセンテージ)を与えることで高さ調節が可能。