diff options
| author | Eli Zaretskii | 2017-07-08 10:49:36 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2017-07-08 10:49:36 +0300 |
| commit | 5df239fc6ffbbb16ea6e5546fbec1508bf2cb4b7 (patch) | |
| tree | 9b1b8baff1c3ca9c9c560460b34a7951723f621c /lisp/simple.el | |
| parent | b8ead34f5df92b771520f4d090ff6cde49ca5705 (diff) | |
| parent | 13786d5e7d0aa0a37d7f81d1a1b82eddd3472796 (diff) | |
| download | emacs-5df239fc6ffbbb16ea6e5546fbec1508bf2cb4b7.tar.gz emacs-5df239fc6ffbbb16ea6e5546fbec1508bf2cb4b7.zip | |
Support display of line numbers natively
This merges branch 'line-numbers'.
* src/buffer.c (disable_line_numbers_overlay_at_eob): New
function.
* src/lisp.h (disable_line_numbers_overlay_at_eob): Add prototype.
* src/dispextern.h (struct it): New members pt_lnum, lnum,
lnum_bytepos, lnum_width, and lnum_pixel_width.
* src/indent.c (line_number_display_width): New function,
refactored from line-number width calculations in vertical-motion.
(Fvertical_motion): Call line_number_display_width when the width
of line-number display is needed.
(Fline_number_display_width): New defun.
(syms_of_indent): Defsubr it.
* src/indent.c (Fvertical_motion): Help C-n/C-p estimate correctly
the width used up by line numbers by looking near the window-start
point. If window-start is outside of the accessible portion,
temporarily widen the buffer.
* src/term.c (produce_glyphs): Adjust tab stops for the horizontal
space taken by the line-number display.
* src/xdisp.c (display_count_lines_logically)
(display_count_lines_visually, maybe_produce_line_number)
(should_produce_line_number, row_text_area_empty): New functions.
(try_window_reusing_current_matrix): Don't use this method when
display-line-numbers is in effect.
(try_window_id, try_cursor_movement): Disable these optimizations
when the line-number-current-line face is different from
line-number face and for relative line numbers.
(try_window_id, redisplay_window, try_cursor_movement): For
visual line-number display, disable the same redisplay
optimizations as for relative.
(x_produce_glyphs): Adjust tab stops for the horizontal
space taken by the line-number display.
(hscroll_window_tree): Adjust hscroll calculations to line-number
display.
(DISP_INFINITY): Renamed from INFINITY to avoid clashes with
math.h; all users changed.
(set_cursor_from_row): Fix calculation of cursor X coordinate in
R2L rows with display-produced glyphs at the beginning.
(display_line): Use should_produce_line_number to determine
whether a line number should be produced for each glyph row, and
maybe_produce_line_number to produce line numbers.
Don't display line numbers in the minibuffer and in tooltip
frames.
Call row_text_area_empty to verify that a glyph
row's text area is devoid of any glyphs that came from a buffer or
a string. This fixes a bug with empty-lines indication
disappearing when line numbers or line-prefix are displayed.
(syms_of_xdisp) <display-line-numbers, display-line-numbers-widen>
<display-line-number-width>: New buffer-local variables.
<display-line-numbers-current-absolute>: New variable.
* lisp/cus-start.el (standard): Provide customization forms for
display-line-numbers and its sub-features.
* lisp/faces.el (line-number, line-number-current-line): New faces.
* lisp/frame.el: Add display-line-numbers, display-line-numbers-widen,
display-line-numbers-current-absolute, and
display-line-number-width to the list of variables that should
trigger redisplay of the current buffer.
* lisp/menu-bar.el (menu-bar-showhide-menu): Add menu-bar item to
turn display-line-numbers on and off.
(toggle-display-line-numbers): New function.
* lisp/simple.el (last--line-number-width): New internal variable.
(line-move-visual): Use it to adjust temporary-goal-column when
line-number display changes its width.
* doc/emacs/basic.texi (Position Info): Add cross-reference to
"Display Custom", for line-number display.
* doc/emacs/custom.texi (Init Rebinding):
* doc/emacs/modes.texi (Minor Modes): Remove references to
linum-mode.
* doc/emacs/display.texi (Display Custom): Describe the
line-number display.
* doc/lispref/display.texi (Size of Displayed Text): Document
line-number-display-width.
* etc/NEWS: Document display-line-numbers and its customizations.
Diffstat (limited to 'lisp/simple.el')
| -rw-r--r-- | lisp/simple.el | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/lisp/simple.el b/lisp/simple.el index 1db14a859d6..3d23fc35596 100644 --- a/lisp/simple.el +++ b/lisp/simple.el | |||
| @@ -5942,6 +5942,10 @@ columns by which window is scrolled from left margin. | |||
| 5942 | When the `track-eol' feature is doing its job, the value is | 5942 | When the `track-eol' feature is doing its job, the value is |
| 5943 | `most-positive-fixnum'.") | 5943 | `most-positive-fixnum'.") |
| 5944 | 5944 | ||
| 5945 | (defvar last--line-number-width 0 | ||
| 5946 | "Last value of width used for displaying line numbers. | ||
| 5947 | Used internally by `line-move-visual'.") | ||
| 5948 | |||
| 5945 | (defcustom line-move-ignore-invisible t | 5949 | (defcustom line-move-ignore-invisible t |
| 5946 | "Non-nil means commands that move by lines ignore invisible newlines. | 5950 | "Non-nil means commands that move by lines ignore invisible newlines. |
| 5947 | When this option is non-nil, \\[next-line], \\[previous-line], \\[move-end-of-line], and \\[move-beginning-of-line] behave | 5951 | When this option is non-nil, \\[next-line], \\[previous-line], \\[move-end-of-line], and \\[move-beginning-of-line] behave |
| @@ -6212,6 +6216,7 @@ not vscroll." | |||
| 6212 | If NOERROR, don't signal an error if we can't move that many lines." | 6216 | If NOERROR, don't signal an error if we can't move that many lines." |
| 6213 | (let ((opoint (point)) | 6217 | (let ((opoint (point)) |
| 6214 | (hscroll (window-hscroll)) | 6218 | (hscroll (window-hscroll)) |
| 6219 | (lnum-width (line-number-display-width t)) | ||
| 6215 | target-hscroll) | 6220 | target-hscroll) |
| 6216 | ;; Check if the previous command was a line-motion command, or if | 6221 | ;; Check if the previous command was a line-motion command, or if |
| 6217 | ;; we were called from some other command. | 6222 | ;; we were called from some other command. |
| @@ -6219,9 +6224,19 @@ If NOERROR, don't signal an error if we can't move that many lines." | |||
| 6219 | (memq last-command `(next-line previous-line ,this-command))) | 6224 | (memq last-command `(next-line previous-line ,this-command))) |
| 6220 | ;; If so, there's no need to reset `temporary-goal-column', | 6225 | ;; If so, there's no need to reset `temporary-goal-column', |
| 6221 | ;; but we may need to hscroll. | 6226 | ;; but we may need to hscroll. |
| 6222 | (if (or (/= (cdr temporary-goal-column) hscroll) | 6227 | (progn |
| 6223 | (> (cdr temporary-goal-column) 0)) | 6228 | (if (or (/= (cdr temporary-goal-column) hscroll) |
| 6224 | (setq target-hscroll (cdr temporary-goal-column))) | 6229 | (> (cdr temporary-goal-column) 0)) |
| 6230 | (setq target-hscroll (cdr temporary-goal-column))) | ||
| 6231 | ;; Update the COLUMN part of temporary-goal-column if the | ||
| 6232 | ;; line-number display changed its width since the last | ||
| 6233 | ;; time. | ||
| 6234 | (setq temporary-goal-column | ||
| 6235 | (cons (+ (car temporary-goal-column) | ||
| 6236 | (/ (float (- lnum-width last--line-number-width)) | ||
| 6237 | (frame-char-width))) | ||
| 6238 | (cdr temporary-goal-column))) | ||
| 6239 | (setq last--line-number-width lnum-width)) | ||
| 6225 | ;; Otherwise, we should reset `temporary-goal-column'. | 6240 | ;; Otherwise, we should reset `temporary-goal-column'. |
| 6226 | (let ((posn (posn-at-point)) | 6241 | (let ((posn (posn-at-point)) |
| 6227 | x-pos) | 6242 | x-pos) |