0

私は動的シンボルなどの構文に完全に精通しているわけではありません。おそらくdolist、ここで色のリストを使用して何かを行うことができると思いますが、何がわからないのですか:

  (custom-set-faces
   `(term-color-black ((t (:inherit term-color-black :background ,(face-attribute 'term-color-black :foreground)))))
   `(term-color-red ((t (:inherit term-color-red :background ,(face-attribute 'term-color-red :foreground)))))
   `(term-color-green ((t (:inherit term-color-green :background ,(face-attribute 'term-color-green :foreground)))))
   `(term-color-yellow ((t (:inherit term-color-yellow :background ,(face-attribute 'term-color-yellow :foreground)))))
   `(term-color-blue ((t (:inherit term-color-blue :background ,(face-attribute 'term-color-blue :foreground)))))
   `(term-color-magenta ((t (:inherit term-color-magenta :background ,(face-attribute 'term-color-magenta :foreground)))))
   `(term-color-cyan ((t (:inherit term-color-cyan :background ,(face-attribute 'term-color-cyan :foreground)))))
   `(term-color-white ((t (:inherit term-color-white :background ,(face-attribute 'term-color-white :foreground))))))
4

2 に答える 2

1

これは 100% 同一ではありませんが、ほとんどの場合は同等です。

(defmacro set-term-faces (names)
  `(custom-set-faces
    ,@(loop for color in names
         for sym = (intern (concat "term-color-" (symbol-name color)))
         collect (list 'quote
                       `(,sym ((t (:inherit ,sym
                                   :background
                                   ,(face-attribute sym :foreground)))))))))

(set-term-faces (black red green yellow blue magenta cyan white))

不一致は、の評価が発生した時点で発生し,(face-attribute ...)ます。つまり、このマクロはあなたが持っているのと同じソース コードを生成しません。カンマの後の式を既に評価しているので、コードがマクロ内にある場合は違いがあります。

于 2013-03-31T11:34:43.150 に答える
1

そのコードをリファクタリングすることはできますが、おそらくそうすべきではありません。すべての(custom-set-...)コードは、Emacs の「簡単なカスタマイズ」システムによって自動的に生成されます。したがって、それをリファクタリングすると、

  1. カスタマイズ システムとの互換性を壊す
  2. リファクタリングされたコードは、次に顔をカスタマイズするときに元のコードによって上書きされます

ただし、.emacs ファイルが雑然としすぎている場合は、カスタマイズ コードを別のファイルに書き込むように Emacs を構成できます。関連する質問へのこの回答と、Emacs のドキュメントも参照してください。

于 2013-04-01T22:58:49.500 に答える