2017-01-28 02:00:38 -05:00
|
|
|
;;; popups.el
|
2017-02-06 00:25:54 -05:00
|
|
|
(provide 'doom-lib-popups)
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-popup-p (&optional window)
|
|
|
|
"Return t if WINDOW is a popup. Uses current window if WINDOW is omitted."
|
|
|
|
(let ((window (or window (selected-window))))
|
2017-02-22 21:54:10 -05:00
|
|
|
(and window (window-parameter window 'popup))))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
2017-02-03 19:21:33 -05:00
|
|
|
(defun doom-popup-buffer (buffer &rest plist)
|
2017-01-28 02:00:38 -05:00
|
|
|
"Display BUFFER in a shackle popup. See `shackle-rules' for possible rules."
|
2017-02-08 01:58:11 -05:00
|
|
|
(unless (bufferp buffer)
|
|
|
|
(error "%s is not a valid buffer" buffer))
|
|
|
|
(when (and plist (not (plist-member plist :align)))
|
|
|
|
(plist-put plist :align t))
|
|
|
|
(shackle-display-buffer
|
|
|
|
buffer
|
|
|
|
nil (or plist (shackle-match buffer))))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
2017-02-03 19:21:33 -05:00
|
|
|
(defun doom-popup-file (file &rest plist)
|
2017-01-28 02:00:38 -05:00
|
|
|
"Display FILE in a shackle popup, with PLIST rules. See `shackle-rules' for
|
|
|
|
possible rules."
|
|
|
|
(unless (file-exists-p file)
|
|
|
|
(user-error "Can't display file in popup, it doesn't exist: %s" file))
|
|
|
|
(doom-popup-buffer (find-file-noselect file t) plist))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-popup-windows ()
|
|
|
|
"Get a list of open poups."
|
2017-02-19 18:02:40 -05:00
|
|
|
(cl-remove-if-not 'doom-popup-p (window-list)))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/popup-restore ()
|
2017-02-22 21:54:10 -05:00
|
|
|
"Restore the last popups. If the buffers have been killed, and represented
|
|
|
|
real files, they will be restored. Special buffers or buffers with non-nil
|
|
|
|
:autokill properties will not be."
|
2017-01-28 02:00:38 -05:00
|
|
|
(interactive)
|
|
|
|
(unless doom-popup-history
|
|
|
|
(error "No popups to restore"))
|
|
|
|
(dolist (spec doom-popup-history)
|
|
|
|
(let ((buffer (get-buffer (car spec)))
|
2017-02-08 01:58:11 -05:00
|
|
|
(path (plist-get (cdr spec) :file))
|
|
|
|
(rules (plist-get (cdr spec) :rules)))
|
2017-01-28 02:00:38 -05:00
|
|
|
(when (and (not buffer) path)
|
|
|
|
(setq buffer (find-file-noselect path t)))
|
|
|
|
(when buffer
|
2017-02-08 01:58:11 -05:00
|
|
|
(apply 'doom-popup-buffer buffer rules))))
|
2017-01-28 02:00:38 -05:00
|
|
|
(setq doom-popup-history '()))
|
|
|
|
|
|
|
|
;;;###autoload
|
2017-02-20 00:10:34 -05:00
|
|
|
(defun doom/popup-toggle ()
|
|
|
|
"Toggle popups."
|
2017-01-28 02:00:38 -05:00
|
|
|
(interactive)
|
2017-02-20 00:10:34 -05:00
|
|
|
(when (doom-popup-p)
|
|
|
|
(if doom-popup-other-window
|
|
|
|
(select-window doom-popup-other-window)
|
|
|
|
(other-window 1)))
|
|
|
|
(if (doom-popup-windows)
|
|
|
|
(doom/popup-close-all)
|
|
|
|
(doom/popup-restore)))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/popup-close (&optional window)
|
|
|
|
"Find and close WINDOW if it's a popup. If WINDOW is omitted, it will use
|
|
|
|
`selected-window'. The contained buffer is buried."
|
|
|
|
(interactive)
|
|
|
|
(let ((window (or window (selected-window))))
|
2017-02-08 01:58:11 -05:00
|
|
|
(when (doom-popup-p window)
|
2017-01-28 02:00:38 -05:00
|
|
|
(delete-window window))))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/popup-close-all ()
|
2017-02-22 21:54:10 -05:00
|
|
|
"Closes all open popups."
|
2017-01-28 02:00:38 -05:00
|
|
|
(interactive)
|
2017-02-22 21:54:10 -05:00
|
|
|
(let ((orig-win (selected-window)))
|
|
|
|
(when-let (popups (doom-popup-windows))
|
|
|
|
(setq doom-popup-history (mapcar 'doom--popup-data popups))
|
2017-01-28 02:00:38 -05:00
|
|
|
(let (doom-popup-remember-history)
|
2017-02-08 01:58:11 -05:00
|
|
|
(mapc 'delete-window popups)))))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/popup-close-maybe ()
|
|
|
|
"Close the current popup *if* its window doesn't have a noesc parameter."
|
|
|
|
(interactive)
|
2017-02-08 01:58:11 -05:00
|
|
|
(let ((window (selected-window)))
|
2017-02-22 21:54:10 -05:00
|
|
|
(if (window-parameter window :noesc)
|
2017-02-08 01:58:11 -05:00
|
|
|
(call-interactively (if (featurep 'evil)
|
|
|
|
'evil-force-normal-state
|
|
|
|
'keyboard-escape-quit))
|
|
|
|
(delete-window window))))
|
2017-01-28 02:00:38 -05:00
|
|
|
|
2017-02-20 00:11:05 -05:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom/popup ()
|
|
|
|
"Display currently selected buffer in a popup window."
|
|
|
|
(doom-popup-buffer (current-buffer) :align t))
|
|
|
|
|
2017-01-28 02:00:38 -05:00
|
|
|
(defun doom--popup-data (window)
|
|
|
|
(let ((buffer (window-buffer window)))
|
|
|
|
`(,(buffer-name buffer)
|
|
|
|
:file ,(buffer-file-name buffer)
|
|
|
|
:rules ,(window-parameter window 'popup))))
|