ইম্যাকস - কিছু মিনিবুफर বার্তা অক্ষম করুন


20

ইমাক্সে, এমন কিছু ঘটনা রয়েছে যেখানে আমি মিনিপুফারে বার্তা উপস্থিত হতে বাধা দিতে চাই, প্রধানত "বাফার শুরু / শেষ" এবং "পাঠ্য কেবল পঠনযোগ্য" সম্পর্কিত।

এই বার্তাগুলি মিনিফুফারে প্রদর্শিত না হতে পারে এমন কোনও উপায় আছে কি?

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


2
আপনার এই বার্তাগুলির প্রয়োজন হবে এমন কোনও কারণ নেই, না। এই বার্তাগুলির উপস্থিতির কারণটি হ'ল চেষ্টা করা এবং তা নিশ্চিত করা যে প্রতিটি কমান্ডের কিছু দৃশ্যমান প্রভাব রয়েছে: কমান্ডের প্রত্যাশিত দৃশ্যমান প্রভাবটি সম্পাদন করা যায় না, আমরা পরিবর্তে একটি বার্তা প্রেরণ করি, যাতে আপনি বলতে পারেন যে কমান্ডটি আসলে চালিত হয়েছিল।
স্টিফান

উত্তর:


21

ইমাস 25-এ, আপনি inhibit-messageনন-নীল মানের সাথে আবদ্ধ হয়ে মিনিবাসার বার্তা দমন করতে পারেন :

(let ((inhibit-message t))
  (message "Listen to me, you!"))

এই কাজটিও সি থেকে ডেকে আনা আদিমদের উপর?
অ্যারন মিলার

1
এটি হওয়া উচিত, সি ফাংশন message1কল হিসাবে message3, যা এই পরিবর্তনশীলকে সম্মান করে।
জ্যাকসন

বিরক্তিকর mu4e "মেল পুনরুদ্ধার ..." বার্তাটি দমন করার জন্য দরকারী:(let ((inhibit-message t)) (message make-progress-reporter))
manandearth

1
এটি ইমাক্স 26.1 এ আমার পক্ষে কাজ করে না, অদ্ভুতভাবে যথেষ্ট। কোন ধারণা কেন?
খ্রিস্টান হুডন

1
@ ক্রিশ্চিয়ান হাডন আমি সবেমাত্র ইম্যাক্স ২.1.১ এ পরীক্ষা করেছি এবং কোনও দীক্ষা ফাইল ছাড়াই মাস্টার করেছি এবং এটি উভয় জায়গায় আমার পক্ষে কাজ করে। নোট করুন যে messageবার্তার স্ট্রিংটি ফেরত দেয়, তাই কোডের মূল্যায়ন করার সময় আপনি সম্ভবত ফিরে আসা স্ট্রিংটি দেখছেন। আপনি যদি এই কোডটি কোনও কী-বাইন্ডিংয়ে দেখান, তবে কোনও বার্তা মুদ্রণ করা হবে না ( বার্তাগুলি বাফার ব্যতীত )।
জ্যাকসন

9

আপনি লিস্প কোড থেকে এইভাবে বাছাই করতে পারেন । "সাজানোর" কেন? কারণ মেসেজ একটি আদিম, সি-তে সংজ্ঞায়িত হয়েছে, একটি লিস্প ফাংশনের পরিবর্তে এবং ইমাস লিস্প রেফারেন্স ম্যানুয়াল অনুসারে সি কোড থেকে আদিমদের কাছে কলকে পরামর্শ উপেক্ষা করে।

সুতরাং, আপনার ইচ্ছা মতো কার্যকারিতা বাস্তবায়নের জন্য যথাযথভাবে কাজ করার জন্য আপনাকে বার্তাটি আদিমতার একটি লিপ ফাংশন হিসাবে পুনরায় সংজ্ঞায়িত করতে হবে; একবার আপনি এটি সম্পন্ন করার পরে, আপনি তারপরে কোডটি দিয়ে পরামর্শ দিতে পারেন যা মেসেজটি স্ট্রিংটি মিনিপুফারের সাথে প্রতিধ্বনিত হয়, এটি আপনি দেখতে চান না এমন বার্তাগুলির একটি তালিকার সাথে তুলনা করে এবং তারপরে কল করে বা মেসেজকে কল করে না ফলাফলের উপর তাত্ত্বিকভাবে, এটি উদাহরণস্বরূপ দ্বারা সম্পন্ন হতে পারে (defvar *message-prim* (symbol-function 'message)), এবং তারপরে (defun message (format &rest args) ... (funcall *message-prim* format args))- তবে সিমবোল-ফাংশন প্রদত্ত একটি আদিম যুক্তি এমন কিছু প্রত্যাবর্তন করে যা আসলে কলযোগ্য নয়, তাই ফুনাল একটি শূণ্য-ফাংশন শর্তকে সংকেত দেয়।

তবে, যদি এটি কাজ করে, তবুও এটি সত্যই কৌশলটি করতে পারে না, কারণ আদিমকে নতুনভাবে সংজ্ঞায়িত করা কেবল গ্যারান্টি দেয় যে লিস্প কোড থেকে ফাংশনটি কল করা হলে পুনরায় সংজ্ঞাটি ব্যবহৃত হবে; সি কোডে কলগুলি এখনও আদিম সংজ্ঞাটি ব্যবহার করতে পারে । (সি কোডের পক্ষে ইমাস লিস্পে কল করা সম্ভব, এবং এই জাতীয় কেসগুলি পুনরায় সংজ্ঞা দেখতে পাবে; অবশ্যই, সি কোডের পক্ষে সি কোড কল করা সম্ভব ছিল এবং এই জাতীয় কেসগুলি মূল সংজ্ঞাটি দেখতে পাবে।)

আমি অস্পষ্টভাবে সি কোড প্যাচিংয়ের বিষয়ে চিন্তা করছি এবং সঠিক বার্তা দমন কার্যকারিতা সরবরাহ করতে ইম্যাক্স পুনরায় সংশ্লেষ করছি; আমার আসলে সেই কার্যকারিতাটির দরকার নেই, তবে এটি একটি আকর্ষণীয় অনুশীলন প্রমাণ করতে পারে, বিশেষত যেহেতু আমি সি হ্যাকার নই। এরই মধ্যে, আমি এখানে কিছুটা বেত্রাঘাত করেছি যা কোনও ফাইলের মধ্যে ফেলে দেওয়া হয়, যখন আপনার কোনও ডিআইডি ফাইল থেকে অন্তর্ভুক্ত করা হয় এবং আপনার স্বাদ অনুসারে কাস্টমাইজ করা হয়, লিসপ কোড থেকে প্রাপ্ত বার্তাগুলি দমন করবে যা দমন করার জন্য আপনার তালিকার সাথে তালিকার সাথে মেলে। যতক্ষণ দমন সক্ষম করা থাকে, এই বার্তাগুলি কখনই মিনিবাসে প্রদর্শিত হবে না; আপনার *Messages*পাশাপাশি বাফার থেকে সেগুলি দমন করার বিকল্প রয়েছে ।

;; message-suppression.el
;; a quick hack by Aaron (me@aaron-miller.me), 2013-11-12
;; half a solution for http://superuser.com/questions/669701/emacs-disable-some-minibuffer-messages
;; NB this does nothing until you 
;; M-x customize-group RET message-suppression RET
;; and adjust to taste

(defgroup message-suppression nil
  "Customization options for selective message suppression."
  :prefix "message-suppression")

(defcustom message-suppression-enabled nil
  "Whether or not to suppress messages listed in
`message-suppress-these'."
  :group 'message-suppression
  :tag "Suppress some messages?"
  :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)))

(defcustom message-suppression-to-messages-buffer t
  "Whether or not to insert messages suppressed from the
minibuffer into the *Messages* buffer."
  :group 'message-suppression
  :tag "Insert suppressed messages into *Messages* buffer?"
  :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)))

(defcustom message-suppression-these nil
  "A list of messages which the `message-except-these' advice
should suppress from being echoed in the minibuffer. Messages
are matched by `member', i.e., only exact strings match.

NB! Per the Emacs manual, calls from C code to primitives (such
as `message') ignore advice entirely, which means some messages
cannot be suppressed by this mechanism. ('Advising
Functions' in the Emacs Lisp Reference Manual, q.v.)"
  :group 'message-suppression
  :tag "Messages to suppress"
  :type '(repeat (string))
  :link '(info-link "(elisp)Advising Functions"))

(defadvice message (around message-suppress-advice)
  "Suppress messages listed in `message-suppress-these' from being
  echoed in the minibuffer."
  (let ((message-string nil)
        (current-buffer nil))
    (if (and message-suppression-enabled
             (length (ad-get-args 0))
             (stringp (car (ad-get-args 0)))
             ;; message-string doesn't get set until here because `format'
             ;; will complain if its first argument isn't a string
             (setq message-string (apply 'format (ad-get-args 0)))
             (member message-string
                     message-suppression-these))
        ;; we won't call `message', but we might echo to *Messages*
        (and message-suppression-to-messages-buffer
             (progn
               (setq current-buffer (current-buffer))
               (switch-to-buffer (get-buffer-create "*Messages*"))
               (goto-char (point-max))
               (insert (make-string 1 10))
               (insert message-string)
               (switch-to-buffer current-buffer)))
      ad-do-it)))

(ad-activate 'message)

আমি লিস্প কোড থেকে উত্পন্ন উত্পন্ন বার্তাগুলির সাথে কাজ করতে এটি পরীক্ষা করেছি, উদাহরণস্বরূপ, যখন আপনি একটি খালি স্ট্রিং আর্গুমেন্ট দেবেন তখন ডিজাইন-ফাংশন দ্বারা প্রতিধ্বনিত "আপনি কোনও ফাংশন নির্দিষ্ট করেননি" complaint দুর্ভাগ্যক্রমে, আপনি যে বার্তাগুলিকে দমন করতে চান বলে উল্লেখ করেছেন, যেমন "বাফারের শুরু", "বাফারের সমাপ্তি", এবং "পাঠ্য কেবল পঠনযোগ্য", সমস্ত কোড সি কোড থেকে উত্পন্ন হয়েছে, যার অর্থ আপনি সক্ষম হবেন না এই পদ্ধতি দ্বারা তাদের দমন।

যদি আমি কখনও সোর্স প্যাচটি ঘুরে দেখি তবে এটি (সম্ভবত) ইমাস 24.3 এর বিপরীতে হবে এবং আমি কীভাবে এটি ব্যবহার করব সে সম্পর্কে তথ্যের সাথে এই উত্তরটি আপডেট করব।


8

ইমাস 25 এবং সম্ভবত কিছু পূর্ববর্তী সংস্করণে এটি করার সর্বোত্তম উপায় নিম্নরূপ:

প্রথম সংজ্ঞায়িত:

(defun suppress-messages (old-fun &rest args)
  (cl-flet ((silence (&rest args1) (ignore)))
    (advice-add 'message :around #'silence)
    (unwind-protect
         (apply old-fun args)
      (advice-remove 'message #'silence))))

তারপরে আপনি যদি তৈরি সমস্ত বার্তা দমন করতে চান তবে some-function:

(advice-add 'some-function :around #'suppress-messages)

উদাহরণস্বরূপ, আমি লিখে ফাংশন ispell-kill-ispell(ইন ispell.el.gz) দ্বারা উত্পাদিত "ইস্পেল প্রক্রিয়া নিহত" বার্তাটি দমন করি :

(advice-add 'ispell-kill-ispell :around #'suppress-messages)

আপনার যদি বার্তাগুলি পুনরায় সক্ষম করার প্রয়োজন হয় তবে চালনা করুন:

(advice-remove 'some-function #'suppress-messages)

কয়েকটি বিষয় লক্ষণীয়:

1) উত্পাদিত সমস্ত বার্তাগুলি some-functionদমন করা হবে যে কোনও লিপ ফাংশন দ্বারা ফাংশন কলগুলির দ্বারা উত্পাদিত সমস্ত বার্তা।

2) সি কোড দ্বারা উত্পাদিত বার্তাগুলি চাপা দেওয়া হবে না তবে এটি সম্ভবত সেরা।

3) আপনাকে অবশ্যই নিশ্চিত করতে হবে যে -*- lexical-binding: t -*-আপনার .elফাইলের প্রথম লাইনে রয়েছে ।

তবে আপনি কীভাবে খুঁজে পাবেন যে কোন ফাংশন বলা হয় message? অন্য কারও পরামর্শ অনুসারে আপনি কোডটি গ্রেপ করতে পারেন তবে ইমাক আপনার পক্ষে কাজটি করা সহজ।

আপনি যদি সংজ্ঞা দেন:

(defun who-called-me? (old-fun format &rest args)
  (let ((trace nil) (n 1) (frame nil))
      (while (setf frame (backtrace-frame n))
        (setf n     (1+ n) 
              trace (cons (cadr frame) trace)) )
      (apply old-fun (concat "<<%S>>\n" format) (cons trace args))))

এবং তারপরে:

(advice-add 'message :around #'who-called-me?)

আপনি বার্তায় একটি ব্যাকট্রেস যুক্ত পাবেন। এখান থেকে আপনি সহজেই দেখতে পাবেন যে বার্তাটি কোথায় তৈরি হয়েছিল।

আপনি এটি দিয়ে বিপরীত করতে পারেন:

(advice-remove 'message #'who-called-me?)

বিকল্প messageবার্তা হ'ল ফাংশনটি পরামর্শ দেওয়া এবং পরীক্ষা করা আপনি বার্তাটি প্রিন্ট করতে চান কিনা তা পরীক্ষা করে দেখার জন্য। এটি সহজ যদি প্রশ্নে থাকা বার্তাটি একটি স্থির স্ট্রিং থাকে। যেমন "ইস্পেল প্রক্রিয়া নিহত" দমন করার জন্য আপনি সংজ্ঞায়িত করতে পারেন:

(defun suppress-ispell-message (old-fun format &rest args)
  (if (string= format "Ispell process killed")
         (ignore)
    (apply old-fun format args)))

এবং তারপরে:

(advice-add 'message :around #'suppress-ispell-message)

এই বার্তাটি জটিল কিছু হলে খুব শীঘ্রই এই পদ্ধতিরটি খুব অগোছালো হয়ে যায়।


3

আপনি দৃশ্যত একটি উপায় জন্য জিজ্ঞাসা করা হয় বেছে বেছে দমন নির্দিষ্ট বার্তা। এর উত্তরটি হ'ল আপনাকে সেই কোডটি নতুন করে সংজ্ঞায়িত করতে বা পরামর্শ দিতে হবে যা এই নির্দিষ্ট বার্তাগুলি জারি করে।

প্রতিরোধ করার জন্য সব বার্তা, কিছু কোড চলাকালীন উদাহরণস্বরূপ, যদি আপনি ব্যবহার করতে পারেন fletবা cl-fletফাংশন পুনরায় সংজ্ঞায়িত messageকরার জন্য (ফাংশন) স্থানীয়ভাবে ignore। অথবা ব্যবহার করা প্রযুক্তি ব্যবহার edt-electric-helpifyসংরক্ষণ মূল সংজ্ঞা: message, fsetকরতে ignore, পুনরায় fsetতা ফিরে আসল Def করতে (যদিও এটি ব্যবহার করাই ভালো unwind-protectযদি আপনি যে কি)।


দুঃখিত, তবে আমি কীভাবে এই ত্রুটি বার্তাগুলি সন্ধান করতে পারি তাতে আপনি আমাকে সহায়তা করতে সক্ষম হবেন? এই মুহুর্তে, এটি প্রায় মনে হচ্ছে বার্তাটি রাখার চেয়ে অক্ষম করা আরও বেশি সমস্যা।
বিটল্লিপগুলি

1
"এই ত্রুটি বার্তাগুলি" অনুসন্ধান করতে, ব্যবহার করুন grepবা সংযুক্ত A। ইমাস লিস্প উত্স ফাইলগুলিতে ত্রুটি বার্তার পাঠ্যের সন্ধান করুন (এবং সম্ভবত আপনার যদি এগুলি উপলব্ধ থাকে তবে ইমাস সি সি ফাইলগুলিতেও পাবেন)। আছে HTH।
ড্র হয়েছে

2

এটি "বাফারিংয়ের শুরু" এবং "বাফারের সমাপ্তি" দমন করার জন্য কাজ করে এবং ইমাস 25 প্রয়োজন হয় না।

; Suppress "Beginning of buffer" and "End of buffer" messages
(defadvice previous-line (around silencer activate)
  (condition-case nil
    ad-do-it
    ((beginning-of-buffer))))

(defadvice next-line (around silencer activate)
  (condition-case nil
    ad-do-it
    ((end-of-buffer))))

Https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html দ্বারা অনুপ্রাণিত কিন্তু আরও সামঞ্জস্যের জন্য "ডিফ্যাডভাইস" ব্যবহার করে।

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