Minibuffer Popup au Centre
Voici une façon de faire exactement ce que vous avez demandé: afficher le mini-tampon au centre de l'écran .
- Avoir un cadre séparé pour le mini-tampon
- Positionnez-le au centre
- Relevez ce cadre chaque fois que le mini-tampon gagne en concentration.
C'est relativement facile à réaliser et c'est ce que vous obtiendrez avec le
oneonone.el
package (comme le souligne @Drew). Le problème avec cette approche, c'est que le mini-tampon est également utilisé pour les messages, donc le garder caché n'est pas quelque chose de très pratique. Ne pas s'inquiéter! J'ai trouvé une autre solution.
- Ayez un deuxième mini-tampon affiché sur un cadre séparé.
- Positionnez-le au centre.
- Utilisez le deuxième cadre pour les commandes interactives, tandis que le (premier) mini-tampon d'origine est utilisé pour faire écho aux messages.
la mise en oeuvre
Pour l'implémenter, nous devons créer le cadre du mini-tampon au démarrage d'emacs.
(defvar endless/popup-frame-parameters
'((name . "MINIBUFFER")
(minibuffer . only)
(height . 1)
;; Ajust this one to your preference.
(top . 200))
"Parameters for the minibuffer popup frame.")
(defvar endless/minibuffer-frame
(let ((mf (make-frame endless/popup-frame-parameters)))
(iconify-frame mf) mf)
"Frame holding the extra minibuffer.")
(defvar endless/minibuffer-window
(car (window-list endless/minibuffer-frame t))
"")
Ensuite, nous corrigeons read-from-minibuffer
pour utiliser ce deuxième mini-tampon, au lieu du mini-tampon du cadre d'origine.
(defmacro with-popup-minibuffer (&rest body)
"Execute BODY using a popup minibuffer."
(let ((frame-symbol (make-symbol "selected-frame")))
`(let* ((,frame-symbol (selected-frame)))
(unwind-protect
(progn
(make-frame-visible endless/minibuffer-frame)
(when (fboundp 'point-screen-height)
(set-frame-parameter
endless/minibuffer-frame
'top (point-screen-height)))
(select-frame-set-input-focus endless/minibuffer-frame 'norecord)
,@body)
(select-frame-set-input-focus ,frame-symbol)))))
(defun use-popup-minibuffer (function)
"Rebind FUNCTION so that it uses a popup minibuffer."
(let* ((back-symb (intern (format "endless/backup-%s" function)))
(func-symb (intern (format "endless/%s-with-popup-minibuffer"
function)))
(defs `(progn
(defvar ,back-symb (symbol-function ',function))
(defun ,func-symb (&rest rest)
,(format "Call `%s' with a poupup minibuffer." function)
,@(list (interactive-form function))
(with-popup-minibuffer
(apply ,back-symb rest))))))
(message "%s" defs)
(when (and (boundp back-symb) (eval back-symb))
(error "`%s' already defined! Can't override twice" back-symb))
(eval defs)
(setf (symbol-function function) func-symb)))
;;; Try at own risk.
(use-popup-minibuffer 'read-from-minibuffer)
;;; This will revert the effect.
;; (setf (symbol-function #'read-from-minibuffer) endless/backup-read-from-minibuffer)
;; (setq endless/backup-read-from-minibuffer nil)
Cela pourrait ne pas fonctionner avec absolument tout, mais il a travaillé sur tout ce que j'ai essayé jusqu'à présent --- find-file
, ido-switch-buffer
,
eval-expression
. Si vous ne trouvez aucune exception, vous pouvez patcher ces fonctions sur une base au cas par cas en appelant
use-popup-minibuffer
sur eux.
Position près du point
Pour positionner ce cadre de mini-tampon près de la hauteur du point, définissez simplement quelque chose comme la fonction suivante. Ce n'est pas parfait (en fait, c'est horrible dans beaucoup de cas), mais il fait un travail décent d'estimation de la hauteur du point.
(defun point-screen-height ()
(* (/ (face-attribute 'default :height) 10) 2
(- (line-number-at-pos (point))
(line-number-at-pos (window-start)))))