Refactor +vterm/toggle and +vterm/here

This commit is contained in:
Saúl Germán Gutiérrez Calderón 2021-05-11 17:05:23 -05:00
parent fe9f8e785f
commit 582759e43b

View file

@ -6,41 +6,36 @@
If prefix ARG is non-nil, recreate vterm buffer in the current project's root." If prefix ARG is non-nil, recreate vterm buffer in the current project's root."
(interactive "P") (interactive "P")
(unless (fboundp 'module-load) (+vterm--configure-project-root-and-display
(user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm")) arg
(let ((buffer-name (lambda()
(format "*doom:vterm-popup:%s*" (let ((buffer-name
(if (bound-and-true-p persp-mode) (format "*doom:vterm-popup:%s*"
(safe-persp-name (get-current-persp)) (if (bound-and-true-p persp-mode)
"main"))) (safe-persp-name (get-current-persp))
confirm-kill-processes "main")))
current-prefix-arg) confirm-kill-processes
(when arg current-prefix-arg)
(let ((buffer (get-buffer buffer-name)) (when arg
(window (get-buffer-window buffer-name))) (let ((buffer (get-buffer buffer-name))
(when (buffer-live-p buffer) (window (get-buffer-window buffer-name)))
(kill-buffer buffer)) (when (buffer-live-p buffer)
(when (window-live-p window) (kill-buffer buffer))
(delete-window window)))) (when (window-live-p window)
(if-let (win (get-buffer-window buffer-name)) (delete-window window))))
(if (eq (selected-window) win) (if-let (win (get-buffer-window buffer-name))
(delete-window win) (if (eq (selected-window) win)
(select-window win) (delete-window win)
(when (bound-and-true-p evil-local-mode) (select-window win)
(evil-change-to-initial-state)) (when (bound-and-true-p evil-local-mode)
(goto-char (point-max))) (evil-change-to-initial-state))
(setenv "PROOT" (or (doom-project-root) default-directory)) (goto-char (point-max)))
(let* ((project-root (or (doom-project-root) default-directory)) (let ((buffer (get-buffer-create buffer-name)))
(default-directory (with-current-buffer buffer
(if arg (unless (eq major-mode 'vterm-mode)
default-directory (vterm-mode))
project-root))) (+vterm--change-directory-if-remote))
(let ((buffer (get-buffer-create buffer-name))) (pop-to-buffer buffer)))))))
(with-current-buffer buffer
(unless (eq major-mode 'vterm-mode)
(vterm-mode))
(+vterm--change-directory-if-remote))
(pop-to-buffer buffer))))))
;;;###autoload ;;;###autoload
(defun +vterm/here (arg) (defun +vterm/here (arg)
@ -48,20 +43,29 @@ If prefix ARG is non-nil, recreate vterm buffer in the current project's root."
If prefix ARG is non-nil, cd into `default-directory' instead of project root." If prefix ARG is non-nil, cd into `default-directory' instead of project root."
(interactive "P") (interactive "P")
(+vterm--configure-project-root-and-display
arg
(lambda()
(require 'vterm)
;; This hack forces vterm to redraw, fixing strange artefacting in the tty.
(save-window-excursion
(pop-to-buffer "*scratch*"))
(let (display-buffer-alist)
(vterm vterm-buffer-name)))))
(defun +vterm--configure-project-root-and-display (arg display-fn)
"Sets the environment variable PROOT and displays a terminal using `display-fn`.
If prefix ARG is non-nil, cd into `default-directory' instead of project root."
(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"))
(require 'vterm)
;; This hack forces vterm to redraw, fixing strange artefacting in the tty.
(save-window-excursion
(pop-to-buffer "*scratch*"))
(let* ((project-root (or (doom-project-root) default-directory)) (let* ((project-root (or (doom-project-root) default-directory))
(default-directory (default-directory
(if arg (if arg
default-directory default-directory
project-root)) project-root)))
display-buffer-alist)
(setenv "PROOT" project-root) (setenv "PROOT" project-root)
(vterm vterm-buffer-name) (funcall display-fn)
(+vterm--change-directory-if-remote))) (+vterm--change-directory-if-remote)))
(defun +vterm--change-directory-if-remote () (defun +vterm--change-directory-if-remote ()