簡易 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)))