Let display-buffer handle window placement for shells

This provides the same functionality, but makes it more configurable.
This commit is contained in:
Daniel - 2023-02-13 13:22:51 +01:00
parent 0ff7bba709
commit 47d7e31800
Signed by: dbo
GPG Key ID: 784AA8DF0CCDF625
3 changed files with 21 additions and 17 deletions

11
init.el
View File

@ -623,11 +623,20 @@
(side . right) (side . right)
(slot . 0) (slot . 0)
(window-width . 0.33))) (window-width . 0.33)))
;; Inspired by masteringemacs
(add-to-list 'display-buffer-alist (add-to-list 'display-buffer-alist
'("^\\*Help\\*" '("^\\*Help\\*"
(display-buffer-reuse-window (display-buffer-reuse-window
display-buffer-pop-up-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 (use-package winner
:commands (winner-mode winner-undo winner-redo)) :commands (winner-mode winner-undo winner-redo))

View File

@ -23,10 +23,8 @@
;; Various ;; Various
(defun db/run-or-hide-eshell (arg) (defun db/run-or-hide-eshell (arg)
"Opens an eshell buffer if not already in one, and otherwise "Opens an eshell buffer if not already in one.
returns to where we have been before." Otherwise moves the cursor to the window where we have been before."
;; idea to split the current window is from
;; http://howardism.org/Technical/Emacs/eshell-fun.html
(interactive "P") (interactive "P")
(if (derived-mode-p 'eshell-mode) (if (derived-mode-p 'eshell-mode)
;; bury buffer; reopen with current working directory if arg is given ;; bury buffer; reopen with current working directory if arg is given
@ -35,17 +33,16 @@
(and arg (db/run-or-hide-eshell arg))) (and arg (db/run-or-hide-eshell arg)))
(if-let ((eshell-window (db/find-window-by-buffer-mode 'eshell-mode))) (if-let ((eshell-window (db/find-window-by-buffer-mode 'eshell-mode)))
(select-window eshell-window) (select-window eshell-window)
;; open eshell ;; No running eshell found, open new one.
(let* ((current-dir (expand-file-name default-directory)) (let* ((current-dir (expand-file-name default-directory)))
(height (/ (frame-text-lines) 3))) (--if-let (display-buffer (eshell 1))
(select-window (split-window (frame-root-window) (- height) 'below)) (select-window it)
(eshell 1) (error "Could not start eshell (`display-buffer' returned nil)"))
(when arg (when arg
(end-of-line) (end-of-line)
(eshell-kill-input) (eshell-kill-input)
(insert (format "cd '%s'" current-dir)) (insert (format "cd '%s'" current-dir))
(eshell-send-input)))) (eshell-send-input))))))
(set-window-dedicated-p (selected-window) t)))
(defun eshell-clear-buffer () (defun eshell-clear-buffer ()
"Clear terminal." "Clear terminal."

View File

@ -74,11 +74,9 @@ If already in `*ansi-term*' buffer, bury it."
(cl-flet ((change-to-shell () (cl-flet ((change-to-shell ()
(if-let ((shell-window (db/find-window-by-buffer-mode 'shell-mode))) (if-let ((shell-window (db/find-window-by-buffer-mode 'shell-mode)))
(select-window shell-window) (select-window shell-window)
;; open shell in buffer with height of ⅓ of current window (--if-let (display-buffer (shell))
(let ((height (/ (frame-text-lines) 3))) (select-window it)
(select-window (split-window (frame-root-window) (- height) 'below)) (error "Could not start shell (`display-buffer' returned nil)")))))
(shell)))
(set-window-dedicated-p (selected-window) t)))
(if (not arg) (if (not arg)
;; toggle shell window ;; toggle shell window
(if (not (derived-mode-p 'shell-mode)) (if (not (derived-mode-p 'shell-mode))