diff --git a/src/xdisp.c b/src/xdisp.c index aa75fcaf77..442b09b10b 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -20810,8 +20810,21 @@ maybe_produce_line_number (struct it *it) /* Compute the required width if needed. */ if (!it->lnum_width) { - if (NATNUMP (Vdisplay_line_number_width)) - it->lnum_width = XFASTINT (Vdisplay_line_number_width); + if (display_line_numbers_grow_only && NATNUMP (Vdisplay_line_number_width)) + { + int min_lnum = XFASTINT (Vdisplay_line_number_width); + ptrdiff_t max_lnum; + + max_lnum = this_line + it->w->desired_matrix->nrows - 1 - it->vpos; + min_lnum = max (log10 (max_lnum) + 1, min_lnum); + + it->lnum_width = min_lnum; + Vdisplay_line_number_width = make_number (min_lnum); + } + else if (NATNUMP (Vdisplay_line_number_width)) + { + it->lnum_width = XFASTINT (Vdisplay_line_number_width); + } else { /* Max line number to be displayed cannot be more than @@ -32495,6 +32508,14 @@ even if the actual number needs less space. The default value of nil means compute the space dynamically. Any other value is treated as nil. */); Vdisplay_line_number_width = Qnil; + DEFSYM (Qdisplay_line_number_width, "display-line-number-width"); + Fmake_variable_buffer_local (Qdisplay_line_number_width); + + DEFVAR_BOOL ("display-line-numbers-grow-only", display_line_numbers_grow_only, + doc: /* Non-nil means only dynamically grow the +display, and never shrink. This variable is only taken into account +when `display-line-number-width' is a positive number.*/); + display_line_numbers_grow_only = false; DEFVAR_BOOL ("inhibit-eval-during-redisplay", inhibit_eval_during_redisplay, doc: /* Non-nil means don't eval Lisp during redisplay. */);