强制另一个缓冲区的字体化

Force fontification of another buffer

让我们假设我已经在名为 foo.

的缓冲区中注册了一个 fontification 函数

使用 jit-lock-mode:

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

我想从另一个缓冲区强制执行字体化功能(以及所有已注册的字体化功能)。

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

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

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

我希望表达式强制匿名函数在缓冲区 foo 中注册为 fontification。相反,该函数未被调用——我在 *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.

内进行字体化

foo运行jit-lock-register之后,缓冲区foo被标记为完全"jit-locked"(更具体地说,它是在立即重新显示循环中完成的紧随其后,并且它已完成,因为缓冲区可能已完全显示)。 运行 jit-lock-fontify-now 之后什么都不做,因为那里没有什么需要 "jit-locked"。 运行 font-lock-flush 也不会有所作为,因为大概 foofundamental-mode 中,所以 font-lock-mode 未启用,所以 font-lock-flush 认为没有尚未应用字体锁定突出显示,因此无需刷新。

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))