From fd3d8610b27e26107ba15070aba0d488152f8f4d Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 20 Oct 2017 12:36:12 +0300 Subject: Make :align-to account for display-line-numbers These changes also update the various bundled packages to use new feature, and better support customizations of the line-number face. * src/xdisp.c (calc_pixel_width_or_height): Improve commentary. Make :align-to count from the end of the line-number display when the offset or the width form reference that of the text area. (Bug#28855) * src/indent.c (Fline_number_display_width): Implement support for the PIXELWISE argument being 'columns'. Update the doc string. (syms_of_indent): New symbol 'columns'. * lisp/ruler-mode.el (ruler-mode-window-col, ruler-mode-ruler): Call line-number-display-width with last argument 'columns'. * lisp/proced.el (proced-header-line): Call line-number-display-width with 2nd arg 'columns', which also fixes a problem when display-line-numbers is nil. * lisp/emacs-lisp/tabulated-list.el (tabulated-list-line-number-width): Call line-number-display-width with 2nd arg 'columns. (tabulated-list-entry-lnum-width): Remove unneeded defvar. (tabulated-list-print, tabulated-list-print-entry): No need to account for the value of tabulated-list-entry-lnum-width. (tabulated-list--current-lnum-width): New defvar. (tabulated-list-watch-line-number-width): New function. (tabulated-list-mode): Bind tabulated-list--current-lnum-width locally, and set up tabulated-list-watch-line-number-width as pre-redisplay-functions hook. * doc/lispref/display.texi (Size of Displayed Text): Document the 'columns' value of the PIXELWISE argument. (Pixel Specification): Update and improve the documentation of the supported forms. --- lisp/emacs-lisp/tabulated-list.el | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index d1d7c0a8042..73ddadfb805 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -193,10 +193,10 @@ Populated by `tabulated-list-init-header'.") ;; is displayed. (if (not display-line-numbers) 0 - (let ((cbuf-window (get-buffer-window (current-buffer)))) + (let ((cbuf-window (get-buffer-window (current-buffer) t))) (if (window-live-p cbuf-window) (with-selected-window cbuf-window - (+ (line-number-display-width) 2)) + (line-number-display-width 'columns)) 4)))) (defun tabulated-list-init-header () @@ -329,8 +329,6 @@ Check the current row, the previous one and the next row." (string-width (if (stringp nt) nt (car nt))))) tabulated-list--near-rows))) -(defvar tabulated-list-entry-lnum-width nil) - (defun tabulated-list-print (&optional remember-pos update) "Populate the current Tabulated List mode buffer. This sorts the `tabulated-list-entries' list if sorting is @@ -373,7 +371,6 @@ changing `tabulated-list-sort-key'." (unless tabulated-list-use-header-line (tabulated-list-print-fake-header))) ;; Finally, print the resulting list. - (setq tabulated-list-entry-lnum-width (tabulated-list-line-number-width)) (while entries (let* ((elt (car entries)) (tabulated-list--near-rows @@ -428,9 +425,8 @@ of column descriptors." (x (max tabulated-list-padding 0)) (ncols (length tabulated-list-format)) (inhibit-read-only t)) - (setq x (+ x tabulated-list-entry-lnum-width)) (if (> tabulated-list-padding 0) - (insert (make-string (- x tabulated-list-entry-lnum-width) ?\s))) + (insert (make-string x ?\s))) (let ((tabulated-list--near-rows ; Bind it if not bound yet (Bug#25506). (or (bound-and-true-p tabulated-list--near-rows) (list (or (tabulated-list-get-entry (point-at-bol 0)) @@ -601,6 +597,14 @@ With a numeric prefix argument N, sort the Nth column." (tabulated-list-init-header) (tabulated-list-print t))) +(defvar tabulated-list--current-lnum-width nil) +(defun tabulated-list-watch-line-number-width (_window) + (if display-line-numbers + (let ((lnum-width (tabulated-list-line-number-width))) + (when (not (= tabulated-list--current-lnum-width lnum-width)) + (setq-local tabulated-list--current-lnum-width lnum-width) + (tabulated-list-revert))))) + ;;; The mode definition: (define-derived-mode tabulated-list-mode special-mode "Tabulated" @@ -645,7 +649,12 @@ as the ewoc pretty-printer." ;; column of the first entry happens to begin with a R2L letter. (setq bidi-paragraph-direction 'left-to-right) ;; This is for if/when they turn on display-line-numbers - (add-hook 'display-line-numbers-mode-hook #'tabulated-list-revert nil t)) + (add-hook 'display-line-numbers-mode-hook #'tabulated-list-revert nil t) + ;; This is for if/when they customize the line-number face or when + ;; the line-number width needs to change due to scrolling. + (setq-local tabulated-list--current-lnum-width 0) + (add-hook 'pre-redisplay-functions + #'tabulated-list-watch-line-number-width nil t)) (put 'tabulated-list-mode 'mode-class 'special) -- cgit v1.2.3