2013-11-15 6 views
2

Я пытаюсь определить некоторые грани шрифтов emacs, чтобы сделать некоторые пользовательские выделения. Это похоже на работу, когда я определяю их по отдельности:Как определить несколько граней 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 не нравится цитируемый символ, и ожидает (defface мой-R-лицо .. вместо Моя попытка выглядит следующим образом:.

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

Может кто-нибудь пролить какой-то свет на то, что я делаю неправильно, или если я полностью лаю по неправильному дереву, и есть лучший способ сделать это?

Спасибо.

+0

Не делать "DefVar" вещь, пожалуйста: вам нужно только "defface". По разным причинам это было сделано для оригинальных лиц, используемых шрифтовым замком, и с тех пор все скопировали эту ошибку. – Stefan

+1

Если я удаляю defvar (или его изменение в моем коде ниже), то ни одна из подсветки не работает должным образом. Это связано с механизмом, используемым в остальной части режима? Это происходит путем добавления лиц и некоторых ключевых слов ключевого слова в список, который затем используется в кишках блокировки шрифтов, и без defvar это перестает работать. – RFairey

+2

Это потому, что ваши правила блокировки шрифтов неверны: им, вероятно, нужно сказать '' my-r-face' вместо 'my-r-face'. – Stefan

ответ

1

defvar - специальная форма, defface - это макрос (поэтому аргументы передаются неоцененными). Вы пытались использовать что-то в строке

(eval `(defface ,(intern "foo") '((t (:foreground "red"))) "Highlight" :group 'fortran)) 

(eval `(defvar ,(intern "bar"))) 
+0

Я пытался избежать eval, это ситуация, когда это действительно правильный инструмент для работы? – RFairey

+0

Я не знаю достаточно lisp, чтобы требовать (или даже знать) eval - правильный инструмент для этой работы. Я просто думаю, что это правильный инструмент для этого :-). – juanleon

0

полного кода, который работал в конце заключается в следующем:

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

Моя DefVar линии немного отличается, так как это позволяет лицу ковыряться с помощью кода выделения в другом месте в качестве глобальной переменной.

+0

Как отмечено @Stefan выше, строка defvar не нужна, если имя лица цитируется в определениях блокировки шрифтов, которые его используют. – RFairey

3

Вы можете избежать 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) 
Смежные вопросы