문제

일부 사용자 정의 강조를 수행하기 위해 Emacs 글꼴면을 정의하려고합니다.이것은 내가 그들을 개별적으로 정의 할 때 작동하는 것처럼 보입니다.

(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") ))
.

내 어려움은 각 얼굴에 대한 심볼 이름을 조립하는 것입니다. 즉 테이블에서 항목의 양쪽에 "MY-"및 "-face"를 연결하는 것입니다.나는 문자열에서 새로운 기호를 만들 수있는 (인턴)을 발견했지만,이 기호는 (Defface), (Defface 'my-r-face ...,그리고 Defface는 인용 된 기호를 좋아하지 않으며 (대신 나의 시도가 있습니다).

(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는 매크로 (그래서 논쟁이 흐려짐)입니다.

라인에서 무언가를 사용하려고 시도 했습니까?
(eval `(defface ,(intern "foo") '((t (:foreground "red"))) "Highlight" :group 'fortran))

(eval `(defvar ,(intern "bar")))
.

다른 팁

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)
.

끝에서 작업 한 전체 코드는 다음과 같습니다.

(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)
  (let ((fname (concat "fegs-" (nth 1 tpl) "-face")))
    (eval `(defface ,(intern fname) '((t (:foreground ,(car tpl)))) "Highlight" :group 'fortran))
    (eval `(defvar ,(intern fname) ',(intern fname)))
  )
)
.

내 디 vAR 라인은 전역 변수로 다른 곳에서 강조 표시 코드에 의해 얼굴을 픽업 할 수있게 해줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top