Popup Minibuffer ที่ศูนย์
นี่คือวิธีการที่จะทำสิ่งที่คุณถาม: แสดง minibuffer ที่ศูนย์ของหน้าจอ
- มีเฟรมแยกต่างหากสำหรับ minibuffer
- วางตำแหน่งไว้ตรงกลาง
- เพิ่มเฟรมนี้เมื่อใดก็ตามที่ minibuffer ได้รับโฟกัส
นั่นเป็นเรื่องที่ทำได้ง่ายและเป็นสิ่งที่คุณจะได้รับจาก
oneonone.el
แพ็คเกจ (ตามที่ @Drew points) ปัญหาเกี่ยวกับวิธีนี้คือใช้ minibuffer สำหรับข้อความดังนั้นการซ่อนไว้จึงไม่ใช่สิ่งที่สะดวกมาก ไม่ต้องกังวล! ฉันมาด้วยวิธีอื่น
- มีminibuffer ที่สองปรากฏขึ้นในเฟรมแยกต่างหาก
- วางตำแหน่งไว้ตรงกลาง
- ใช้เฟรมที่สองสำหรับคำสั่งแบบอินเทอร์แอคทีฟขณะที่ minibuffer (แรก) ดั้งเดิมใช้สำหรับการแสดงข้อความ
การดำเนินงาน
ในการดำเนินการนี้เราต้องสร้างกรอบ 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
ต่อเพื่อใช้ minibuffer ตัวที่สองนี้แทน 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)))))