移除所有字体锁面(除了flyspell不正确的flyspel副本)



为了从使用2秒空闲定时器(自定义函数会梳理缓冲区(设置的自定义函数的运行时间中减少大约.3秒,我使用(font-lock-mode -1)禁用字体锁定模式。副作用是我的flyspell-incorrectflyspell-duplicate被移除。使用(flyspell-region (window-start) (window-end))再次将这些flyspell字体放回原处的成本远远高于.3秒。因此,我想到了一个折中的办法,删除了除flyspell-incorrectflyspell-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*")))

相关内容

  • 没有找到相关文章

最新更新