使用字体锁定功能的功能需要重新启动字体锁定模式

function using font lock functions requires restarting font lock mode

我对字体锁定模式的使用方式感到困惑。我的 init.el 中没有启动字体锁定模式的语句,但显然它总是作为次要模式运行。此外,我有以下功能:

(defun testregexfunc ()
  (interactive)
  (make-variable-buffer-local 'font-lock-extra-managed-props)
  (add-to-list 'font-lock-extra-managed-props 'invisible)
  (font-lock-add-keywords nil
                          '(("\(\[\)\([a-zA-Z0-9_]+\)\(\]\)"
                             (1 '(face nil invisible t))
                             (3 '(face nil invisible t))))))

它使用特定于字体锁定的东西。但它只有在我执行 M-x testregexfunc 后跟 M-x font-lock-mode 两次后才会生效。第一次禁用字体锁定模式,第二次启动它。但它现在不是 运行 作为主要模式,因为缓冲区仍然显示缓冲区之前处于的任何模式。好的,所以我猜该函数设置了一些值,并且仅在模式重新启动后才生效。我想也许我需要像这样为字体锁定模式添加一个钩子:

(add-hook
 'font-lock-mode
 'testregexfunc)

不...什么都不做。我需要做什么才能不必重新启动字体锁定模式来使该功能正常工作?

我从这里得到了那个函数并对其进行了一些修改。我不明白它的大部分定义,关于字体锁定的文档对我帮助不大:

https://emacs.stackexchange.com/questions/28154/using-font-lock-regexp-groups

我认为您正在寻找的函数是 font-lock-flushfont-lock-ensure,它们一起声明缓冲区的字体锁定已过时,然后重新设置它。因此,您可以按如下方式更改函数,

(defun testregexfunc (arg)
  "Fontify buffer with new rules. With prefix arg restore default fontification."
  (interactive "P")
  (if arg
      (font-lock-refresh-defaults)      ;restore the defaults for the buffer
    (make-variable-buffer-local 'font-lock-extra-managed-props)
    (add-to-list 'font-lock-extra-managed-props 'invisible)
    (font-lock-add-keywords nil ;make the "[" and "]" invisible
                            '(("\(\[\)\([a-zA-Z0-9_]+\)\(\]\)"
                               (1 '(face nil invisible t))
                               (3 '(face nil invisible t)))))
    (font-lock-flush)                   ;declare the fontification out-of-date
    (font-lock-ensure)))                ;fontify the buffer using new rules