为了从使用2秒空闲定时器(自定义函数会梳理缓冲区(设置的自定义函数的运行时间中减少大约.3
秒,我使用(font-lock-mode -1)
禁用字体锁定模式。副作用是我的flyspell-incorrect
和flyspell-duplicate
被移除。使用(flyspell-region (window-start) (window-end))
再次将这些flyspell字体放回原处的成本远远高于.3
秒。因此,我想到了一个折中的办法,删除了除flyspell-incorrect
和flyspell-duplicate
之外的所有字体锁定字体。有没有办法在font-core
的以下代码片段中添加一个条件,以保留flyspell字体,但删除其他所有内容?
;; Turn off Font Lock mode.
(unless mode
;; Remove `font-lock-face' as an alias for the `face' property.
(set (make-local-variable 'char-property-alias-alist)
(copy-tree char-property-alias-alist))
(let ((elt (assq 'face char-property-alias-alist)))
(when elt
(setcdr elt (remq 'font-lock-face (cdr elt)))
(when (null (cdr elt))
(setq char-property-alias-alist
(delq elt char-property-alias-alist))))))
(font-lock-mode -1)
不会删除飞行拼写错误和飞行拼写重复的东西。它只是禁用了它们的视觉效果(使用您发布的代码(。所以你可以在之后重新设置char-property-alias-alist
,这些飞行咒语会"立即"再次显示。
我真的很想知道你在做什么,因为字体锁定而减慢了0.3秒。也许还有另一种方法可以避免(font-lock-mode -1)
的0.3秒,因为启用/禁用字体锁定非常昂贵。
令我惊讶的是,flyspell使用了覆盖,而不是字体锁定。出现问题的原因是我未正确使用remove-overlays
,因为我未包含一个精确的值。remove-overlays
的使用不当会导致该区域的整个小猫卡博德被移除,包括飞行咒语覆盖。以下相关线程描述了如何通过确保在使用remove-overlays
时始终包含正确的值(如果存在值(来避免此问题:
https://stackoverflow.com/a/23773934/2112489
这里有一个有用的小功能,可以查看幕后发生了什么:
(defun reveal-overlays (&optional beg end)
(interactive)
(let* (
(beg (if beg beg (window-start)))
(end (if end end (window-end))))
(overlay-recenter end)
(dolist (o (overlays-in beg end))
(when o
(message "%sn%sn" (overlay-properties o) o)))
(switch-to-buffer "*Messages*")))