shackle-popup-hook => doom-popup-hook; add doom-popup-{protect,escapable}-modes
This commit is contained in:
parent
1db2ccf504
commit
51d16734ed
3 changed files with 70 additions and 46 deletions
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue