help-gnu-emacs
[Top][All Lists]
Advanced

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

RE: Does emacs have a line numbering feature?


From: brianjiang
Subject: RE: Does emacs have a line numbering feature?
Date: Mon, 10 Sep 2007 11:11:37 +0800

I find sometimes the line number doesn't show. e.g., open a file, then use 
"occur" to find a text string and click occur buffer to jump to the next 
occurrence of string in another page, then the line number doesn't show. When I 
click the file buffer, the line numbers then show.

I find it is because the linum.el uses "window-start" and "window-end" to 
determine the which text lines are visible currently. But they are sometimes 
not reliable. See the text from the "help":

     Redisplay updates the window-start position (if you have not
     specified it explicitly since the previous redisplay)--for
     example, to make sure point appears on the screen.  Nothing except
     redisplay automatically changes the window-start position; if you
     move point, do not expect the window-start position to change in
     response until after the next redisplay.

So I change something in the linum.el as below. And it currently works well for 
me. Maybe there are some better solutions I don't know.

(defun linum-update ()
  "Update displayed line numbers for the current buffer."
  (save-excursion
    ;;(goto-char (window-start))            ;; brian: comment out
    (let (;;(line (line-number-at-pos))     ;; brian
          ;;(limit (1+ (window-end nil t))) ;; brian
          line
          limit
          pos
          w-h
          w-s
          (fmt (if (stringp linum-format) linum-format (linum-dynamic-format)))
          ov
          free)

      ;; brian: hack it...........................
      (setq pos (point))
      (setq w-s (window-start))
      (setq limit (1+ (window-end nil t)) )
      (when (or (> pos limit)
                (< pos w-s))
        (setq w-h (window-height))
        (forward-line w-h)
        (setq limit (point))
        ;; don't worry about nagitive position
        (goto-char pos)
        (forward-line (- 0 w-h))
        (setq w-s (point))
        )
      (goto-char w-s)
      (setq line (line-number-at-pos))
      ;; brian: end of hacking.....................
      
      (dolist (ov (overlays-in (point) limit))
        (when (overlay-get ov 'linum)
          (push ov free)))
      ;; Create an overlay (or reuse an existing one) for each visible
      ;; line in this window.
      (while (and (not (eobp)) (< (point) limit))
        (if (null free)
            (progn
              (setq ov (make-overlay (point) (point)))
              (overlay-put ov 'linum t)
              (push ov linum-overlays))
          (setq ov (pop free))
          (move-overlay ov (point) (point)))
        (overlay-put ov 'before-string (format fmt line))
        (overlay-put ov 'margin 'left-margin)
        (forward-line)
        (setq line (1+ line)))
      (mapc #'delete-overlay free))))


Regards,
Brian


-----Original Message-----
From: help-gnu-emacs-bounces+brianjiang=gdnt.com.cn@gnu.org 
[mailto:help-gnu-emacs-bounces+brianjiang=gdnt.com.cn@gnu.org] On Behalf Of 
Drew Adams
Sent: 2007年9月10日 6:59
To: Michael Trausch; help-gnu-emacs@gnu.org
Subject: RE: Does emacs have a line numbering feature?

> >>> (setq line-number-mode t)
> >>> (setq column-number-mode t)
> >> Yeah, I already had that in, and it works.  However, if I do 
> >> something similar for linum-mode, it seems to just ignore it.
> >
> > Yes, because setting a minor mode variable to activate it is the 
> > wrong thing to do.  It might work sometimes, but generally you 
> > should either customize the variable or use the minor mode function.  
> > So the code above should better be
> >
> >   (line-number-mode 1)
> >   (column-number-mode 1)
> >
> > because by convention a minor mode is turned on if the argument is 
> > positive.
> >
>
> Okay... I tried that, too, for linum-mode, and it doesn't work.  Am I 
> missing something obvious or am I an idiot?  :-P

Linum mode is a local minor mode: turning it on does so only for the current 
buffer.

Are you using Emacs 22? If so, then you can define a different command, 
`global-linum-mode', as follows (after loading linum.el):

(define-globalized-minor-mode global-linum-mode
   linum-mode (lambda nil (linum-mode 1)))

Then just put this in your .emacs: (global-linum-mode 1).

You can toggle line numbering in all buffers at once using command 
`global-linum-mode'. Even the minibuffer is affected, which might not be what 
you want.

You might ask Markus to add this command to the library.

If you don't have Emacs 22, then you will probably need to turn on the
(local) mode in each buffer, using a hook.

HTH.



_______________________________________________
help-gnu-emacs mailing list
help-gnu-emacs@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gnu-emacs




reply via email to

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