emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/font_lock_large_files fe0e53d963: New option: font-lock-large-fi


From: Dmitry Gutov
Subject: scratch/font_lock_large_files fe0e53d963: New option: font-lock-large-files
Date: Fri, 12 Aug 2022 06:46:23 -0400 (EDT)

branch: scratch/font_lock_large_files
commit fe0e53d963899a16e0dd1bbc1ba10a6b59f7989e
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    New option: font-lock-large-files
    
    * lisp/font-lock.el (font-lock-fontify-region): Use it.
    (font-lock-large-files): New option (bug#56682).
    
    * src/xdisp.c (handle_fontified_prop): Don't apply narrowing here.
---
 lisp/font-lock.el | 30 +++++++++++++++++++++++++++++-
 src/xdisp.c       | 14 --------------
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 7eb5a414fe..88bd6cbc5b 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -254,6 +254,23 @@ decoration for buffers in C++ mode, and level 1 decoration 
otherwise."
                                      (integer :tag "level" 1)))))
   :group 'font-lock)
 
+(defcustom font-lock-large-files t
+  "How to fontify large files.
+When t, apply highlighting without restriction.
+
+When its a cons with car equal to `head', fontify the first (cdr
+value) number of characters only.
+
+When its a cons with car equal to `narrow', narrow the buffer
+to (cdr value) characters around point. That speeds up
+fontification at the expense of possible misdetection of syntax
+context."
+  :type '(choice (const :tag "full" t)
+                 (cons :tag "head"
+                       (const head) (integer :tag "length" 1000000))
+                 (cons :tag "narrow"
+                       (const narrow) (integer :tag "width" 15000))))
+
 (defcustom font-lock-ignore nil
   "Rules to selectively disable fontifications due to `font-lock-keywords'.
 If non-nil, the value should be a list of condition sets of the form
@@ -996,7 +1013,18 @@ If LOUDLY is non-nil, print status messages while 
fontifying.
 This works by calling `font-lock-fontify-region-function'."
   (font-lock-set-defaults)
   (save-restriction
-    (unless font-lock-dont-widen (widen))
+    (pcase-exhaustive font-lock-large-files
+      (`t nil)
+      (`(head . ,length)
+       (setq beg (min length beg)
+             end (min length end)))
+      (`(narrow . ,width)
+       (narrow-to-region (max (point-min) (* (1- (/ beg width)) width))
+                         (min (point-max) (* (1+ (/ beg width)) width)))
+       (setq end (min end (point-max)))))
+    (unless (or font-lock-dont-widen
+                (eq (car-safe font-lock-large-files) 'narrow))
+      (widen))
     (funcall font-lock-fontify-region-function beg end loudly)))
 
 (defun font-lock-unfontify-region (beg end)
diff --git a/src/xdisp.c b/src/xdisp.c
index 855f48f2bd..1fcff2c2e3 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4392,20 +4392,6 @@ handle_fontified_prop (struct it *it)
 
       eassert (it->end_charpos == ZV);
 
-      if (current_buffer->long_line_optimizations_p)
-       {
-         ptrdiff_t begv = it->narrowed_begv;
-         ptrdiff_t zv = it->narrowed_zv;
-         ptrdiff_t charpos = IT_CHARPOS (*it);
-         if (charpos < begv || charpos > zv)
-           {
-             begv = get_narrowed_begv (it->w, charpos);
-             zv = get_narrowed_zv (it->w, charpos);
-           }
-         narrow_to_region_internal (make_fixnum (begv), make_fixnum (zv), 
true);
-         specbind (Qrestrictions_locked, Qt);
-       }
-
       /* Don't allow Lisp that runs from 'fontification-functions'
         clear our face and image caches behind our back.  */
       it->f->inhibit_clear_image_cache = true;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]