2018-05-14 01:20:53 +02:00
|
|
|
;;; ui/popup/config.el -*- lexical-binding: t; -*-
|
2018-01-06 01:23:22 -05:00
|
|
|
|
2018-06-18 02:26:05 +02:00
|
|
|
(defconst +popup-window-parameters '(ttl quit select modeline popup)
|
2018-01-06 01:23:22 -05:00
|
|
|
"A list of custom parameters to be added to `window-persistent-parameters'.
|
2018-06-18 02:26:05 +02:00
|
|
|
Modifying this has no effect, unless done before ui/popup loads.")
|
|
|
|
|
|
|
|
(defvar +popup-default-display-buffer-actions
|
2019-07-22 04:46:14 +02:00
|
|
|
'(+popup-display-buffer-stacked-side-window-fn)
|
2018-01-09 16:40:44 -05:00
|
|
|
"The functions to use to display the popup buffer.")
|
|
|
|
|
2018-01-06 01:23:22 -05:00
|
|
|
(defvar +popup-default-alist
|
2018-06-18 02:26:05 +02:00
|
|
|
'((window-height . 0.16) ; remove later
|
2018-01-06 01:23:22 -05:00
|
|
|
(reusable-frames . visible))
|
|
|
|
"The default alist for `display-buffer-alist' rules.")
|
|
|
|
|
|
|
|
(defvar +popup-default-parameters
|
2018-06-18 02:26:05 +02:00
|
|
|
'((transient . t) ; remove later
|
|
|
|
(quit . t) ; remove later
|
|
|
|
(select . ignore) ; remove later
|
2018-06-16 11:45:09 +02:00
|
|
|
(no-other-window . t))
|
2018-01-07 00:08:30 -05:00
|
|
|
"The default window parameters.")
|
2018-01-06 01:23:22 -05:00
|
|
|
|
2018-06-17 02:01:11 +02:00
|
|
|
(defvar +popup-margin-width 1
|
|
|
|
"Size of the margins to give popup windows. Set this to nil to disable margin
|
|
|
|
adjustment.")
|
2018-01-06 01:23:22 -05:00
|
|
|
|
2018-06-18 15:02:24 +02:00
|
|
|
(defvar +popup--inhibit-transient nil)
|
|
|
|
(defvar +popup--inhibit-select nil)
|
|
|
|
(defvar +popup--old-display-buffer-alist nil)
|
|
|
|
(defvar +popup--remember-last t)
|
|
|
|
(defvar +popup--last nil)
|
|
|
|
(defvar-local +popup--timer nil)
|
|
|
|
|
2018-01-06 01:23:22 -05:00
|
|
|
|
2018-06-18 02:26:05 +02:00
|
|
|
;;
|
|
|
|
;; Global modes
|
|
|
|
|
|
|
|
(defvar +popup-mode-map (make-sparse-keymap)
|
|
|
|
"Active keymap in a session with the popup system enabled. See
|
|
|
|
`+popup-mode'.")
|
|
|
|
|
|
|
|
(defvar +popup-buffer-mode-map
|
|
|
|
(let ((map (make-sparse-keymap)))
|
2019-04-21 19:59:44 -04:00
|
|
|
(when (featurep! :editor evil)
|
2018-09-13 11:08:39 -04:00
|
|
|
;; For maximum escape coverage in emacs state buffers; this only works in
|
|
|
|
;; GUI Emacs, in tty Emacs use C-g instead
|
|
|
|
(define-key map [escape] #'doom/escape))
|
2018-06-18 02:26:05 +02:00
|
|
|
map)
|
|
|
|
"Active keymap in popup windows. See `+popup-buffer-mode'.")
|
|
|
|
|
|
|
|
(define-minor-mode +popup-mode
|
|
|
|
"Global minor mode representing Doom's popup management system."
|
|
|
|
:init-value nil
|
|
|
|
:global t
|
|
|
|
:keymap +popup-mode-map
|
|
|
|
(cond (+popup-mode
|
2019-07-26 19:57:13 +02:00
|
|
|
(add-hook 'doom-escape-hook #'+popup-close-on-escape-h 'append)
|
2018-06-18 02:26:05 +02:00
|
|
|
(setq +popup--old-display-buffer-alist display-buffer-alist
|
|
|
|
display-buffer-alist +popup--display-buffer-alist
|
|
|
|
window--sides-inhibit-check t)
|
|
|
|
(dolist (prop +popup-window-parameters)
|
|
|
|
(push (cons prop 'writable) window-persistent-parameters)))
|
|
|
|
(t
|
2019-07-22 04:46:14 +02:00
|
|
|
(remove-hook 'doom-escape-hook #'+popup-close-on-escape-h)
|
2018-06-18 02:26:05 +02:00
|
|
|
(setq display-buffer-alist +popup--old-display-buffer-alist
|
|
|
|
window--sides-inhibit-check nil)
|
2019-07-22 04:46:14 +02:00
|
|
|
(+popup-cleanup-rules-h)
|
2018-06-18 02:26:05 +02:00
|
|
|
(dolist (prop +popup-window-parameters)
|
2018-06-23 16:48:58 +02:00
|
|
|
(delq (assq prop window-persistent-parameters)
|
|
|
|
window-persistent-parameters)))))
|
2018-06-18 02:26:05 +02:00
|
|
|
|
|
|
|
(define-minor-mode +popup-buffer-mode
|
|
|
|
"Minor mode for individual popup windows.
|
|
|
|
|
|
|
|
It is enabled when a buffer is displayed in a popup window and disabled when
|
|
|
|
that window has been changed or closed."
|
|
|
|
:init-value nil
|
|
|
|
:keymap +popup-buffer-mode-map
|
|
|
|
(if (not +popup-buffer-mode)
|
2019-07-22 04:46:14 +02:00
|
|
|
(remove-hook 'after-change-major-mode-hook #'+popup-set-modeline-on-enable-h t)
|
2019-07-26 19:57:13 +02:00
|
|
|
(add-hook 'after-change-major-mode-hook #'+popup-set-modeline-on-enable-h
|
|
|
|
nil 'local)
|
2018-06-18 02:26:05 +02:00
|
|
|
(when (timerp +popup--timer)
|
2019-07-22 04:46:14 +02:00
|
|
|
(remove-hook 'kill-buffer-hook #'+popup-kill-buffer-hook-h t)
|
2018-06-18 02:26:05 +02:00
|
|
|
(cancel-timer +popup--timer)
|
|
|
|
(setq +popup--timer nil))))
|
|
|
|
|
|
|
|
(put '+popup-buffer-mode 'permanent-local t)
|
|
|
|
(put '+popup-buffer-mode 'permanent-local-hook t)
|
2019-07-22 04:46:14 +02:00
|
|
|
(put '+popup-set-modeline-on-enable-h 'permanent-local-hook t)
|
2018-06-18 02:26:05 +02:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;; Macros
|
|
|
|
|
|
|
|
(defmacro with-popup-rules! (rules &rest body)
|
|
|
|
"Evaluate BODY with popup RULES. RULES is a list of popup rules. Each rule
|
|
|
|
should match the arguments of `+popup-define' or the :popup setting."
|
|
|
|
(declare (indent defun))
|
|
|
|
`(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist)
|
|
|
|
display-buffer-alist)
|
2018-06-22 19:17:15 +02:00
|
|
|
(set-popup-rules! ,rules)
|
2018-06-18 02:26:05 +02:00
|
|
|
(when (bound-and-true-p +popup-mode)
|
|
|
|
(setq display-buffer-alist +popup--display-buffer-alist))
|
|
|
|
,@body))
|
|
|
|
|
|
|
|
(defmacro save-popups! (&rest body)
|
|
|
|
"Sets aside all popups before executing the original function, usually to
|
|
|
|
prevent the popup(s) from messing up the UI (or vice versa)."
|
|
|
|
`(let* ((in-popup-p (+popup-buffer-p))
|
|
|
|
(popups (+popup-windows))
|
|
|
|
(+popup--inhibit-transient t)
|
2020-04-08 15:29:29 -04:00
|
|
|
buffer-list-update-hook
|
2018-06-18 02:26:05 +02:00
|
|
|
+popup--last)
|
|
|
|
(dolist (p popups)
|
|
|
|
(+popup/close p 'force))
|
|
|
|
(unwind-protect
|
|
|
|
(progn ,@body)
|
|
|
|
(when popups
|
|
|
|
(let ((origin (selected-window)))
|
|
|
|
(+popup/restore)
|
|
|
|
(unless in-popup-p
|
|
|
|
(select-window origin)))))))
|
|
|
|
|
|
|
|
|
2018-01-06 01:23:22 -05:00
|
|
|
;;
|
|
|
|
;; Default popup rules & bootstrap
|
|
|
|
|
2018-06-15 02:58:12 +02:00
|
|
|
(set-popup-rules!
|
|
|
|
(when (featurep! +all)
|
2018-06-18 02:26:05 +02:00
|
|
|
'(("^\\*" :slot 1 :vslot -1 :select t)
|
|
|
|
("^ \\*" :slot 1 :vslot -1 :size +popup-shrink-to-fit)))
|
2018-06-15 02:58:12 +02:00
|
|
|
(when (featurep! +defaults)
|
2019-11-01 22:31:05 -04:00
|
|
|
'(("^\\*Completions" :ignore t)
|
2020-02-11 13:36:03 -05:00
|
|
|
("^\\*Local variables\\*$"
|
|
|
|
:vslot -1 :slot 1 :size +popup-shrink-to-fit)
|
2019-12-15 00:13:09 +07:00
|
|
|
("^\\*\\(?:[Cc]ompil\\(?:ation\\|e-Log\\)\\|Messages\\)"
|
2019-05-15 12:30:41 -04:00
|
|
|
:vslot -2 :size 0.3 :autosave t :quit t :ttl nil)
|
2019-05-15 15:25:03 -04:00
|
|
|
("^\\*\\(?:doom \\|Pp E\\)" ; transient buffers (no interaction required)
|
2019-05-15 20:29:46 -04:00
|
|
|
:vslot -3 :size +popup-shrink-to-fit :autosave t :select ignore :quit t :ttl 0)
|
2019-05-15 12:30:41 -04:00
|
|
|
("^\\*doom:" ; editing buffers (interaction required)
|
|
|
|
:vslot -4 :size 0.35 :autosave t :select t :modeline t :quit nil :ttl t)
|
2019-12-26 16:49:03 -05:00
|
|
|
("^\\*doom:\\(?:v?term\\|e?shell\\)-popup" ; editing buffers (interaction required)
|
|
|
|
:vslot -5 :size 0.35 :select t :modeline nil :quit nil :ttl nil)
|
2019-07-27 19:40:31 +02:00
|
|
|
("^\\*\\(?:Wo\\)?Man "
|
2019-06-27 01:27:40 +02:00
|
|
|
:vslot -6 :size 0.45 :select t :quit t :ttl 0)
|
2019-07-09 19:55:37 +02:00
|
|
|
("^\\*Calc"
|
|
|
|
:vslot -7 :side bottom :size 0.4 :select t :quit nil :ttl 0)
|
2018-06-15 02:58:12 +02:00
|
|
|
("^\\*Customize"
|
2020-06-13 16:20:45 -04:00
|
|
|
:slot 2 :side right :size 0.5 :select t :quit nil)
|
2018-06-15 02:58:12 +02:00
|
|
|
("^ \\*undo-tree\\*"
|
2018-06-18 02:26:05 +02:00
|
|
|
:slot 2 :side left :size 20 :select t :quit t)
|
2018-06-15 02:58:12 +02:00
|
|
|
;; `help-mode', `helpful-mode'
|
2021-03-12 17:40:47 -05:00
|
|
|
("^\\*\\([Hh]elp\\|Apropos\\)"
|
2019-09-22 11:58:16 -04:00
|
|
|
:slot 2 :vslot -8 :size 0.35 :select t)
|
2019-05-15 12:30:41 -04:00
|
|
|
("^\\*eww\\*" ; `eww' (and used by dash docsets)
|
2018-09-28 21:13:52 -04:00
|
|
|
:vslot -11 :size 0.35 :select t)
|
2019-05-15 12:30:41 -04:00
|
|
|
("^\\*info\\*$" ; `Info-mode'
|
2018-06-18 02:26:05 +02:00
|
|
|
:slot 2 :vslot 2 :size 0.45 :select t)))
|
2019-07-22 04:46:14 +02:00
|
|
|
'(("^\\*Warnings" :vslot 99 :size 0.25)
|
|
|
|
("^\\*Backtrace" :vslot 99 :size 0.4 :quit nil)
|
2019-03-13 19:20:37 -04:00
|
|
|
("^\\*CPU-Profiler-Report " :side bottom :vslot 100 :slot 1 :height 0.4 :width 0.5 :quit nil)
|
2019-10-28 12:20:35 +09:00
|
|
|
("^\\*Memory-Profiler-Report " :side bottom :vslot 100 :slot 2 :height 0.4 :width 0.5 :quit nil)
|
2020-10-14 21:17:22 +03:00
|
|
|
("^\\*Process List\\*" :side bottom :vslot 101 :size 0.25 :select t :quit t)
|
|
|
|
("^\\*\\(?:Proced\\|timer-list\\|Abbrevs\\|Output\\|Occur\\|unsent mail\\)\\*" :ignore t)))
|
2018-06-18 02:26:05 +02:00
|
|
|
|
2019-07-26 19:57:13 +02:00
|
|
|
(add-hook 'doom-init-ui-hook #'+popup-mode 'append)
|
2018-02-01 23:17:18 -05:00
|
|
|
|
2018-03-18 02:37:10 -04:00
|
|
|
(add-hook! '+popup-buffer-mode-hook
|
2019-07-26 19:57:13 +02:00
|
|
|
#'+popup-adjust-fringes-h
|
|
|
|
#'+popup-adjust-margins-h
|
|
|
|
#'+popup-set-modeline-on-enable-h
|
|
|
|
#'+popup-unset-modeline-on-disable-h)
|
2018-01-06 01:23:22 -05:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
2020-12-14 15:48:29 -05:00
|
|
|
;;; Hacks
|
2018-01-06 01:23:22 -05:00
|
|
|
|
2018-06-18 02:26:05 +02:00
|
|
|
(load! "+hacks")
|