GNU bug report logs - #743
23.0.60; linum-mode margin display wrong

Previous Next

Package: emacs;

Reported by: bojohan+mail <at> dd.chalmers.se (Johan Bockgård)

Date: Tue, 19 Aug 2008 19:35:03 UTC

Severity: normal

Done: Chong Yidong <cyd <at> stupidchicken.com>

Bug is archived. No further changes may be made.

Full log


Message #25 received at 743 <at> emacsbugs.donarmstrong.com (full text, mbox):

From: Markus Triska <markus.triska <at> gmx.at>
To: Chong Yidong <cyd <at> stupidchicken.com>
Cc: 743 <at> debbugs.gnu.org
Subject: Re: 23.0.60; linum-mode margin display wrong
Date: Thu, 21 Aug 2008 21:49:00 -0400
Chong Yidong <cyd <at> stupidchicken.com> writes:

> Could you try to debug this?  I'm not sure if it's a linum.el bug or a
> redisplay bug.

The following patch fixes this problem for me. One remaining issue is
that overlays for line numbers inherit text properties. For example:

   $ emacs -Q -f fundamental-mode -f linum-mode

   M-o u

then insert anything, and the line number is also underlined. How to
best fix this? Maybe overlays should not inherit properties if they only
affect the display margins.


2008-08-22  Markus Triska  <markus.triska <at> gmx.at>

	* linum.el (linum-delay): Disable - it should no longer be
	necessary, and can lead to longer delays.
	(linum-update-window): Renumber if margin width has changed.

diff --git a/lisp/linum.el b/lisp/linum.el
index 41fe2de..db07b00 100644
--- a/lisp/linum.el
+++ b/lisp/linum.el
@@ -30,7 +30,7 @@
 
 ;;; Code:
 
-(defconst linum-version "0.9wx")
+(defconst linum-version "0.9wz")
 
 (defvar linum-overlays nil "Overlays used in this buffer.")
 (defvar linum-available nil "Overlays available for reuse.")
@@ -65,7 +65,7 @@ and you have to scroll or press \\[recenter-top-bottom] to update the numbers."
   :group 'linum
   :type 'boolean)
 
-(defcustom linum-delay t
+(defcustom linum-delay nil
   "Delay updates to give Emacs a chance for other changes."
   :group 'linum
   :type 'boolean)
@@ -131,39 +131,38 @@ and you have to scroll or press \\[recenter-top-bottom] to update the numbers."
   "Update line numbers for the portion visible in window WIN."
   (goto-char (window-start win))
   (let ((line (line-number-at-pos))
-        (limit (1+ (window-end win t)))
+        (limit (window-end win t))
         (fmt (cond ((stringp linum-format) linum-format)
                    ((eq linum-format 'dynamic)
                     (let ((w (length (number-to-string
                                       (count-lines (point-min) (point-max))))))
                       (concat "%" (number-to-string w) "d")))))
-        (width 0)
-        visited
-        ov)
+        (width 0))
     (run-hooks 'linum-before-numbering-hook)
     ;; Create an overlay (or reuse an existing one) for each
     ;; line visible in this window, if necessary.
-    (while (and (not (eobp)) (< (point) limit))
-      (setq visited nil)
-      (dolist (o (overlays-in (point) (point)))
-        (when (eq (overlay-get o 'linum-line) line)
-          (unless (memq o linum-overlays)
-            (push o linum-overlays))
-          (setq linum-available (delete o linum-available))
-          (setq visited t)))
-      (let ((str (if fmt
-                     (propertize (format fmt line) 'face 'linum)
-                   (funcall linum-format line))))
+    (while (and (not (eobp)) (<= (point) limit))
+      (let* ((str (if fmt
+                      (propertize (format fmt line) 'face 'linum)
+                    (funcall linum-format line)))
+             (visited (catch 'visited
+                        (dolist (o (overlays-in (point) (point)))
+                          (when (string= (overlay-get o 'linum-str) str)
+                            (unless (memq o linum-overlays)
+                              (push o linum-overlays))
+                            (setq linum-available (delete o linum-available))
+                            (throw 'visited t))))))
         (setq width (max width (length str)))
         (unless visited
-          (if (null linum-available)
-              (setq ov (make-overlay (point) (point)))
-            (setq ov (pop linum-available))
-            (move-overlay ov (point) (point)))
-          (push ov linum-overlays)
-          (setq str (propertize " " 'display `((margin left-margin) ,str)))
-          (overlay-put ov 'before-string str)
-          (overlay-put ov 'linum-line line)))
+          (let (ov)
+            (if (null linum-available)
+                (setq ov (make-overlay (point) (point)))
+              (setq ov (pop linum-available))
+              (move-overlay ov (point) (point)))
+            (push ov linum-overlays)
+            (overlay-put ov 'before-string
+                         (propertize " " 'display `((margin left-margin) ,str)))
+            (overlay-put ov 'linum-str str))))
       (forward-line)
       (setq line (1+ line)))
     (set-window-margins win width)))





This bug report was last modified 16 years and 271 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.