tools/eshell: refactor; don't open another eshell from eshell

This commit is contained in:
Henrik Lissner 2018-03-24 23:19:14 -04:00
parent 8604966e21
commit c87122e6b4
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -40,17 +40,12 @@
(format " [%s]" (substring branch 2)) (format " [%s]" (substring branch 2))
""))) "")))
(defun +eshell-delete-window () (defun +eshell--buffer (&optional new-p)
(if (one-window-p) (or (unless new-p
(unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) (cl-loop for buf in (ring-elements +eshell-buffers)
(switch-to-buffer (doom-fallback-buffer))) if (and (buffer-live-p buf)
(delete-window))) (not (get-buffer-window buf)))
return buf))
(defun +eshell-get-or-create-buffer ()
(or (cl-loop for buf in (ring-elements +eshell-buffers)
if (and (buffer-live-p buf)
(not (get-buffer-window buf)))
return buf)
(generate-new-buffer +eshell-buffer-name))) (generate-new-buffer +eshell-buffer-name)))
;;;###autoload ;;;###autoload
@ -69,7 +64,7 @@
(defun +eshell/open (&optional command) (defun +eshell/open (&optional command)
"Open eshell in the current buffer." "Open eshell in the current buffer."
(interactive) (interactive)
(let ((buf (+eshell-get-or-create-buffer))) (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode))))
(with-current-buffer buf (with-current-buffer buf
(unless (eq major-mode 'eshell-mode) (eshell-mode))) (unless (eq major-mode 'eshell-mode) (eshell-mode)))
(switch-to-buffer buf) (switch-to-buffer buf)
@ -80,7 +75,7 @@
(defun +eshell/open-popup (&optional command) (defun +eshell/open-popup (&optional command)
"Open eshell in a popup window." "Open eshell in a popup window."
(interactive) (interactive)
(let ((buf (+eshell-get-or-create-buffer))) (let ((buf (+eshell--buffer)))
(with-current-buffer buf (with-current-buffer buf
(unless (eq major-mode 'eshell-mode) (eshell-mode))) (unless (eq major-mode 'eshell-mode) (eshell-mode)))
(pop-to-buffer buf) (pop-to-buffer buf)
@ -120,12 +115,19 @@ module to be loaded."
;; Hooks ;; Hooks
;; ;;
;;;###autoload
(defun +eshell|delete-window ()
(if (one-window-p)
(unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer)))
(switch-to-buffer (doom-fallback-buffer)))
(delete-window)))
;;;###autoload ;;;###autoload
(defun +eshell|init () (defun +eshell|init ()
"Keep track of eshell buffers." "Keep track of eshell buffers."
(let ((buf (current-buffer))) (let ((buf (current-buffer)))
(remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t)
(add-hook 'kill-buffer-hook #'+eshell-delete-window nil t) (add-hook 'kill-buffer-hook #'+eshell|delete-window nil t)
(dolist (buf (ring-elements +eshell-buffers)) (dolist (buf (ring-elements +eshell-buffers))
(unless (buffer-live-p buf) (unless (buffer-live-p buf)
(+eshell--remove-buffer buf))) (+eshell--remove-buffer buf)))