সেন্টারে পপআপ মিনিবাসার er
আপনি যা চেয়েছিলেন ঠিক তা করার একটি উপায় এখানে: পর্দার কেন্দ্রে মিনিফারটি প্রদর্শন করুন ।
- মিনিবাসার জন্য আলাদা ফ্রেম রাখুন
- এটি কেন্দ্রে অবস্থান করুন
- মিনিবফার যখনই ফোকাস অর্জন করবে তখনই এই ফ্রেমটি বাড়ান।
এটি অর্জন করা তুলনামূলকভাবে সহজ এবং আপনি oneonone.el
প্যাকেজটি পেয়ে
যাবেন (@ ড্র অঙ্কিত করেছেন)। এই পদ্ধতির সমস্যাটি হ'ল মিনি মফারটি বার্তাগুলির জন্যও ব্যবহৃত হয়, তাই এটি গোপন রাখা খুব সুবিধাজনক কিছু নয়। চিন্তার কিছু নেই! আমি আরও একটি সমাধান নিয়ে এসেছি।
- একটি আছে দ্বিতীয় minibuffer একটি পৃথক ফ্রেমে প্রদর্শিত।
- এটি কেন্দ্রে অবস্থান করুন।
- ইন্টারেক্টিভ কমান্ডগুলির জন্য দ্বিতীয় ফ্রেমটি ব্যবহার করুন, যখন মূল (প্রথম) মিনিবাসার বার্তাগুলি প্রতিধ্বনি করার জন্য ব্যবহৃত হয়।
বাস্তবায়ন
এটি বাস্তবায়নের জন্য, আমাদের ইমা্যাকস স্টার্টআপে মিনিবিফার ফ্রেম তৈরি করতে হবে।
(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)))))