Emacs 使用字体锁定功能的函数需要重新启动字体锁定模式
我对字体锁定模式如何使用感到困惑。我没有在我的Emacs 使用字体锁定功能的函数需要重新启动字体锁定模式,emacs,font-lock,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-key
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字体锁定模式两次后生效。第一次禁用字体锁定模式第二次启动它。但它现在不是以主模式运行,因为缓冲区仍然显示缓冲区以前处于的任何模式。好的,我猜这个函数设置了一些值,并且只在模式重新启动时生效。我想也许我需要在字体锁定模式中添加一个钩子,如下所示:
(add-hook
'font-lock-mode
'testregexfunc)
不。。。什么都不做。我需要做什么才能不必重新启动字体锁定模式使功能正常工作
我从这里得到了这个函数,并对它进行了一些修改。我不了解它的大部分定义,关于字体锁定的文档对我帮助不大:
我认为您正在寻找的功能是字体锁定刷新
和字体锁定确保
,它们一起声明缓冲区的字体锁定过期,然后重新验证它。所以,你可以改变你的函数如下
(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
将字体锁定功能添加到主模式挂钩,而不是字体锁定模式挂钩,怎么样?我也试过了,我仍然需要重新启动字体锁定模式。我尝试了(添加hook'haskell mode'testregexfunc)
,但都是一样的。好的,谢谢。这解决了手动重新启动字体锁定模式的问题。你还可以告诉我,一旦我使用某个主要模式,我需要做什么来执行这个函数吗?我仍然需要手动调用函数,即使我把它放在一个钩子里。。。例如haskell模式。一个简单的迂回解决方案是定义一个次要模式并在主要模式挂钩中启用它,例如。否则,我认为您需要修改模式的字体化规则,以避免字体化发生两次。不过我不确定,这需要更深入的研究。此外,如果您想永久更改模式的字体锁定,您可以在模式的配置中使用font-lock add keywords'mode
,无需将其包装到函数中