Integrate term toggle commands w/ persp-mode #1492

By namespacing the dedicated term buffers you get perspective-local
popup terminals.
This commit is contained in:
Henrik Lissner 2019-06-16 18:53:45 +02:00
parent 5e9c020c21
commit 43615c4d64
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
3 changed files with 46 additions and 31 deletions

View file

@ -84,7 +84,12 @@
Changes the PWD to the PWD of the buffer this command is executed from a new Changes the PWD to the PWD of the buffer this command is executed from a new
project (or if prefix ARG was present)." project (or if prefix ARG was present)."
(interactive "P") (interactive "P")
(let ((eshell-buffer (get-buffer-create "*doom:eshell-popup*")) (let ((eshell-buffer
(get-buffer-create
(format "*doom:eshell-popup:%s*"
(if (bound-and-true-p persp-mode)
(safe-persp-name (get-current-persp))
"main"))))
(target-project (or (doom-project-root) default-directory)) (target-project (or (doom-project-root) default-directory))
confirm-kill-processes confirm-kill-processes
current-prefix-arg) current-prefix-arg)
@ -105,6 +110,7 @@ project (or if prefix ARG was present)."
(evil-change-to-initial-state)) (evil-change-to-initial-state))
(goto-char (point-max))) (goto-char (point-max)))
(with-current-buffer (pop-to-buffer eshell-buffer) (with-current-buffer (pop-to-buffer eshell-buffer)
(doom|mark-buffer-as-real)
(if (eq major-mode 'eshell-mode) (if (eq major-mode 'eshell-mode)
(run-hooks 'eshell-mode-hook) (run-hooks 'eshell-mode-hook)
(eshell-mode)) (eshell-mode))

View file

@ -1,14 +1,11 @@
;;; term/term/autoload.el -*- lexical-binding: t; -*- ;;; term/term/autoload.el -*- lexical-binding: t; -*-
(defvar +term--dedicated-buffer nil) (defun +term--kill-dedicated (window buffer)
(defvar +term--dedicated-window nil) (when (window-live-p window)
(delete-window window))
(defun +term--kill-dedicated () (when (buffer-live-p buffer)
(when (multi-term-window-exist-p +term--dedicated-window) (set-process-query-on-exit-flag (get-buffer-process buffer) nil)
(delete-window +term--dedicated-window)) (kill-buffer buffer)))
(when (multi-term-buffer-exist-p +term--dedicated-buffer)
(set-process-query-on-exit-flag (get-buffer-process +term--dedicated-buffer) nil)
(kill-buffer +term--dedicated-buffer)))
;;;###autoload ;;;###autoload
(defun +term/toggle (arg) (defun +term/toggle (arg)
@ -20,27 +17,35 @@ If prefix ARG, recreate term buffer in the current project's root."
(interactive "P") (interactive "P")
(require 'multi-term) (require 'multi-term)
(let ((default-directory (or (doom-project-root) default-directory)) (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)
(multi-term-dedicated-select-after-open-p t)) (multi-term-dedicated-buffer-name
(when arg (format "doom:term-popup:%s"
(+term--kill-dedicated)) (if (bound-and-true-p persp-mode)
(if (and (multi-term-window-exist-p +term--dedicated-window) (safe-persp-name (get-current-persp))
(multi-term-buffer-exist-p +term--dedicated-buffer)) "main"))))
(if (eq (selected-window) +term--dedicated-window) (let* ((buffer (multi-term-get-buffer nil t))
(+term--kill-dedicated) (window (get-buffer-window buffer)))
(select-window +term--dedicated-window) (when arg
(when (bound-and-true-p evil-local-mode) (+term--kill-dedicated window buffer)
(evil-change-to-initial-state)) (setq buffer (multi-term-get-buffer nil t))) ; recreates buffer
(goto-char (point-max))) (if (and (window-live-p window)
(let ((buffer (multi-term-get-buffer nil t))) (buffer-live-p buffer))
(if (eq (selected-window) window)
(delete-window window)
(select-window window)
(when (bound-and-true-p evil-local-mode)
(evil-change-to-initial-state))
(goto-char (point-max)))
(with-current-buffer buffer (with-current-buffer buffer
(multi-term-internal) (with-silent-modifications
(setq +term--dedicated-buffer buffer)) (erase-buffer))
(when-let (window (doom|mark-buffer-as-real)
(display-buffer-in-side-window (multi-term-internal))
buffer `((window-height . ,multi-term-dedicated-window-height)))) (unless (window-live-p window)
(setq +term--dedicated-window window) (when-let (window
(select-window window)))))) (display-buffer-in-side-window
buffer `((window-height . ,multi-term-dedicated-window-height))))
(select-window window)))))))
;;;###autoload ;;;###autoload
(defun +term/here (arg) (defun +term/here (arg)

View file

@ -8,7 +8,10 @@ If prefix ARG is non-nil, recreate vterm buffer in the current project's root."
(interactive "P") (interactive "P")
(unless (fboundp 'module-load) (unless (fboundp 'module-load)
(user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm")) (user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm"))
(let ((buffer-name "*doom:vterm-popup*") (let ((buffer-name (format "*doom:vterm-popup:%s*"
(if (bound-and-true-p persp-mode)
(safe-persp-name (get-current-persp))
"main")))
confirm-kill-processes confirm-kill-processes
current-prefix-arg) current-prefix-arg)
(when arg (when arg
@ -29,6 +32,7 @@ If prefix ARG is non-nil, recreate vterm buffer in the current project's root."
(let* ((default-directory (or (doom-project-root) default-directory)) (let* ((default-directory (or (doom-project-root) default-directory))
(buffer (get-buffer-create buffer-name))) (buffer (get-buffer-create buffer-name)))
(with-current-buffer buffer (with-current-buffer buffer
(doom|mark-buffer-as-real)
(vterm-mode)) (vterm-mode))
(pop-to-buffer buffer))))) (pop-to-buffer buffer)))))