एमएसीएस फ्रेम के बीच में मिनीबफ़र की सामग्री कैसे प्रदर्शित करें?


20

जब एक अधिकतम Emacs फ्रेम पर काम करते हैं, तो स्क्रीन के नीचे मिनीबफ़र / इको एरिया डिस्प्ले की सामग्री को देखना मुश्किल हो सकता है, लेकिन कमांड टाइप करते समय संपादित किए जा रहे पाठ पर ध्यान केंद्रित करने का कारण भी बनता है - जो काफी महत्वपूर्ण है प्रयोज्य के संदर्भ में मुद्दा।

क्या मिनीबायर के सक्रिय होने पर, या बेहतर, मिनीबार के कंटेंट को कैप्चर करने और प्रदर्शित करने के लिए, केंद्र में मौजूद इमेकस बफर के केंद्र में या तो मिनीबफ़र / इको क्षेत्र को स्थानांतरित करने का एक तरीका है। वर्तमान बफ़र के दौरान कमांड टाइप करते हुए?


पूर्णता के लिए, मुझे यह जोड़ना चाहिए कि इस प्रयोज्य मुद्दे का मेरा वर्तमान समाधान मिनीबफ़र के फ़ॉन्ट आकार को बढ़ाना है, लेकिन यह गैर-अधिकतम फ़्रेम पर मूर्खतापूर्ण दिखता है।
सेबास्टियन ले कॉलनेक

जवाबों:


10

केंद्र में पॉपअप मिनीबफ़र

यहाँ वही करने का तरीका है जो आपने पूछा था: स्क्रीन के केंद्र में मिनीबफ़र प्रदर्शित करें

  1. मिनीबार के लिए एक अलग फ्रेम रखें
  2. इसे केंद्र में रखें
  3. जब भी मिनीबफ़र फ़ोकस फ़ोकस करें तो इस फ़्रेम को उठाएँ।

यह हासिल करना अपेक्षाकृत आसान है, और आपको oneonone.elपैकेज के साथ (जैसा कि @ बिंदु बताते हैं) मिलेगा। इस दृष्टिकोण के साथ समस्या यह है कि मिनीबफ़र का उपयोग संदेशों के लिए भी किया जाता है, इसलिए इसे छिपाकर रखना कुछ बहुत सुविधाजनक नहीं है। कोइ चिंता नहीं! मैं एक और उपाय लेकर आया।

  1. एक है दूसरा minibuffer एक अलग फ्रेम पर प्रदर्शन किया।
  2. इसे केंद्र में रखें।
  3. इंटरेक्टिव कमांड के लिए दूसरे फ्रेम का उपयोग करें, जबकि मूल (पहला) मिनीबफ़र का उपयोग संदेशों को गूँजने के लिए किया जाता है।

कार्यान्वयन

इसे लागू करने के लिए, हमें 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)))))

के साथ खिलवाड़ करने के बजाय (setf (symbol-function function) ...)आप advice-add(या पुराने ad-add-advice) का उपयोग करना बेहतर होगा ।
स्टीफन

6

सबसे ऊपर मिनीबफ़र

स्क्रीन के मध्य में मिनीबफ़र प्रदर्शित करना जटिल है। एक उचित विकल्प (जो आपको अधिक पढ़ने योग्य नहीं मिल सकता है) इसे शीर्ष पर ले जाना है।

आप minibufferफ़्रेम में पैरामीटर के साथ फ्रेम के मिनीबफ़र के स्थान (या अस्तित्व) को कॉन्फ़िगर कर सकते हैं initial-frame-alist

अलग फ्रेम

पैरामीटर को सेट करने के nilलिए फ्रेम को कॉन्फ़िगर करना होगा जिसमें कोई मिनीबफ़र नहीं है, और Emacs स्वचालित रूप से आपके लिए एक अलग मिनीबफ़र फ्रेम बनाएंगे। आप अपने OS के विंडो मैनेजर का उपयोग करके इन दो फ़्रेमों को स्थिति में ला सकते हैं, या आप इसे Emacs से कर सकते हैं।

निम्नलिखित स्निपेट यह जांचता है कि शीर्ष पर मिनीबफ़र फ़्रेम कैसे रखा जाए, इसके ठीक नीचे नियमित फ्रेम के साथ, लेकिन आपको निश्चित रूप से आपके द्वारा मॉनिटर आकार के लिए संख्याओं को बदलना होगा।

(setq initial-frame-alist
      '((left . 1) (minibuffer . nil)
        ;; You'll need to adjust the following 3 numbers.
        (top . 75) ; In pixels
        (width . 127) ; In chars
        (height . 31)))

(setq minibuffer-frame-alist
      '((top . 1) (left . 1) (height . 2)
        ;; You'll need to adjust the following number.
        (width . 127)))

इसे समायोजित करने का सबसे तेज़ तरीका, अपने विंडो मैनेजर में फ़्रेमों का आकार बदलना है, और फिर (frame-parameters)आपके पास पैरामीटर मान देखने के लिए मूल्यांकन करें।

एक ही फ्रेम

एक अन्य संभावना minibufferएक विंडो में पैरामीटर सेट करने के लिए है। दुर्भाग्य से, मैं एक ही फ्रेम में एक खिड़की के लिए काम करने में असमर्थ था।


5

लाइब्रेरी oneonone.elआपको इस बॉक्स से बाहर कर देती है।

बस 1on1-minibuffer-frame-top/bottomउस स्थिति के लिए विकल्प को अनुकूलित करें जिसे आप स्टैंडअलोन मिनीबफ़र फ्रेम के लिए चाहते हैं। मान ऊपर से पिक्सेल की संख्या है (यदि गैर-नकारात्मक) या आपके प्रदर्शन के नीचे (यदि नकारात्मक) है। उदाहरण के लिए, अपने प्रदर्शन ऊंचाई को 2 से विभाजित करके मान को लंबवत रूप से केंद्र में सेट करें।

यदि आप इसके बजाय इसे गतिशील रूप से तैनात करना चाहते हैं, तो वर्तमान फ्रेम के ऊर्ध्वाधर केंद्र में कहें, तो आप कर सकते हैं कि (ए) छोड़ने 1on1-minibuffer-frame-top/bottom= nilऔर (बी) फ़ंक्शन 1on1-set-minibuffer-frame-top/bottom को उस चर को गतिशील रूप से उपयुक्त स्थिति में बांधने की सलाह देते हैं । उदाहरण के लिए:

(defadvice 1on1-set-minibuffer-frame-top/bottom (around center activate)
  (let ((1on1-minibuffer-frame-top/bottom  (my-dynamic-position ...)))
    ad-do-it))

( my-dynamic-positionजो भी मानदंड आप चाहते हैं, उसके आधार पर गणना करने के लिए फ़ंक्शन को परिभाषित करें (वर्तमान विंडो / फ्रेम आकार और स्थिति, चंद्रमा का चरण, ...)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.