From 51d16734edeee2f014f555e0752aedd11c159ea5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 May 2016 18:54:23 -0400 Subject: [PATCH] shackle-popup-hook => doom-popup-hook; add doom-popup-{protect,escapable}-modes --- core/core-eval.el | 4 +- core/core-popup.el | 17 +++++-- core/defuns/defuns-popups.el | 95 ++++++++++++++++++++---------------- 3 files changed, 70 insertions(+), 46 deletions(-) diff --git a/core/core-eval.el b/core/core-eval.el index ae0cf6338..f77e40107 100644 --- a/core/core-eval.el +++ b/core/core-eval.el @@ -18,7 +18,9 @@ quickrun-replace-region helm-quickrun) :init (add-hook 'quickrun/mode-hook 'linum-mode) - :config (setq quickrun-focus-p nil)) + :config + (setq quickrun-focus-p nil) + (push 'quickrun/mode doom-popup-protect-modes)) (use-package repl-toggle :commands (rtog/toggle-repl rtog/add-repl) diff --git a/core/core-popup.el b/core/core-popup.el index b5342a237..61913fcd3 100644 --- a/core/core-popup.el +++ b/core/core-popup.el @@ -66,12 +66,23 @@ (defvar doom-popup-windows '() "A list of windows that have been opened via shackle. Do not touch this!") + (defvar-local doom-popup-protect nil + "If non-nil, this popup buffer won't be killed when closed.") + (defvar doom-last-popup nil + "The last (important) popup buffer.") + + (defvar doom-popup-escapable-modes + '(messages-buffer-mode esup-mode help-mode tabulated-list-mode) + "A list of modes that can be closed with a single ESC.") + (defvar doom-popup-protect-modes + '(messages-buffer-mode esup-mode help-mode tabulated-list-mode comint-mode) + "A list of modes that shouldn't be killed and can be revived.") ;; There is no shackle-popup hook, so I hacked one in + (defvar doom-popup-hook '() "Hook run whenever a popup is opened.") (advice-add 'shackle-display-buffer :after 'doom|run-popup-hooks) - - (add-hook 'shackle-popup-hook 'doom|popup-init) ; Keep track of popups - (add-hook 'shackle-popup-hook 'doom|hide-mode-line) ; No mode line in popups + (add-hook 'doom-popup-hook 'doom|popup-init) ; Keep track of popups + (add-hook 'doom-popup-hook 'doom|hide-mode-line) ; No mode line in popups ;; Prevents popups from messaging with windows-moving functions (defun doom*save-popups (orig-fun &rest args) diff --git a/core/defuns/defuns-popups.el b/core/defuns/defuns-popups.el index af5474676..3fc474678 100644 --- a/core/defuns/defuns-popups.el +++ b/core/defuns/defuns-popups.el @@ -27,33 +27,37 @@ ;;;###autoload (defun doom/popup-buffer (buffer &optional plist) "Display BUFFER in a shackle popup." - (let ((buffer-name (if (stringp buffer) buffer (buffer-name buffer)))) - (shackle-display-buffer (get-buffer-create buffer-name) - nil (or plist (shackle-match buffer-name))))) + (let* ((buffer-name (if (stringp buffer) buffer (buffer-name buffer))) + (buffer (get-buffer-create buffer-name))) + (shackle-display-buffer buffer nil (or plist (shackle-match buffer-name))) + (setq doom-last-popup buffer))) ;;;###autoload (defun doom/popup-close (&optional window dont-kill dont-close-all) "Find and close the currently active popup (if available)." (interactive) - (when (not window) - (if (doom/popup-p (selected-window)) - (setq window (selected-window)) - (unless dont-close-all - (doom/popup-close-all dont-kill)))) - (when (and window (window-live-p window)) - ;; REPL buffer - (cond ((and (derived-mode-p 'comint-mode) - (featurep 'repl-toggle) - repl-toggle-mode) - (setq rtog/--last-buffer nil)) - ((eq major-mode 'messages-buffer-mode) - (bury-buffer) - (setq dont-kill t))) - (doom/popup-remove window) - (unless dont-kill - (let ((kill-buffer-query-functions (delq 'process-kill-buffer-query-function kill-buffer-query-functions))) - (kill-buffer (window-buffer window)))) - (delete-window window))) + (let ((dont-kill (or doom-popup-protect dont-kill))) + (when (not window) + (if (doom/popup-p (selected-window)) + (setq window (selected-window)) + (unless dont-close-all + (doom/popup-close-all dont-kill)))) + (when (and window (window-live-p window)) + ;; REPL buffer + (cond ((and (derived-mode-p 'comint-mode) + (featurep 'repl-toggle) + repl-toggle-mode) + (setq rtog/--last-buffer nil)) + ((eq major-mode 'messages-buffer-mode) + (bury-buffer) + (setq dont-kill t))) + (doom/popup-remove window) + (unless dont-kill + (let ((kill-buffer-query-functions + (delq 'process-kill-buffer-query-function + kill-buffer-query-functions))) + (kill-buffer (window-buffer window)))) + (delete-window window)))) ;;;###autoload (defun doom/popup-close-all (&optional dont-kill-buffers) @@ -75,35 +79,42 @@ (defun doom/popup-last-buffer () "Pop up the last popup buffer." (interactive) - (unless shackle-last-buffer + (unless (and doom-last-popup + (buffer-live-p doom-last-popup)) + (setq doom-last-popup nil) (error "No popup to restore")) - (doom/popup-buffer shackle-last-buffer)) + (doom/popup-buffer doom-last-popup)) ;;;###autoload (defun doom/popup-messages () - "Pop up the *Messages* buffer." - (interactive) - (doom/popup-buffer "*Messages*") - (with-current-buffer "*Messages*" - (doom|hide-mode-line) - (goto-char (point-max)))) + "Pop up the *Messages* buffer." + (interactive) + (doom/popup-buffer "*Messages*") + (with-current-buffer "*Messages*" + (doom|hide-mode-line) + (goto-char (point-max)))) + +;;;###autoload +(defun doom|run-popup-hooks (&rest _) + (with-current-buffer shackle-last-buffer + (run-hooks 'doom-popup-hook))) ;;;###autoload (defun doom|popup-init () (add-to-list 'doom-popup-windows (get-buffer-window)) (local-set-key [escape escape] 'doom/popup-close) - (when (or (bound-and-true-p repl-toggle-mode) - (derived-mode-p 'tabulated-list-mode) - (memq major-mode '(messages-buffer-mode flycheck-error-list-mode-hook esup-mode))) - (let ((map evil-normal-state-local-map)) - (define-key map [escape] 'doom/popup-close) - (define-key map (kbd "ESC") 'doom/popup-close)))) - -(defvar shackle-popup-hook '() "Hook run whenever a popup is opened.") -;;;###autoload -(defun doom|run-popup-hooks (&rest _) - (with-current-buffer shackle-last-buffer - (run-hooks 'shackle-popup-hook))) + (let ((repl-p (bound-and-true-p repl-toggle-mode))) + (when (or repl-p + (memq major-mode doom-popup-protect-modes) + (apply #'derived-mode-p doom-popup-protect-modes)) + (setq-local doom-popup-protect t) + (setq doom-last-popup (current-buffer))) + (when (or repl-p + (memq major-mode doom-popup-protect-modes) + (apply #'derived-mode-p doom-popup-escapable-modes)) + (let ((map evil-normal-state-local-map)) + (define-key map [escape] 'doom/popup-close) + (define-key map (kbd "ESC") 'doom/popup-close))))) (provide 'defuns-popups) ;;; defuns-popups.el ends here