如何在Emacs中仅为特定模式或缓冲区过滤编译输出?

5
我有一个启用了html-mode的HTML页面,我调用函数sgml-validate检查是否存在标记错误。它基于compilation-mode实现。我想从编译输出中删除一些警告,所以我编写了一个函数,并将其挂钩到compilation-filter-hook(这个变量没有记录,但compilation-filter会调用它)。一切正常。我的问题是如何确保我的过滤器函数仅在我通过sgml-validate在HTML页面上启动编译过程时才被调用?
我看到两种方法,但都没有成功:
首先,我可以检查major-mode的值。但它总是返回compilation-mode,因为它在*compilation*缓冲区上启用了该模式。(我在grep+源代码中找到了一个过滤器函数,并检查了major-mode的值。我无法弄清楚它是如何正确工作的。)
另一个想法是只将我的过滤器函数挂钩到HTML文件的缓冲区,但由于编译过程的输出会进入单独的缓冲区,所以无法起到作用。
2个回答

1

同时,我发现compilation-start接受一个可选参数mode,它将是编译缓冲区的主要模式。因此,我可以创建一个从compilation-mode派生的主要模式,并在其中定义我的过滤函数,现在挂钩到正确的缓冲区。

唯一的问题是sgml-validate现在不允许我在compilation-start上设置mode参数,但这是另一个问题。

(当然,我不认为这是最终解决方案。)


1

听起来你可以建议smgl-validate在执行所有其他操作之前进行过滤。例如:

(defadvice sgml-validate(around fix-filtering command activate)
    (let((return-value ad-do-it))
      (filter-function return-value))))

谢谢,我会看看的。在我的情况下,我认为我应该使用around-advise,因为我想过滤生成的输出,并仍需要sgml-validate返回的编译缓冲区名称。 - viam0Zah
在这种情况下,您可能需要的是建议而不是围绕建议 - 除非您需要在调用sgml-validate之前和之后执行操作。 - Nathaniel Flath
但是当使用 after-advise 后, 我能否获取 sgml-validate 的返回值呢?它会告诉我编译缓冲区的名称,否则我就无法在输出上运行过滤函数。 - viam0Zah
啊,没错。你可能想要使用around-advise。 - Nathaniel Flath
这个回答的最后一点说明。在过滤函数中,我不得不将 inhibit-read-only 设置为 t,因为编译过程完成后,编译缓冲区会变为只读状态。 - viam0Zah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接