여러 개의 Emacs 얼굴을 정의하는 방법은 무엇입니까?
-
20-12-2019 - |
문제
일부 사용자 정의 강조를 수행하기 위해 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 라인은 전역 변수로 다른 곳에서 강조 표시 코드에 의해 얼굴을 픽업 할 수있게 해줍니다.
제휴하지 않습니다 StackOverflow