diff --git a/site-lisp/db-utils.el b/site-lisp/db-utils.el index a547cae..09c702d 100644 --- a/site-lisp/db-utils.el +++ b/site-lisp/db-utils.el @@ -64,28 +64,31 @@ If already in `*ansi-term*' buffer, bury it." (defun db/run-or-hide-shell (arg) "Opens a shell buffer in new window if not already in one. Otherwise, closes the current shell window. With ARG, switch - to `default-directory' first." + to `default-directory' of the current buffer first." ;; idea to split the current window is from ;; http://howardism.org/Technical/Emacs/eshell-fun.html (interactive "P") - (if (derived-mode-p 'shell-mode) - ;; bury buffer; reopen with current working directory if arg is given - (progn - (bury-buffer) - (delete-window) - (and arg (db/run-or-hide-shell arg))) - (if-let ((shell-window (db/find-window-by-buffer-mode 'shell-mode))) - (select-window shell-window) - ;; open shell - (let ((current-dir (expand-file-name default-directory)) - (height (/ (window-total-height) 3))) - (shell) - (enlarge-window (- height (window-total-height))) - (when arg - (end-of-line) - (comint-kill-input) - (insert (format "cd '%s'" current-dir)) - (comint-send-input)))))) + (cl-flet ((change-to-shell () + (if-let ((shell-window (db/find-window-by-buffer-mode 'shell-mode))) + (select-window shell-window) + ;; open shell in buffer with height of ⅓ of current window + (let ((height (/ (window-total-height) 3))) + (shell) + (enlarge-window (- height (window-total-height))))))) + (if (not arg) + ;; toggle shell window + (if (not (derived-mode-p 'shell-mode)) + (change-to-shell) + (bury-buffer) + (delete-window)) + + ;; unconditionally go to shell, and also change to cwd + (let ((current-dir (expand-file-name default-directory))) + (change-to-shell) + (end-of-line) + (comint-kill-input) + (insert (format "cd '%s'" current-dir)) + (comint-send-input))))) ;;; General Utilities