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,33 +27,37 @@
;;;###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)
(when (not window) (let ((dont-kill (or doom-popup-protect dont-kill)))
(if (doom/popup-p (selected-window)) (when (not window)
(setq window (selected-window)) (if (doom/popup-p (selected-window))
(unless dont-close-all (setq window (selected-window))
(doom/popup-close-all dont-kill)))) (unless dont-close-all
(when (and window (window-live-p window)) (doom/popup-close-all dont-kill))))
;; REPL buffer (when (and window (window-live-p window))
(cond ((and (derived-mode-p 'comint-mode) ;; REPL buffer
(featurep 'repl-toggle) (cond ((and (derived-mode-p 'comint-mode)
repl-toggle-mode) (featurep 'repl-toggle)
(setq rtog/--last-buffer nil)) repl-toggle-mode)
((eq major-mode 'messages-buffer-mode) (setq rtog/--last-buffer nil))
(bury-buffer) ((eq major-mode 'messages-buffer-mode)
(setq dont-kill t))) (bury-buffer)
(doom/popup-remove window) (setq dont-kill t)))
(unless dont-kill (doom/popup-remove window)
(let ((kill-buffer-query-functions (delq 'process-kill-buffer-query-function kill-buffer-query-functions))) (unless dont-kill
(kill-buffer (window-buffer window)))) (let ((kill-buffer-query-functions
(delete-window window))) (delq 'process-kill-buffer-query-function
kill-buffer-query-functions)))
(kill-buffer (window-buffer 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,35 +79,42 @@
(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 ()
"Pop up the *Messages* buffer." "Pop up the *Messages* buffer."
(interactive) (interactive)
(doom/popup-buffer "*Messages*") (doom/popup-buffer "*Messages*")
(with-current-buffer "*Messages*" (with-current-buffer "*Messages*"
(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)
(let ((map evil-normal-state-local-map)) (apply #'derived-mode-p doom-popup-protect-modes))
(define-key map [escape] 'doom/popup-close) (setq-local doom-popup-protect t)
(define-key map (kbd "ESC") 'doom/popup-close)))) (setq doom-last-popup (current-buffer)))
(when (or repl-p
(defvar shackle-popup-hook '() "Hook run whenever a popup is opened.") (memq major-mode doom-popup-protect-modes)
;;;###autoload (apply #'derived-mode-p doom-popup-escapable-modes))
(defun doom|run-popup-hooks (&rest _) (let ((map evil-normal-state-local-map))
(with-current-buffer shackle-last-buffer (define-key map [escape] 'doom/popup-close)
(run-hooks 'shackle-popup-hook))) (define-key map (kbd "ESC") 'doom/popup-close)))))
(provide 'defuns-popups) (provide 'defuns-popups)
;;; defuns-popups.el ends here ;;; defuns-popups.el ends here