From 8e9f6e633407738bbcbdcd353e880a2a2ec6d5b4 Mon Sep 17 00:00:00 2001 From: Magic_RB Date: Sat, 16 Sep 2023 19:34:05 +0200 Subject: [PATCH] Refactor ~emacs-auxmenu~ to be a tad more general Signed-off-by: Magic_RB --- emacs-lisp/emacs_rofi.org | 51 +++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/emacs-lisp/emacs_rofi.org b/emacs-lisp/emacs_rofi.org index fa574bc..8c820e5 100644 --- a/emacs-lisp/emacs_rofi.org +++ b/emacs-lisp/emacs_rofi.org @@ -7,38 +7,43 @@ It is possible to make a fake rofi, from emacs ~completing-read~. This file facilitates that. First we define some LISP functions. #+begin_src emacs-lisp - (defun completing-read-frame-popup-file (prompt file width height &rest args) + (defun completing-read-frame-popup-file (prompt file display width height &rest args) "" (with-temp-buffer (insert-file-contents file) - (message "%s" (string-lines (buffer-string))) - (apply #'completing-read-frame-popup prompt (string-lines (substring-no-properties (buffer-string))) args))) + (apply #'auxmenu-popup-frame prompt (string-lines (substring-no-properties (buffer-string))) display width height args))) #+end_src #+begin_src emacs-lisp - (defvar completing-read-frame nil) + (defvar auxmenu-frame-alist nil) - (defun completing-read-frame-popup (prompt collection &rest args) - "" - (unless completing-read-frame - (setq completing-read-frame - (make-frame `((minibuffer . only) - (name . "emacs-completing-read-float") - (unsplittable . t) - (no-other-frame . t) - (width . ,width) - (height . ,height) - (left . 0.5) - (top . 0.5)))) - (make-frame-invisible completing-read-frame)) - (make-frame-visible completing-read-frame) - (raise-frame completing-read-frame) - (with-selected-frame completing-read-frame + (defun auxmenu-popup-frame (prompt collection display width height &rest args) + "" + (let ((frame (alist-get display auxmenu-frame-alist))) + (when (equal frame nil) + (when (equal display nil) + (error "Must specify display")) + + (push `(,display . ,(make-frame + `((minibuffer . only) + (name . "emacs-completing-read-float") + (unsplittable . t) + (no-other-frame . t) + (width . ,width) + (height . ,height) + (display . ,display) + (left . 0.5) + (top . 0.5)))) + auxmenu-frame-alist) + (setq frame (alist-get display auxmenu-frame-alist))) + (make-frame-visible frame) + (raise-frame frame) + (with-selected-frame frame (unwind-protect (let ((selection (apply #'completing-read prompt collection args))) - (make-frame-invisible completing-read-frame) + (make-frame-invisible frame) selection) - (make-frame-invisible completing-read-frame)))) + (make-frame-invisible frame))))) #+end_src Next a bash helper is needed. @@ -48,7 +53,7 @@ Next a bash helper is needed. { tmp=$(mktemp) tee > $tmp - emacs -Q --batch --eval $"(progn (require 'server) (princ (format \"%s\\n\" (server-eval-at \"server\" '(completing-read-frame-popup-file \"$1\" \"$tmp\" $2 $3)))))" + emacs -Q --batch --eval $"(progn (require 'server) (princ (format \"%s\\n\" (server-eval-at \"server\" '(completing-read-frame-popup-file \"$1\" \"$tmp\" \"$DISPLAY\" $2 $3)))))" rm $tmp } #+end_src