强制对另一个缓冲区进行字体化



假设我已经在名为foo的缓冲区中注册了一个函数作为字体化。

使用抖动锁定模式

(jit-lock-register #'(lambda (start end)
(message "Jit!")))

从另一个缓冲区,我想强制该字体化函数(以及所有注册的字体化函数(。

我正在使用函数font-lock-flush,在下面:

(with-current-buffer "foo"
(font-lock-flush)) 

没有任何成功。 也就是说,当我在不同于foo的缓冲区中评估(with-current-buffer "foo"...)时,不会打印任何消息。

我希望表达式强制匿名函数在缓冲区foo中注册为字体化。相反,不会调用该函数 - 我在*Message*缓冲区中看不到任何消息。


附加说明我还尝试了其他强制功能,例如:jit-lock-fontify-now.尽管如此,不会打印任何消息

<小时 />

如何重现

简单地说,打开两个缓冲区:foobar

foo内容:

(jit-lock-register #'(lambda (start end)
(message "Jit!")))

并评估缓冲区。

现在,每次需要对缓冲区进行字体化时,都会打印一条消息("Jit!"(。

相反,缓冲区的内容bar

(with-current-buffer "foo"
(font-lock-flush))  ;; or jit-lock-fontify-now

计算(从缓冲区bar(该表达式。 您应该注意到没有打印任何消息,尽管表达式应该在foo中强制字体化。

jit-lock-refontify is a compiled Lisp function in ‘jit-lock.el’.
(jit-lock-refontify &optional BEG END)
Force refontification of the region BEG..END (default whole buffer).

实验上,这可以满足您的需求:

(with-current-buffer "foo"
(jit-lock-refontify))

foo中运行jit-lock-register后,缓冲区foo被标记为完全"抖动锁定"(更具体地说,它是在紧接着的重新显示周期中完成的,并且完成是因为缓冲区可能完全显示(。 在此之后运行jit-lock-fontify-now将无济于事,因为那里没有什么需要"抖动锁定"的。 运行font-lock-flush也不会有什么不同,因为大概foofundamental-mode所以font-lock-mode没有启用,所以font-lock-flush看到还没有应用字体锁定突出显示,因此没有什么要刷新的。

最新更新