Rewrite +term/toggle #1492
multi-term performs a lot of hackery on Emacs' windows API, which causes problems, particularly for persp-mode. To side-step it all we must reinvent some of the wheel.
This commit is contained in:
parent
20f66b7560
commit
7ce4a25e1e
1 changed files with 27 additions and 22 deletions
|
@ -1,5 +1,8 @@
|
|||
;;; term/term/autoload.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defvar +term--dedicated-buffer nil)
|
||||
(defvar +term--dedicated-window nil)
|
||||
|
||||
;;;###autoload
|
||||
(defun +term/toggle (arg)
|
||||
"Toggle a persistent terminal popup window at project's root.
|
||||
|
@ -12,28 +15,30 @@ If prefix ARG, recreate term buffer in the current project's root."
|
|||
(let ((default-directory (or (doom-project-root) default-directory))
|
||||
(multi-term-dedicated-buffer-name "doom:term-popup")
|
||||
(multi-term-dedicated-select-after-open-p t)
|
||||
confirm-kill-processes
|
||||
current-prefix-arg)
|
||||
(cl-letf (((symbol-function #'multi-term-dedicated-get-window)
|
||||
(lambda () (setq multi-term-dedicated-window
|
||||
(display-buffer-in-side-window
|
||||
multi-term-dedicated-buffer
|
||||
`((window-height . ,multi-term-dedicated-window-height)))))))
|
||||
(when arg
|
||||
(when (multi-term-window-exist-p multi-term-dedicated-window)
|
||||
(delete-window multi-term-dedicated-window))
|
||||
(when (multi-term-buffer-exist-p multi-term-dedicated-buffer)
|
||||
(when-let (process (get-buffer-process multi-term-dedicated-buffer))
|
||||
(kill-process process))
|
||||
(kill-buffer multi-term-dedicated-buffer)))
|
||||
(if (multi-term-dedicated-exist-p)
|
||||
(if (eq (selected-window) multi-term-dedicated-window)
|
||||
(multi-term-dedicated-close)
|
||||
(select-window multi-term-dedicated-window)
|
||||
(when (bound-and-true-p evil-local-mode)
|
||||
(evil-change-to-initial-state))
|
||||
(goto-char (point-max)))
|
||||
(multi-term-dedicated-open)))))
|
||||
confirm-kill-processes)
|
||||
(when arg
|
||||
(when (multi-term-window-exist-p +term--dedicated-window)
|
||||
(delete-window +term--dedicated-window))
|
||||
(when (multi-term-buffer-exist-p +term--dedicated-buffer)
|
||||
(when-let (process (get-buffer-process +term--dedicated-buffer))
|
||||
(kill-process process))
|
||||
(kill-buffer +term--dedicated-buffer)))
|
||||
(if (multi-term-dedicated-exist-p)
|
||||
(if (eq (selected-window) +term--dedicated-window)
|
||||
(multi-term-dedicated-close)
|
||||
(select-window +term--dedicated-window)
|
||||
(when (bound-and-true-p evil-local-mode)
|
||||
(evil-change-to-initial-state))
|
||||
(goto-char (point-max)))
|
||||
(let ((buffer (multi-term-get-buffer nil t)))
|
||||
(with-current-buffer buffer
|
||||
(multi-term-internal)
|
||||
(setq +term--dedicated-buffer buffer))
|
||||
(when-let (window
|
||||
(display-buffer-in-side-window
|
||||
buffer `((window-height . ,multi-term-dedicated-window-height))))
|
||||
(setq +term--dedicated-window window)
|
||||
(select-window window))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun +term/here (arg)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue