annotate lisp/linum.el @ 106768:21fd634f447a

Make line<->pixel_y conversion macros aware of native menu/tool bars. They are placed above the internal border. This supersedes special treatment of native tool bars in the display code. This fixes wrong display position of native menu bars and bogus mouse highlighting of native tool bars, both of which can be found when internal border width is large. Also it fixes wrong flashed part on visible bell with native menu bars. * frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro. (FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo windows above internal border. * window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros. (WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo windows above internal border. * xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat tool bar windows specially. * xfns.c (x_set_tool_bar_lines): Take account of menu bar height. * xterm.c (x_after_update_window_line): Don't treat tool bar windows specially. (XTflash): Take account of menu bar height. * w32term.c (x_after_update_window_line): Don't treat tool bar windows specially.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Sat, 09 Jan 2010 13:16:32 +0900
parents 5418676a97db
children 1d1d5d9bd884
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
1 ;;; linum.el --- display line numbers in the left margin
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
2
100908
a9dc0e7c3f2b Add 2009 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 97899
diff changeset
3 ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
4
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
5 ;; Author: Markus Triska <markus.triska@gmx.at>
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
6 ;; Maintainer: FSF
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
7 ;; Keywords: convenience
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
8
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
9 ;; This file is part of GNU Emacs.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
10
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
14 ;; (at your option) any later version.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
15
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
19 ;; GNU General Public License for more details.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
20
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
21 ;; You should have received a copy of the GNU General Public License
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
23
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
24 ;;; Commentary:
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
25
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
26 ;; Display line numbers for the current buffer.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
27 ;;
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
28 ;; Toggle display of line numbers with M-x linum-mode. To enable
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
29 ;; line numbering in all buffers, use M-x global-linum-mode.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
30
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
31 ;;; Code:
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
32
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
33 (defconst linum-version "0.9x")
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
34
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
35 (defvar linum-overlays nil "Overlays used in this buffer.")
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
36 (defvar linum-available nil "Overlays available for reuse.")
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
37 (defvar linum-before-numbering-hook nil
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
38 "Functions run in each buffer before line numbering starts.")
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
39
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
40 (mapc #'make-variable-buffer-local '(linum-overlays linum-available))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
41
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
42 (defgroup linum nil
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
43 "Show line numbers in the left margin."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
44 :group 'convenience)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
45
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
46 ;;;###autoload
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
47 (defcustom linum-format 'dynamic
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
48 "Format used to display line numbers.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
49 Either a format string like \"%7d\", `dynamic' to adapt the width
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
50 as needed, or a function that is called with a line number as its
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
51 argument and should evaluate to a string to be shown on that line.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
52 See also `linum-before-numbering-hook'."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
53 :group 'linum
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
54 :type 'sexp)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
55
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
56 (defface linum
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
57 '((t :inherit (shadow default)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
58 "Face for displaying line numbers in the display margin."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
59 :group 'linum)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
60
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
61 (defcustom linum-eager t
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
62 "Whether line numbers should be updated after each command.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
63 The conservative setting `nil' might miss some buffer changes,
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
64 and you have to scroll or press \\[recenter-top-bottom] to update the numbers."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
65 :group 'linum
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
66 :type 'boolean)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
67
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
68 (defcustom linum-delay nil
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
69 "Delay updates to give Emacs a chance for other changes."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
70 :group 'linum
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
71 :type 'boolean)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
72
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
73 ;;;###autoload
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
74 (define-minor-mode linum-mode
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
75 "Toggle display of line numbers in the left margin."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
76 :lighter "" ; for desktop.el
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
77 (if linum-mode
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
78 (progn
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
79 (if linum-eager
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
80 (add-hook 'post-command-hook (if linum-delay
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
81 'linum-schedule
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
82 'linum-update-current) nil t)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
83 (add-hook 'after-change-functions 'linum-after-change nil t))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
84 (add-hook 'window-scroll-functions 'linum-after-scroll nil t)
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
85 ;; Using both window-size-change-functions and
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
86 ;; window-configuration-change-hook seems redundant. --Stef
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
87 ;; (add-hook 'window-size-change-functions 'linum-after-size nil t)
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
88 (add-hook 'change-major-mode-hook 'linum-delete-overlays nil t)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
89 (add-hook 'window-configuration-change-hook
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
90 ;; FIXME: If the buffer is shown in N windows, this
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
91 ;; will be called N times rather than once. We should use
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
92 ;; something like linum-update-window instead.
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
93 'linum-update-current nil t)
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
94 (linum-update-current))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
95 (remove-hook 'post-command-hook 'linum-update-current t)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
96 (remove-hook 'post-command-hook 'linum-schedule t)
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
97 ;; (remove-hook 'window-size-change-functions 'linum-after-size t)
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
98 (remove-hook 'window-scroll-functions 'linum-after-scroll t)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
99 (remove-hook 'after-change-functions 'linum-after-change t)
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
100 (remove-hook 'window-configuration-change-hook 'linum-update-current t)
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
101 (remove-hook 'change-major-mode-hook 'linum-delete-overlays t)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
102 (linum-delete-overlays)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
103
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
104 ;;;###autoload
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
105 (define-globalized-minor-mode global-linum-mode linum-mode linum-on)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
106
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
107 (defun linum-on ()
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
108 (unless (minibufferp)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
109 (linum-mode 1)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
110
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
111 (defun linum-delete-overlays ()
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
112 "Delete all overlays displaying line numbers for this buffer."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
113 (mapc #'delete-overlay linum-overlays)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
114 (setq linum-overlays nil)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
115 (dolist (w (get-buffer-window-list (current-buffer) nil t))
105135
708c5f10a0be * linum.el (linum-delete-overlays, linum-update-window):
Juanma Barranquero <lekktu@gmail.com>
parents: 104365
diff changeset
116 (set-window-margins w 0 (cdr (window-margins w)))))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
117
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
118 (defun linum-update-current ()
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
119 "Update line numbers for the current buffer."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
120 (linum-update (current-buffer)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
121
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
122 (defun linum-update (buffer)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
123 "Update line numbers for all windows displaying BUFFER."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
124 (with-current-buffer buffer
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
125 (when linum-mode
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
126 (setq linum-available linum-overlays)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
127 (setq linum-overlays nil)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
128 (save-excursion
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
129 (mapc #'linum-update-window
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
130 (get-buffer-window-list buffer nil 'visible)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
131 (mapc #'delete-overlay linum-available)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
132 (setq linum-available nil))))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
133
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
134 (defun linum-update-window (win)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
135 "Update line numbers for the portion visible in window WIN."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
136 (goto-char (window-start win))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
137 (let ((line (line-number-at-pos))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
138 (limit (window-end win t))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
139 (fmt (cond ((stringp linum-format) linum-format)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
140 ((eq linum-format 'dynamic)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
141 (let ((w (length (number-to-string
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
142 (count-lines (point-min) (point-max))))))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
143 (concat "%" (number-to-string w) "d")))))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
144 (width 0))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
145 (run-hooks 'linum-before-numbering-hook)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
146 ;; Create an overlay (or reuse an existing one) for each
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
147 ;; line visible in this window, if necessary.
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
148 (while (and (not (eobp)) (<= (point) limit))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
149 (let* ((str (if fmt
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
150 (propertize (format fmt line) 'face 'linum)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
151 (funcall linum-format line)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
152 (visited (catch 'visited
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
153 (dolist (o (overlays-in (point) (point)))
101274
4bcf5c96d5ee * linum.el (linum-update-window): Use `delq' instead of `delete';
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
154 (when (equal-including-properties
4bcf5c96d5ee * linum.el (linum-update-window): Use `delq' instead of `delete';
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
155 (overlay-get o 'linum-str) str)
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
156 (unless (memq o linum-overlays)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
157 (push o linum-overlays))
101274
4bcf5c96d5ee * linum.el (linum-update-window): Use `delq' instead of `delete';
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
158 (setq linum-available (delq o linum-available))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
159 (throw 'visited t))))))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
160 (setq width (max width (length str)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
161 (unless visited
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
162 (let ((ov (if (null linum-available)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
163 (make-overlay (point) (point))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
164 (move-overlay (pop linum-available) (point) (point)))))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
165 (push ov linum-overlays)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
166 (overlay-put ov 'before-string
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
167 (propertize " " 'display `((margin left-margin) ,str)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
168 (overlay-put ov 'linum-str str))))
106225
5418676a97db (linum-update-window): Ignore intangible (bug#4996).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105135
diff changeset
169 ;; Text may contain those nasty intangible properties, but that
5418676a97db (linum-update-window): Ignore intangible (bug#4996).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105135
diff changeset
170 ;; shouldn't prevent us from counting those lines.
5418676a97db (linum-update-window): Ignore intangible (bug#4996).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105135
diff changeset
171 (let ((inhibit-point-motion-hooks t))
5418676a97db (linum-update-window): Ignore intangible (bug#4996).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105135
diff changeset
172 (forward-line))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
173 (setq line (1+ line)))
105135
708c5f10a0be * linum.el (linum-delete-overlays, linum-update-window):
Juanma Barranquero <lekktu@gmail.com>
parents: 104365
diff changeset
174 (set-window-margins win width (cdr (window-margins win)))))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
175
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
176 (defun linum-after-change (beg end len)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
177 ;; update overlays on deletions, and after newlines are inserted
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
178 (when (or (= beg end)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
179 (= end (point-max))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
180 (string-match-p "\n" (buffer-substring-no-properties beg end)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
181 (linum-update-current)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
182
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
183 (defun linum-after-scroll (win start)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
184 (linum-update (window-buffer win)))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
185
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
186 ;; (defun linum-after-size (frame)
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
187 ;; (linum-after-config))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
188
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
189 (defun linum-schedule ()
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
190 ;; schedule an update; the delay gives Emacs a chance for display changes
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
191 (run-with-idle-timer 0 nil #'linum-update-current))
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
192
104365
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
193 ;; (defun linum-after-config ()
fe22bf79af7f (linum-mode): window-size-change-functions is redundant.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101274
diff changeset
194 ;; (walk-windows (lambda (w) (linum-update (window-buffer w))) nil 'visible))
97899
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
195
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
196 (defun linum-unload-function ()
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
197 "Unload the Linum library."
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
198 (global-linum-mode -1)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
199 ;; continue standard unloading
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
200 nil)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
201
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
202 (provide 'linum)
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
203
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
204 ;; arch-tag: dea45631-ed3c-4867-8b49-1c41c80aec6a
92d8f6972f8a Fix EOL mishap.
Juanma Barranquero <lekktu@gmail.com>
parents: 97895
diff changeset
205 ;;; linum.el ends here