1

为了.3从使用 2 秒空闲计时器(自定义函数梳理缓冲区)设置的自定义函数的运行时间缩短大约几秒钟,我使用(font-lock-mode -1). 副作用是我的flyspell-incorrect并被flyspell-duplicate删除。将那些 flyspell 字体重新放回原处的(flyspell-region (window-start) (window-end))成本远远超过 .3几秒钟。因此,我正在考虑通过删除 flyspell-incorrectand之外的所有字体锁定字体来实现中间立场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))))))
4

2 回答 2

0

令我惊讶的是,flyspell 使用了覆盖而不是字体锁定。我的问题发生是因为我remove-overlays没有包含一个存在的精确值而使用不当。使用不当remove-overlays会移除该地区的整个小猫卡布多 - 包括 flyspell 覆盖。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 "%s\n%s\n" (overlay-properties o) o)))
    (switch-to-buffer "*Messages*")))
于 2014-05-21T04:28:49.560 回答
0

(font-lock-mode -1)不会删除 flyspell-incorrect 和 flyspell-duplicate thingies。它只是禁用了它们的视觉效果(使用您发布的代码)。所以你可以在之后重新设置char-property-alias-alist,那些flyspell的东西将“立即”再次显示出来。

我确实想知道你在做什么,字体锁定会减慢 0.3 秒。也许还有另一种方法可以避免这 0.3 秒,(font-lock-mode -1)因为启用/禁用字体锁定非常昂贵。

于 2014-05-20T15:15:58.040 回答