Merkezde Popup Minibuffer
İşte tam olarak sorduğunuz şeyi yapmanın bir yolu: minibuffer'ı ekranın ortasında görüntüleyin .
- Minibuffer için ayrı bir çerçeve bulundurun
- Merkeze yerleştirin
- Minibuffer odaklandığında bu kareyi kaldırın.
Bunu başarmak nispeten kolaydır ve oneonone.el
paketle elde edeceğiniz şey budur
(@Drew'un işaret ettiği gibi). Bu yaklaşımdaki sorun, minibuffer'ın mesajlar için de kullanılmasıdır, bu yüzden gizli tutulması çok uygun bir şey değildir. Endişe etmeyin! Başka bir çözüm buldum.
- Bir var ikinci minibuffer ayrı çerçeve üzerinde gösterdi.
- Ortaya yerleştirin.
- Etkileşimli komutlar için ikinci çerçeveyi kullanırken, iletilerin yankılanması için orijinal (ilk) minibuffer kullanılır.
uygulama
Bunu uygulamak için emacs başlangıcında minibuffer çerçevesi oluşturmamız gerekiyor.
(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))
"")
Ardından read-from-minibuffer
orijinal çerçevenin minibuffer'ı yerine bu ikinci minibufferi kullanmak için yama yapıyoruz .
(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)
Bu kesinlikle her şeyi ile çalışmayabilir, ama şimdiye kadar denedim her konuda çalışmış --- find-file
, ido-switch-buffer
,
eval-expression
. Eğer varsa yapmak herhangi istisnalar bul, çağırarak bir vaka ile ayrı ayrı bu işlevleri yama olabilir
use-popup-minibuffer
onlara.
Konum Yakın Nokta
Bu minibuffer çerçevesini noktanın yüksekliğine yakın bir yere yerleştirmek için aşağıdaki işlev gibi bir şey tanımlamanız yeterlidir. Mükemmel değil (aslında, birçok durumda korkunç), ancak nokta yüksekliğini tahmin etmek için iyi bir iş çıkarıyor.
(defun point-screen-height ()
(* (/ (face-attribute 'default :height) 10) 2
(- (line-number-at-pos (point))
(line-number-at-pos (window-start)))))