使用字体锁定功能的功能需要重新启动字体锁定模式
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-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
我对字体锁定模式的使用方式感到困惑。我的 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-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