diff --git a/init.example.el b/init.example.el index 5b90d92be..83871ee59 100644 --- a/init.example.el +++ b/init.example.el @@ -65,6 +65,7 @@ ;tabbar ; FIXME an (incomplete) tab bar for Emacs vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows + posframe ; use child frames where possible (Emacs 26+ only) :tools dired ; making dired pretty [functional] diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el new file mode 100644 index 000000000..45ecab756 --- /dev/null +++ b/modules/ui/posframe/autoload.el @@ -0,0 +1,13 @@ +;;; ui/posframe/autoloads.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +posframe-ivy-display-at-frame-center-near-bottom (str) + "TODO" + (ivy-posframe--display str #'+posframe-poshandler-frame-center-near-bottom)) + +;;;###autoload +(defun +posframe-poshandler-frame-center-near-bottom (info) + "TODO" + (let ((pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (* (cdr pos) 1.60))))) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el new file mode 100644 index 000000000..a92eca480 --- /dev/null +++ b/modules/ui/posframe/config.el @@ -0,0 +1,55 @@ +;;; ui/posframe/config.el -*- lexical-binding: t; -*- + +(when (version< emacs-version "26") + (error "The :ui posframe module requires Emacs 26+")) + + +(def-package! posframe + :defer t + :config + (setq posframe-inhibit-double-buffering t)) + + +(def-package! company-childframe + :when (featurep! :completion company) + :after company + :config + (company-childframe-mode 1) + (after! desktop + (push '(company-childframe-mode . nil) desktop-minor-mode-table))) + + +(def-package! ivy-posframe + :when (featurep! :completion ivy) + :after ivy + :preface + ;; This function searches the entire `obarray' just to populate + ;; `ivy-display-functions-props'. There are 15k entries in mine! This is + ;; wasteful, so... + (advice-add #'ivy-posframe-setup :override #'ignore) + :config + ;; ... let's do it manually + (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left + 'ivy-posframe-display-at-frame-center + 'ivy-posframe-display-at-point + 'ivy-posframe-display-at-frame-bottom-window-center + 'ivy-posframe-display + 'ivy-posframe-display-at-window-bottom-left + 'ivy-posframe-display-at-window-center + '+posframe-ivy-display-at-frame-center-near-bottom)) + (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) + + (push '(t . +posframe-ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) + (push '(swiper . nil) ivy-display-functions-alist) + (ivy-posframe-enable) + + (setq ivy-height 16 + ivy-fixed-height-minibuffer nil + ivy-posframe-parameters `((min-width . 90) + (min-height . ,ivy-height) + (internal-border-width . 10))) + (unless ivy-posframe-font + (setq ivy-posframe-font (font-spec :family (font-get doom-font :family) :size 18)))) + + +;; TODO helm-posframe? diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el new file mode 100644 index 000000000..5cf3c37dc --- /dev/null +++ b/modules/ui/posframe/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/posframe/packages.el + +(when (featurep! :completion company) + (package! company-childframe)) +(when (featurep! :completion ivy) + (package! ivy-posframe))