我对字体锁定模式如何参与感到困惑。我没有在我的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
答案 0 :(得分:2)
我认为您正在寻找的函数是font-lock-flush
和font-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