سؤال

كيف تسرد أوضاع صغيرة نشطة في Emacs؟

هل كانت مفيدة؟

المحلول

C-h m أو M-x describe-mode يعرض جميع الأوضاع الصغيرة النشطة (والوضع الرئيسي) وصفا موجزا لكل منهما.

نصائح أخرى

يتم تخزين قائمة بجميع أوامر الوضع الثانوي في المتغير minor-mode-list. وبعد معرفة ما إذا كانت نشطة أو لا يتم ذلك عادة عن طريق التحقق من متغير نفس الاسم. لذلك يمكنك أن تفعل شيئا مثل هذا:

(defun which-active-modes ()
  "Give a message of which minor modes are enabled in the current buffer."
  (interactive)
  (let ((active-modes))
    (mapc (lambda (mode) (condition-case nil
                             (if (and (symbolp mode) (symbol-value mode))
                                 (add-to-list 'active-modes mode))
                           (error nil) ))
          minor-mode-list)
    (message "Active modes are %s" active-modes)))

ملاحظة: هذا يعمل فقط من أجل المخزن المؤقت الحالي (لأنه قد يتم تمكين أوضاع صغيرة فقط في بعض المخازن المؤقتة).

describe-mode يمكن أن يأتي بطريقة أو بأخرى مع قائمة بأوضوئ بسيطة مكن، لماذا لا أستطيع؟ لذلك بعد قراءة شفرة المصدر الخاصة به، أدركت أنها تحصل على قائمة أوضاع صغيرة نشطة من كليهما minor-mode-list و minor-mode-alist. وبعد باستخدام الطرف الثالث dash.el قائمة مكتبة التلاعب جئت مع هذا الرمز:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

لذلك، على سبيل المثال، لتعطيل جميع أوضاع طفيفة، استخدم -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
        (funcall it -1))

لا تنس أن تحفظ قائمة أوضاع بسيطة في متغير، وإلا فسيتعين عليك إعادة تشغيل emacs أو تمكينها عن طريق الذاكرة.

إليك مقتطف بديل بسيط مشابه لبعض الطرق التي تم تناولها بالفعل في إجابات أخرى:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))

أذا أردت برمجيا افعل شيئا مع جميع المخازن المؤقتة التي لها وضع معين نشط، ثم الحل الأفضل، والأضيق الأضلاع، أنظف، مدمج، هو كما يلي:

(dolist ($buf (buffer-list (current-buffer)))
  (with-current-buffer $buf
    (when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
      (message "x %s" $buf))))

يفعل ما يلي:

  1. استرداد قائمة جميع المخازن المؤقتة عبر buffer-list, مع المخزن المؤقت النشط حاليا في رأس القائمة (لذلك يعامل أولا، عادة ما تريد، ولكن ترك current-buffer المعلمة إذا كنت لا تهتم).
  2. حلقة من خلال قائمة المخزن المؤقت وتعيين كل اسم مخزن مؤقت للمتغير $buf.
  3. يستخدم with-current-buffer $buf لإخبار Emacs بأن جميع الكود داخل الجسم يجب أن تعمل كما لو كان يعمل داخل المخزن المؤقت $buf بدلا من مهما كانت المخزن المؤقت الذي تعرضه بالفعل على الشاشة.
  4. when <some mode variable> هي الطريقة الصحيحة للتحقق مما إذا تم تمكين الوضع؛ تستطيع ايضا استخذام if وغيرها من الطرق هذه الأساليب. في كلتا الحالتين، الهدف هو التحقق مما إذا تم تعيين متغير الوضع الرئيسي القاصر أو الرئيسية في المخزن المؤقت. تحدد جميع الأوضاع تقريبا متغيرا عبر وضع "تحديد"، والذي تلقائيا يؤديها إلى إنشاء متغير محلي محلي محلي باسم الوضع، وهو ما هو هذا يعمل. وإذا لم يكن لديهم متغير قياسي، فابحث في التعليمات البرمجية المصدر الخاصة به لمعرفة كيفية تحديد رمز "تبديل" كيفية تبديلها وإيقافها. 99٪ منهم يستخدمون وجود متغير معتلمهم (وإذا لم يفعلوا ذلك، أقترح الإبلاغ عن أنه كحزع مؤلف الوضع). على سبيل المثال، للتحقق مما إذا كان المخزن المؤقت لديه وضع بيضاء نشط، ستقول when whitespace-mode.
  5. بعد ذلك، يخرج فقط رسالة إلى المخزن المؤقت للرسائل، مع "X" واسم المخزن المؤقت الذي كان يحتوي الوضع النشط. هذا هو المكان الذي تضع فيه الكود الخاص بك، للقيام بكل ما تريد القيام به مع المخزن المؤقت المكتشف.

استمتع! فصاعدا إلى رمز LISP أكبر ونظافة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top