doomemacs/modules/ui/popup
Henrik Lissner 4ea4754162 Add commands for using bin/doom from inside Emacs
This is experimental. I'd eventually like users to be able to management
Doom from inside Emacs, if they desire. This may be the only way to have
a decent user experience on Windows, for that matter.

Also adds a popup rule for it.
2018-09-28 21:13:27 -04:00
..
autoload Fix race condition in popup load 2018-09-19 21:43:56 +01:00
test Forward-require dependencies in tests 2018-08-26 00:20:16 +02:00
+hacks.el Fix helm TAB completion from org-insert-link #897 #829 2018-09-18 21:44:59 -04:00
config.el Add commands for using bin/doom from inside Emacs 2018-09-28 21:13:27 -04:00
README.org updated readme to use set-popup-rules! 2018-08-21 07:21:25 -05:00

:feature popup

This module provides a highly customizable popup window management system.

Not all windows are created equally. Some are less important. Some I want gone once they have served their purpose, like code output or a help buffer. Others I want to stick around, like a scratch buffer or org-capture popup.

More than that, popups ought to be be the second class citizens of my editor; spawned off to the side, discarded with the simple push of a button (Escape/C-g), and easily restored if I want to see them again. Of course, this system should clean up after itself and kill off buffers I mark as transient.

Configuration

set-popup-rules!

This module has one setting for defining your own rules for popups:

(set-popup-rules! &rest RULESETS)
  • RULESETS consist of a function or regexp string that matches the buffer's name, and a list of settings. See display-buffer's, display-window-parameters's, and +popup-window-parameters's documentation for what parameters are supported.

Rules are added to display-buffer-alist, which instructs display-buffer calls on how to set up windows for buffers that meet certain conditions.

The switch-to-buffer command (and its switch-to-buffer-* variants) are not affected by display-buffer-alist.

Here are a couple example rules:

(set-popup-rules!
 '(("^ \\*" :slot -1) ; fallback rule for special buffers
   ("^\\*" :select t)
   ("^\\*Completions" :slot -1 :transient 0)
   ("^\\*\\(?:scratch\\|Messages\\)" :transient t)
   ("^\\*Help" :slot -1 :size 0.2 :select t)
   ("^\\*doom:"
    :size . 0.35 :select t :modeline t :quit t :transient t)))

Omitted parameters in a set-popup-rules! will use the defaults set in +popup-default-alist and +popup-default-parameters.

Disabling aggressive mode-line hiding in popups

There are two ways to go about this. You can turn on modelines by changing the default 'modeline window parameter in +popup-default-parameters:

;; put in private/$USER/config.el
(map-put +popup-default-parameters 'modeline t)

This will ensure all popups have a modeline by default, but allows you to override this on a per-popup basis.

Alternatively, you can disable modeline-hiding entirely:

;; put in private/$USER/config.el
(remove-hook '+popup-buffer-mode-hook '+popup|set-modeline)

Appendix

Commands

  • +popup/other (aliased to other-popup, bound to C-x p)
  • +popup/toggle
  • +popup/close
  • +popup/close-all
  • +popup/toggle
  • +popup/restore
  • +popup/raise

Library

  • Functions

    • +popup-window-p WINDOW
    • +popup-buffer-p BUFFER
    • +popup-buffer BUFFER &optional ALIST
    • +popup-parameter PARAMETER &optional WINDOW
    • +popup-parameter-fn PARAMETER &optional WINDOW
    • +popup-windows
  • Macros

    • without-popups!
    • save-popups!
  • Hooks

    • +popup|adjust-fringes
    • +popup|set-modeline
    • +popup|close-on-escape
    • +popup|cleanup-rules
  • Minor modes

    • +popup-mode
    • +popup-buffer-mode

Hacks

  • help-mode has been advised to follow file links in the buffer you were in before entering the popup, rather than in a new window.
  • wgrep buffers are advised to close themselves when aborting or committing changes.
  • persp-mode is advised to restore popup windows when loading a session from file.
  • Interactive calls to windmove-* commands (used by evil-window-* commands) will ignore the no-other-window window parameter, allowing you to switch to popup windows as if they're ordinary windows.
  • balance-windows has been advised to close popups while it does its business, then restores them afterwards.
  • neotree advises balance-windows, which causes major slow-downs when paired with our balance-window advice, so we removes neotree's advice.
  • org-mode is an ongoing (and huge) effort. It has a scorched-earth window management system I'm not fond of. ie. it kills all windows and monopolizes the frame. On top of that, it really likes to use switch-to-buffer for most of its buffer management, which completely bypasses display-buffer-alist.