From 7ce4a25e1e44244ac425c4f17662d36209983e8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 14 Jun 2019 12:33:09 +0200 Subject: [PATCH] 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. --- modules/term/term/autoload.el | 49 +++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/modules/term/term/autoload.el b/modules/term/term/autoload.el index dd7727b59..b5eb3bf44 100644 --- a/modules/term/term/autoload.el +++ b/modules/term/term/autoload.el @@ -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)