From 47d7e31800e72c626b783065269fb79d4694fcf1 Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Mon, 13 Feb 2023 13:22:51 +0100 Subject: [PATCH] Let display-buffer handle window placement for shells This provides the same functionality, but makes it more configurable. --- init.el | 11 ++++++++++- site-lisp/db-eshell.el | 19 ++++++++----------- site-lisp/db-utils.el | 8 +++----- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/init.el b/init.el index 52b8333..8b0370b 100644 --- a/init.el +++ b/init.el @@ -623,11 +623,20 @@ (side . right) (slot . 0) (window-width . 0.33))) + ;; Inspired by masteringemacs (add-to-list 'display-buffer-alist '("^\\*Help\\*" (display-buffer-reuse-window display-buffer-pop-up-window) - (inhibit-same-window . t))))) + (inhibit-same-window . t))) + ;; Inspired by masteringemacs + (add-to-list 'display-buffer-alist + '("^\\*e?shell\\*" + display-buffer-in-direction + (direction . bottom) + (window . root) + (window-height . 0.33) + (dedicated . t))))) (use-package winner :commands (winner-mode winner-undo winner-redo)) diff --git a/site-lisp/db-eshell.el b/site-lisp/db-eshell.el index e068598..fb47775 100644 --- a/site-lisp/db-eshell.el +++ b/site-lisp/db-eshell.el @@ -23,10 +23,8 @@ ;; Various (defun db/run-or-hide-eshell (arg) - "Opens an eshell buffer if not already in one, and otherwise - returns to where we have been before." - ;; idea to split the current window is from - ;; http://howardism.org/Technical/Emacs/eshell-fun.html + "Opens an eshell buffer if not already in one. +Otherwise moves the cursor to the window where we have been before." (interactive "P") (if (derived-mode-p 'eshell-mode) ;; bury buffer; reopen with current working directory if arg is given @@ -35,17 +33,16 @@ (and arg (db/run-or-hide-eshell arg))) (if-let ((eshell-window (db/find-window-by-buffer-mode 'eshell-mode))) (select-window eshell-window) - ;; open eshell - (let* ((current-dir (expand-file-name default-directory)) - (height (/ (frame-text-lines) 3))) - (select-window (split-window (frame-root-window) (- height) 'below)) - (eshell 1) + ;; No running eshell found, open new one. + (let* ((current-dir (expand-file-name default-directory))) + (--if-let (display-buffer (eshell 1)) + (select-window it) + (error "Could not start eshell (`display-buffer' returned nil)")) (when arg (end-of-line) (eshell-kill-input) (insert (format "cd '%s'" current-dir)) - (eshell-send-input)))) - (set-window-dedicated-p (selected-window) t))) + (eshell-send-input)))))) (defun eshell-clear-buffer () "Clear terminal." diff --git a/site-lisp/db-utils.el b/site-lisp/db-utils.el index 4b0cc86..4774200 100644 --- a/site-lisp/db-utils.el +++ b/site-lisp/db-utils.el @@ -74,11 +74,9 @@ If already in `*ansi-term*' buffer, bury it." (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 (/ (frame-text-lines) 3))) - (select-window (split-window (frame-root-window) (- height) 'below)) - (shell))) - (set-window-dedicated-p (selected-window) t))) + (--if-let (display-buffer (shell)) + (select-window it) + (error "Could not start shell (`display-buffer' returned nil)"))))) (if (not arg) ;; toggle shell window (if (not (derived-mode-p 'shell-mode))