केंद्र में पॉपअप मिनीबफ़र
यहाँ वही करने का तरीका है जो आपने पूछा था: स्क्रीन के केंद्र में मिनीबफ़र प्रदर्शित करें ।
- मिनीबार के लिए एक अलग फ्रेम रखें
- इसे केंद्र में रखें
- जब भी मिनीबफ़र फ़ोकस फ़ोकस करें तो इस फ़्रेम को उठाएँ।
यह हासिल करना अपेक्षाकृत आसान है, और आपको oneonone.el
पैकेज के साथ
(जैसा कि @ बिंदु बताते हैं) मिलेगा। इस दृष्टिकोण के साथ समस्या यह है कि मिनीबफ़र का उपयोग संदेशों के लिए भी किया जाता है, इसलिए इसे छिपाकर रखना कुछ बहुत सुविधाजनक नहीं है। कोइ चिंता नहीं! मैं एक और उपाय लेकर आया।
- एक है दूसरा minibuffer एक अलग फ्रेम पर प्रदर्शन किया।
- इसे केंद्र में रखें।
- इंटरेक्टिव कमांड के लिए दूसरे फ्रेम का उपयोग करें, जबकि मूल (पहला) मिनीबफ़र का उपयोग संदेशों को गूँजने के लिए किया जाता है।
कार्यान्वयन
इसे लागू करने के लिए, हमें 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))
"")
फिर हम read-from-minibuffer
मूल फ्रेम के मिनीबफ़र के बजाय इस दूसरे मिनीबफ़र का उपयोग करने के लिए पैच करते हैं।
(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)
यह पूरी तरह से सब कुछ के साथ काम नहीं कर सकते, लेकिन यह सब कुछ मैं अब तक की कोशिश की पर काम किया --- find-file
, ido-switch-buffer
,
eval-expression
। यदि आप ऐसा कोई अपवाद मिल जाए, आपको कॉल करके मामला-दर-मामला आधार पर इन कार्यों पैच कर सकते हैं
use-popup-minibuffer
उन पर।
प्वाइंट के पास की स्थिति
इस मिनीबफ़र फ्रेम को बिंदु की ऊंचाई के पास रखने के लिए, बस निम्नलिखित फ़ंक्शन की तरह कुछ परिभाषित करें। यह सही नहीं है (वास्तव में, यह बहुत सारे मामलों में भयानक है), लेकिन यह बिंदु ऊंचाई का अनुमान लगाने का एक अच्छा काम करता है।
(defun point-screen-height ()
(* (/ (face-attribute 'default :height) 10) 2
(- (line-number-at-pos (point))
(line-number-at-pos (window-start)))))