shackle-popup-hook => doom-popup-hook; add doom-popup-{protect,escapable}-modes

This commit is contained in:
Henrik Lissner 2016-05-21 18:54:23 -04:00
parent 1db2ccf504
commit 51d16734ed
3 changed files with 70 additions and 46 deletions

View file

@ -18,7 +18,9 @@
quickrun-replace-region quickrun-replace-region
helm-quickrun) helm-quickrun)
:init (add-hook 'quickrun/mode-hook 'linum-mode) :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 (use-package repl-toggle
:commands (rtog/toggle-repl rtog/add-repl) :commands (rtog/toggle-repl rtog/add-repl)

View file

@ -66,12 +66,23 @@
(defvar doom-popup-windows '() (defvar doom-popup-windows '()
"A list of windows that have been opened via shackle. Do not touch this!") "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 ;; 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) (advice-add 'shackle-display-buffer :after 'doom|run-popup-hooks)
(add-hook 'doom-popup-hook 'doom|popup-init) ; Keep track of popups
(add-hook 'shackle-popup-hook 'doom|popup-init) ; Keep track of popups (add-hook 'doom-popup-hook 'doom|hide-mode-line) ; No mode line in popups
(add-hook 'shackle-popup-hook 'doom|hide-mode-line) ; No mode line in popups
;; Prevents popups from messaging with windows-moving functions ;; Prevents popups from messaging with windows-moving functions
(defun doom*save-popups (orig-fun &rest args) (defun doom*save-popups (orig-fun &rest args)

View file

@ -27,14 +27,16 @@
;;;###autoload ;;;###autoload
(defun doom/popup-buffer (buffer &optional plist) (defun doom/popup-buffer (buffer &optional plist)
"Display BUFFER in a shackle popup." "Display BUFFER in a shackle popup."
(let ((buffer-name (if (stringp buffer) buffer (buffer-name buffer)))) (let* ((buffer-name (if (stringp buffer) buffer (buffer-name buffer)))
(shackle-display-buffer (get-buffer-create buffer-name) (buffer (get-buffer-create buffer-name)))
nil (or plist (shackle-match buffer-name))))) (shackle-display-buffer buffer nil (or plist (shackle-match buffer-name)))
(setq doom-last-popup buffer)))
;;;###autoload ;;;###autoload
(defun doom/popup-close (&optional window dont-kill dont-close-all) (defun doom/popup-close (&optional window dont-kill dont-close-all)
"Find and close the currently active popup (if available)." "Find and close the currently active popup (if available)."
(interactive) (interactive)
(let ((dont-kill (or doom-popup-protect dont-kill)))
(when (not window) (when (not window)
(if (doom/popup-p (selected-window)) (if (doom/popup-p (selected-window))
(setq window (selected-window)) (setq window (selected-window))
@ -51,9 +53,11 @@
(setq dont-kill t))) (setq dont-kill t)))
(doom/popup-remove window) (doom/popup-remove window)
(unless dont-kill (unless dont-kill
(let ((kill-buffer-query-functions (delq 'process-kill-buffer-query-function kill-buffer-query-functions))) (let ((kill-buffer-query-functions
(delq 'process-kill-buffer-query-function
kill-buffer-query-functions)))
(kill-buffer (window-buffer window)))) (kill-buffer (window-buffer window))))
(delete-window window))) (delete-window window))))
;;;###autoload ;;;###autoload
(defun doom/popup-close-all (&optional dont-kill-buffers) (defun doom/popup-close-all (&optional dont-kill-buffers)
@ -75,9 +79,11 @@
(defun doom/popup-last-buffer () (defun doom/popup-last-buffer ()
"Pop up the last popup buffer." "Pop up the last popup buffer."
(interactive) (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")) (error "No popup to restore"))
(doom/popup-buffer shackle-last-buffer)) (doom/popup-buffer doom-last-popup))
;;;###autoload ;;;###autoload
(defun doom/popup-messages () (defun doom/popup-messages ()
@ -88,22 +94,27 @@
(doom|hide-mode-line) (doom|hide-mode-line)
(goto-char (point-max)))) (goto-char (point-max))))
;;;###autoload
(defun doom|run-popup-hooks (&rest _)
(with-current-buffer shackle-last-buffer
(run-hooks 'doom-popup-hook)))
;;;###autoload ;;;###autoload
(defun doom|popup-init () (defun doom|popup-init ()
(add-to-list 'doom-popup-windows (get-buffer-window)) (add-to-list 'doom-popup-windows (get-buffer-window))
(local-set-key [escape escape] 'doom/popup-close) (local-set-key [escape escape] 'doom/popup-close)
(when (or (bound-and-true-p repl-toggle-mode) (let ((repl-p (bound-and-true-p repl-toggle-mode)))
(derived-mode-p 'tabulated-list-mode) (when (or repl-p
(memq major-mode '(messages-buffer-mode flycheck-error-list-mode-hook esup-mode))) (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)) (let ((map evil-normal-state-local-map))
(define-key map [escape] 'doom/popup-close) (define-key map [escape] 'doom/popup-close)
(define-key map (kbd "ESC") '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)))
(provide 'defuns-popups) (provide 'defuns-popups)
;;; defuns-popups.el ends here ;;; defuns-popups.el ends here