如何嵌套各种`propertyize`s?

时间:2013-08-11 02:00:47

标签: emacs elisp emacs-faces

我想做elisp相当于

 <font color="red">normal<b>bold</b></font>

我试过

 (propertize (concat "normal" 
               (propertize "bold" 'font-lock-face 
                                  '(:weight bold))) 
  'font-lock-face '(:foreground "red"))

然而,'red'属性会覆盖'bold'属性,我最终会用

#("normalbold" 0 6
  (font-lock-face
   (:foreground "red"))
  6 10
  (font-lock-face
   (:foreground "red")))

可行吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我不认为使用elisp提供的功能可以完成嵌套。 The docs建议单独对字符串的每个部分进行属性化,然后将它们连接起来:

” 要在字符串的各个部分放置不同的属性,可以使用properties来构造每个部分,然后将它们与concat结合起来:

      (concat
       (propertize "foo" 'face 'italic
                   'mouse-face 'bold-italic)
       " and "
       (propertize "bar" 'face 'italic
                   'mouse-face 'bold-italic))
           ⇒ #("foo and bar"
                       0 3 (face italic mouse-face bold-italic)
                       3 8 nil
                       8 11 (face italic mouse-face bold-italic))

在您的情况下看起来像:

(concat (propertize "normal" 'font-lock-face '(:foreground "red" ))
        (propertize "bold" 'font-lock-face '(:foreground "red" :weight bold)))

如果不了解您的用例,我无法确定这对您有用。如果不能,您可以尝试使用add-text-properties(也在文档中描述),您可以使用它来有条理地修改字符串的文本属性。