سؤال

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

(defface my-r-face `((t (:foreground "red")))  "Red highlight")
(defvar m-r-face 'my-r-face "Red.")
(defface my-g-face `((t (:foreground "green")))  "Green highlight")
(defvar m-g-face 'my-g-face "Green.")
(defface my-b-face `((t (:foreground "#0088ff")))  "Blue highlight")
(defvar m-b-face 'my-b-face "Blue.")
....etc

ولكن لدي بضع عشرات من هذه وأريد أن تحدد لهم جميعا دفعة واحدة من نوع من الجدول اللون:

(setq ctable '(("red" "r")
           ("orange" "o")
           ("yellow" "y")
           ("#88ff00" "gy")
           ("green" "g")
           ("#00ff88" "gc")
           ("cyan" "c")
           ("#0088ff" "bc")
           ("blue" "b")
           ("purple" "bm")
           ("magenta" "m")
           ("#ff0088" "rm")
           ("grey" "lg")
           ("white" "w") ))

تكمن الصعوبة في تجميع أسماء الرموز لكل وجه ، أي ربط "وجهي" و "وجهي" على جانبي الإدخال من الجدول.لقد اكتشفت (المتدرب) التي يمكن أن تجعل رمزا جديدا من سلسلة ، ولكن هذا الرمز هو ثم غير مقبول ل (ديفاس) ، كما يبدو ما أقوم به هو ما يعادل (ديفاس 'بلدي ص الوجه ...، و ديفاس لا يحب الرمز المقتبس ، ويتوقع (ديفاس بلدي ص الوجه ..بدلا من ذلك.محاولتي هي كما يلي:

(dolist (tpl ctable)
  (defvar (intern (concat "my-" (nth 1 tpl) "-face"))
    (quote (intern (concat "my-" (nth 1 tpl) "-face"))) "colour")
  (defface (intern (concat "my-" (nth 1 tpl) "-face"))
    `((t (:foreground ,(car tpl)))) "Highlight" :group 'fortran)
)

تشغيل هذه النتائج في

Lisp error: (wrong-type-argument symbolp (intern (concat "fegs-" (nth 1 tpl) "-face")))
  (defvar (intern (concat "fegs-" ... "-face")) (quote (intern ...)) "colour")

يمكن لأي شخص تسليط بعض الضوء على ما أفعله خطأ, أو إذا أنا ينبح حتى شجرة خاطئة تماما ، وهناك طريقة أفضل للقيام بذلك?

شكرا.

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

المحلول

DefVar هو نموذج خاص، Defface هو ماكرو (حتى يتم تمرير الوسائط غير متوفرة).هل حاولت استخدام شيء ما في خط

giveacodicetagpre.

نصائح أخرى

يمكنك تجنب eval:

(defconst my-ctable '(...))

(defmacro my-init-cfaces ()
  `(progn
    ,@(mapcar (lambda (tpl)
               `(defface ,(intern (format "my-%s-face" (nth 1 tpl)))
                  '((t :foreground ,(car tpl)))
                  ,(format "Face for color %s." (car tpl))
                  :group 'fortran))
              my-ctable)))

(my-init-cfaces)

الرمز الكامل الذي عمل في النهاية هو كما يلي:

giveacodicetagpre.

خط DefVar الخاص بي مختلفا قليلا حيث يسمح ذلك للوجه يتم التقاطه بواسطة رمز التسليط في مكان آخر كمتغير عالمي.

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