簡易 eshell-pop, cde, cdp

個人的に Emacsから shellを使うことは苦手で基本使わないんですが、
それでもわざわざ Emacsから shellに Alt-Tab等で切り替える必要も
ないかってこともあるので、eshellをちょろっと使うようの関数を
書いてみました。


cdeは eshell-popを実行したバッファのディレクトリに移動するための
コマンド、cdpはプロジェクトトップ(.gitがあるディレクトリ)に
移動するコマンドです。shell用バッファを簡単に閉じるために、
popwinを使って popupしています。

(require 'eshell)
(require 'popwin)

(defvar eshell-pop-buffer "*eshell-pop*")
(defvar eshell-prev-buffer nil)

(defun eshell-pop ()
  (interactive)
  (setq eshell-prev-buffer (current-buffer))
  (unless (get-buffer eshell-pop-buffer)
    (save-window-excursion
      (pop-to-buffer (get-buffer-create eshell-pop-buffer))
      (eshell-mode)))
  (popwin:popup-buffer (get-buffer eshell-pop-buffer) :height 20))

(defun eshell/cde ()
  (let* ((file-name (buffer-file-name eshell-prev-buffer))
         (dir (or (and file-name (file-name-directory file-name))
                  (and (eq major-mode 'dired-mode) dired-directory)
                  (with-current-buffer eshell-prev-buffer
                    default-directory))))
    (eshell/cd dir)))

(defun eshell/cdp ()
  (let* ((cmd "git rev-parse --show-toplevel")
         (dir (with-temp-buffer
                (unless (call-process-shell-command cmd nil t)
                  (error "Here is not Git Repository"))
                (goto-char (point-min))
                (buffer-substring-no-properties
                 (point) (line-end-position)))))
    (eshell/cd dir)))

イメージ

おわりに

やっぱり Emacsから手軽に shellが操作できると便利ですね。


このへんはいろいろチャレンジしたんですが、結局どれも
しっくりこなかったので、使うのを諦めていましたが、
すべてを Emacsからでなくて、ちょこっと利用するときに
限定すればなんとかなりそうに思えました。その辺はバランスを
みつつ検討していければよりよい環境が作れるのではない
かと思います。

追記

ついでに emacsclientっぽいコマンドも作りました.
find-fileして shellの windowを消すだけのものです。

(defun eshell/e (file)
  (let ((curwin (get-buffer-window))
        (filepath (concat default-directory file)))
    (other-window 1)
    (find-file filepath)
    (delete-window curwin)))