]> code.delx.au - gnu-emacs-elpa/commitdiff
Use the line-prefix property
authorDmitry Gutov <dgutov@yandex.ru>
Sun, 27 Jan 2013 16:58:48 +0000 (20:58 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Sun, 27 Jan 2013 16:58:48 +0000 (20:58 +0400)
Intead of lots of tiny overlays

diff-hl.el

index 63d4293fc324dc713e602a313d50513cecdfbcfd..732ef20be2addec9c26c8841a781be953f279061 100644 (file)
             (setq len 1)\r
             (cl-incf line))\r
           (forward-line (- line current-line))\r
-          (setq current-line line)\r
           (let ((hunk-beg (point)))\r
-            (while (cl-plusp len)\r
-              (let ((o (make-overlay (point) (line-end-position))))\r
-                (overlay-put o 'diff-hl t)\r
-                (overlay-put o 'before-string\r
-                             (diff-hl-fringe-spec\r
-                              type\r
-                              (cond\r
-                               ((not diff-hl-draw-borders) 'empty)\r
-                               ((and (= len 1) (= line current-line)) 'single)\r
-                               ((= len 1) 'bottom)\r
-                               ((= line current-line) 'top)\r
-                               (t 'middle)))))\r
-              (forward-line 1)\r
-              (cl-incf current-line)\r
-              (cl-decf len))\r
-            (let ((h (make-overlay hunk-beg (point)))\r
+            (forward-line len)\r
+            (setq current-line (+ line len))\r
+            (let ((h (make-overlay hunk-beg (1- (point))))\r
                   (hook '(diff-hl-overlay-modified)))\r
               (overlay-put h 'diff-hl t)\r
-              (overlay-put h 'diff-hl-hunk t)\r
+              (if (= len 1)\r
+                  (overlay-put h 'before-string (diff-hl-fringe-spec type 'single))\r
+                (overlay-put h 'before-string (diff-hl-fringe-spec type 'top))\r
+                (overlay-put h 'line-prefix (diff-hl-fringe-spec type 'middle))\r
+                (overlay-put h 'after-string (diff-hl-fringe-spec type 'bottom)))\r
               (overlay-put h 'modification-hooks hook)\r
-              (overlay-put h 'insert-in-front-hooks hook))))))))\r
+              (overlay-put h 'insert-in-front-hooks hook)\r
+              (overlay-put h 'insert-behind-hooks hook))))))))\r
 \r
 (defun diff-hl-remove-overlays ()\r
   (dolist (o (overlays-in (point-min) (point-max)))\r
     (when (overlay-get o 'diff-hl) (delete-overlay o))))\r
 \r
 (defun diff-hl-overlay-modified (ov after-p _beg _end &optional _length)\r
-  "Delete the overlay and all our overlays inside it."\r
+  "Delete the overlay."\r
   (unless after-p\r
     (when (overlay-buffer ov)\r
-      (save-restriction\r
-        (narrow-to-region (overlay-start ov) (overlay-end ov))\r
-        (diff-hl-remove-overlays))\r
       (delete-overlay ov))))\r
 \r
 (defvar diff-hl-timer nil)\r
@@ -300,7 +288,7 @@ in the source file, or the last line of the hunk above it."
 \r
 (defun diff-hl-hunk-overlay-at (pos)\r
   (cl-loop for o in (overlays-at pos)\r
-           when (overlay-get o 'diff-hl-hunk)\r
+           when (overlay-get o 'diff-hl)\r
            return o))\r
 \r
 (defun diff-hl-next-hunk (&optional backward)\r