使用另一种主要模式来对缓冲区的区域进行字体化


12

我有一个缓冲区,用于显示Ansible模块的文档。该缓冲区具有其自己的主模式,该模式可提供所有标准内容。值得注意的是,它对缓冲区进行了字体处理以突出显示内联标记,选项,节等。总而言之,它与十分相似M-x man

在文档的底部,通常在YAML中有一些代码示例。我也想将它们字体化。当然,我可以为YAML添加我自己的字体锁定关键字,但是我宁愿重用YAML模式的字体。

我怎样才能做到这一点?具体来说,如何使用不同的主模式来对缓冲区的特定区域进行字体设置?

请注意,该区域不需要激活 YAML模式。整个缓冲区仅是一个被动显示缓冲区,不能进行编辑。我真的只需要生成字体,就好像该区域中的“ YAML模式”处于活动状态一样。

我想我可以将缓冲区的区域复制到一个临时缓冲区,启用YAML模式,对缓冲区进行字体化,然后复制所有文本属性。那行得通吗?如果是这样,我该如何复制文本属性,以及要复制的相关属性是什么?还是有更好的方法?


非Yaml字体如何实现?您是手动应用文本属性还是使用font-lock-mode?
马拉巴巴2014年

:在这篇文章中的链接和向上至少一个很好的选择那里块wisdomandwonder.com/link/8610/...
grettke

Answers:


10

最近,我遇到了类似的问题,我基本上想在文档中将代码片段的字体字体化,并从中获得一些其他资源。在您回答问题的最后,我遵循了所提到的方法,对我来说效果很好。我最终得到的功能如下所示

(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-faceface,(我们得到的face属性集,当我们使用上面的功能),而文本属性fontifiedt。以下函数接受上面函数返回的字符串,并进行所需的处理,以便将字符串插入字体(这是从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")))

这是我为找到的相同解决方案sx.el,但需要注意的是,它仅在目标缓冲区不使用font-lock-mode时才有效。
马拉巴巴2014年

对!我才意识到这对我有用,因为我在不使用字体锁的缓冲区中使用过(帮助缓冲区)
Iqbal Ansari 2014年

@Malabarba找到了一种启用启用了字体锁定模式的目标缓冲区的方法
Iqbal Ansari 2014年

非常感谢,效果很好
lunaryorn 2014年

不错哦!很高兴能为您提供帮助:)
Iqbal Ansari 2014年

3

Library Narrow Indirectnarrow-indirect)可以在这里提供帮助-查看标题注释。它依赖于:

  1. 变窄,将编辑范围限制为缓冲区的一部分,并且
  2. 间接缓冲区,将缓冲区复制到另一个缓冲区中,您可以更改该缓冲区的主要模式。

请注意,默认情况下禁用缩小功能,因为它被认为对初学者不利(默认绑定是C-x n n)。您可以通过将以下内容放入初始化文件来启用它:

(put 'narrow-to-region 'disabled nil)

您也可以myfn-narrow-indirectconf中查看我的手工艺品。


变窄实际上是否会影响字体锁定,即使其远离变窄区域的外部?字体锁定真的不会消除缓冲区限制吗?
lunaryorn 2014年

而且无论如何,维基软件包不是一个选择。
lunaryorn 2014年

此外,您无需disabled从命令中删除该属性即可从Emacs Lisp调用它。它仅影响交互式使用。
lunaryorn 2014年

0

我建议查看org-src-font-lock-fontify-block,它为org-mode源块提供此功能。似乎只是将相关部分复制到另一个缓冲区,在其中启用主模式,然后将字体化的文本复制回去。骇人听闻的,但似乎可行。


2
这个答案看起来更像是一条评论,因为它为解决问题提供了建议的方向,但不是完整的答案。请考虑将其更改为评论。
Dan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.