最近,我遇到了类似的问题,我基本上想在文档中将代码片段的字体字体化,并从中获得一些其他资源。在您回答问题的最后,我遵循了所提到的方法,对我来说效果很好。我最终得到的功能如下所示
(defun my-fontify-yaml (text)
(with-temp-buffer
(erase-buffer)
(insert text)
(delay-mode-hooks (yaml-mode))
(font-lock-default-function 'yaml-mode)
(font-lock-default-fontify-region (point-min)
(point-max)
nil)
(buffer-string)))
正如@Malabarba在评论中指出的那样,如果目标缓冲区使用字体锁定模式,则上述简单方法无效。但是我们可以欺骗字体锁定模式相信该字符串已字体设置文本属性锁定font-lock-face
的face
,(我们得到的face
属性集,当我们使用上面的功能),而文本属性fontified
来t
。以下函数接受上面函数返回的字符串,并进行所需的处理,以便将字符串插入字体(这是从org-mode的org-src-font-lock-fontify-block
函数中获取的)
(defun my-fontify-using-faces (text)
(let ((pos 0))
(while (setq next (next-single-property-change pos 'face text))
(put-text-property pos next 'font-lock-face (get-text-property pos 'face text) text)
(setq pos next))
(add-text-properties 0 (length text) '(fontified t) text)
text))
现在您可以按以下方式使用它
(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))