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

时间:2017-12-11 21:40:09

标签: emacs font-lock

我对字体锁定模式如何参与感到困惑。我没有在我的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

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找的函数是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