ইম্যাক্স ফ্রেমের মাঝখানে মিনিবিফার সামগ্রীটি কীভাবে প্রদর্শন করবেন?


20

সর্বাধিক ইমা্যাক্স ফ্রেমে কাজ করার সময়, পর্দার নীচে মিনিবাসার / প্রতিধ্বনি অঞ্চল প্রদর্শনের বিষয়বস্তু পাওয়া খুব কঠিন হতে পারে তবে একটি কমান্ড টাইপ করার সময় সম্পাদনা করা পাঠ্যের উপর ফোকাস হারিয়ে ফেলতে পারে - যা বেশ কার্যকর ব্যবহারের ক্ষেত্রে শর্ত।

মিনিবফার সক্রিয় থাকাকালীন যে পাঠ্যটি সম্পাদনা করা হচ্ছে তার উপর দিয়ে বর্তমান ইম্যাক্স বাফারকে কেন্দ্র করে মিনিপুফার / প্রতিধ্বনি অঞ্চলটি স্থানান্তরিত করার কোনও উপায় আছে কি না, মিনিবাফারটির বিষয়বস্তু ক্যাপচার করতে এবং এটি কেন্দ্রে প্রদর্শন করার জন্য আরও ভাল? কমান্ড টাইপ করে বর্তমান বাফারটি কি?


সম্পূর্ণতার জন্য, আমার যুক্ত করা উচিত যে এই ব্যবহারযোগ্যতা ইস্যুটির আমার বর্তমান সমাধানটি মিনিবাসার ফন্টের আকার বাড়ানো, তবে এটি সর্বাধিক অ-ফ্রেমগুলিতে নির্বোধ দেখাচ্ছে।
সাবাস্তিয়ান লে কলোনেক

উত্তর:


10

সেন্টারে পপআপ মিনিবাসার er

আপনি যা চেয়েছিলেন ঠিক তা করার একটি উপায় এখানে: পর্দার কেন্দ্রে মিনিফারটি প্রদর্শন করুন

  1. মিনিবাসার জন্য আলাদা ফ্রেম রাখুন
  2. এটি কেন্দ্রে অবস্থান করুন
  3. মিনিবফার যখনই ফোকাস অর্জন করবে তখনই এই ফ্রেমটি বাড়ান।

এটি অর্জন করা তুলনামূলকভাবে সহজ এবং আপনি oneonone.elপ্যাকেজটি পেয়ে যাবেন (@ ড্র অঙ্কিত করেছেন)। এই পদ্ধতির সমস্যাটি হ'ল মিনি মফারটি বার্তাগুলির জন্যও ব্যবহৃত হয়, তাই এটি গোপন রাখা খুব সুবিধাজনক কিছু নয়। চিন্তার কিছু নেই! আমি আরও একটি সমাধান নিয়ে এসেছি।

  1. একটি আছে দ্বিতীয় minibuffer একটি পৃথক ফ্রেমে প্রদর্শিত।
  2. এটি কেন্দ্রে অবস্থান করুন।
  3. ইন্টারেক্টিভ কমান্ডগুলির জন্য দ্বিতীয় ফ্রেমটি ব্যবহার করুন, যখন মূল (প্রথম) মিনিবাসার বার্তাগুলি প্রতিধ্বনি করার জন্য ব্যবহৃত হয়।

বাস্তবায়ন

এটি বাস্তবায়নের জন্য, আমাদের ইমা্যাকস স্টার্টআপে মিনিবিফার ফ্রেম তৈরি করতে হবে।

(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ফ্রেমটির কোনও মিনিফার না রাখার জন্য কনফিগার করবে এবং ইমাকস স্বয়ংক্রিয়ভাবে আপনার জন্য একটি পৃথক মিনিবিফার ফ্রেম তৈরি করবে। আপনি আপনার ওএস এর উইন্ডো ম্যানেজার ব্যবহার করে এই দুটি ফ্রেমকে অবস্থান রাখতে পারেন বা এটি ইম্যাক্স থেকে করতে পারেন।

নীচের স্নিপেট মডেলটিকে নীচে নিয়মিত ফ্রেম দিয়ে মিনিফার ফ্রেমটি কীভাবে শীর্ষে রাখা যায় তা উল্লেখ করে তবে আপনার মনিটরের আকারের জন্য আপনাকে অবশ্যই নম্বরগুলি অ্যাকাউন্টে পরিবর্তন করতে হবে।

(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আপনার স্বতন্ত্র মিনিবিফার ফ্রেমের জন্য আপনি যে অবস্থানটি চান তার জন্য বিকল্পটি কাস্টমাইজ করুন । মানটি হ'ল উপরের দিক থেকে পিক্সেলগুলির সংখ্যা (যদি না-নেতিবাচক থাকে) বা নীচে (যদি negativeণাত্মক হয়) আপনার প্রদর্শন। উদাহরণস্বরূপ, উল্লম্বভাবে কেন্দ্র করতে আপনার ডিসপ্লে উচ্চতার মান 2 টি দিয়ে বিভক্ত করুন।

আপনি যদি পরিবর্তে এটি গতিশীলভাবে স্থাপন করতে চান তবে বর্তমান ফ্রেমের উল্লম্ব কেন্দ্রে বলুন, তবে আপনি এটি করতে পারেন (ক) রেখে 1on1-minibuffer-frame-top/bottom= nilএবং (খ) সেই পরিবর্তনশীলটিকে যথাযথ অবস্থানে বাঁধতে পরামর্শ দেওয়ার মাধ্যমে can 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আপনি যে অবস্থানটি চান তার উপর ভিত্তি করে আপনি যে অবস্থানটি চান তা গণনা করতে ফাংশনটি সংজ্ঞায়িত করুন (বর্তমান উইন্ডো / ফ্রেমের আকার এবং অবস্থান, চাঁদের ধাপ, ...))।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.