Add new minor mode `header-line-indent-mode'

This is mostly factored out from tabulated-list.el (with bugs fixed).

* doc/lispref/modes.texi (Header Lines): Document it.
* lisp/display-line-numbers.el (header-line-indent): New variable.
(header-line-indent--line-number-width)
(header-line-indent--watch-line-number-width)
(header-line-indent--window-scroll-function): New helper functions.
(header-line-indent-mode): New minor mode.

* lisp/display-line-numbers.el (header-line-indent-width): New
variable.

* lisp/emacs-lisp/tabulated-list.el (tabulated-list-line-number-width)
(tabulated-list-watch-line-number-width)
(tabulated-list-window-scroll-function): Make into obsolete aliases.
(tabulated-list-mode): Use 'header-line-indent-mode'.

* lisp/emacs-lisp/tabulated-list.el (tabulated-list-init-header):
Adjust the header line format and computation.

* src/buffer.c (syms_of_buffer): Mention header-line-indent-mode.
This commit is contained in:
Lars Ingebrigtsen 2022-05-13 21:24:12 +02:00
parent 72b5b41941
commit dea41d4c24
5 changed files with 131 additions and 52 deletions

View file

@ -264,18 +264,14 @@ variables `tabulated-list-tty-sort-indicator-asc' and
Populated by `tabulated-list-init-header'.")
(defvar tabulated-list--header-overlay nil)
(defun tabulated-list-line-number-width ()
"Return the width taken by `display-line-numbers' in the current buffer."
;; line-number-display-width returns the value for the selected
;; window, which might not be the window in which the current buffer
;; is displayed.
(if (not display-line-numbers)
0
(let ((cbuf-window (get-buffer-window (current-buffer) t)))
(if (window-live-p cbuf-window)
(with-selected-window cbuf-window
(line-number-display-width 'columns))
4))))
(define-obsolete-function-alias 'tabulated-list-line-number-width
'header-line-indent--line-number-width "29.1")
(define-obsolete-function-alias 'tabulated-list-watch-line-number-width
'header-line-indent--watch-line-number-width "29.1")
(define-obsolete-function-alias 'tabulated-list-watch-line-number-width
'header-line-indent--watch-line-number-width "29.1")
(define-obsolete-function-alias 'tabulated-list-window-scroll-function
'header-line-indent--window-scroll-function "29.1")
(defun tabulated-list-init-header ()
"Set up header line for the Tabulated List buffer."
@ -289,9 +285,9 @@ Populated by `tabulated-list-init-header'.")
(hcols (mapcar #'car tabulated-list-format))
(tabulated-list--near-rows (list hcols hcols))
(cols nil))
(if display-line-numbers
(setq x (+ x (tabulated-list-line-number-width))))
(push (propertize " " 'display `(space :align-to ,x)) cols)
(push (propertize " " 'display
`(space :align-to (+ header-line-indent-width ,x)))
cols)
(dotimes (n len)
(let* ((col (aref tabulated-list-format n))
(not-last-col (< n (1- len)))
@ -342,20 +338,25 @@ Populated by `tabulated-list-init-header'.")
(when (> shift 0)
(setq cols
(cons (car cols)
(cons (propertize (make-string shift ?\s)
'display
`(space :align-to ,(+ x shift)))
(cdr cols))))
(cons
(propertize
(make-string shift ?\s)
'display
`(space :align-to
(+ header-line-indent-width ,(+ x shift))))
(cdr cols))))
(setq x (+ x shift)))))
(if (>= pad-right 0)
(push (propertize " "
'display `(space :align-to ,next-x)
'face 'fixed-pitch)
(push (propertize
" "
'display `(space :align-to
(+ header-line-indent-width ,next-x))
'face 'fixed-pitch)
cols))
(setq x next-x)))
(setq cols (apply 'concat (nreverse cols)))
(if tabulated-list-use-header-line
(setq header-line-format cols)
(setq header-line-format (list "" 'header-line-indent cols))
(setq-local tabulated-list--header-string cols))))
(defun tabulated-list-print-fake-header ()
@ -770,23 +771,6 @@ Interactively, N is the prefix numeric argument, and defaults to
(interactive "p")
(tabulated-list-widen-current-column (- n)))
(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-init-header)))))
(defun tabulated-list-window-scroll-function (window _start)
(if display-line-numbers
(let ((lnum-width
(with-selected-window window
(line-number-display-width 'columns))))
(when (not (= tabulated-list--current-lnum-width lnum-width))
(setq-local tabulated-list--current-lnum-width lnum-width)
(tabulated-list-init-header)))))
(defun tabulated-list-next-column (&optional arg)
"Go to the start of the next column after point on the current line.
If ARG is provided, move that many columns."
@ -857,15 +841,7 @@ as the ewoc pretty-printer."
;; Avoid messing up the entries' display just because the first
;; 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)
;; 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)
(add-hook 'window-scroll-functions
#'tabulated-list-window-scroll-function nil t))
(header-line-indent-mode))
(put 'tabulated-list-mode 'mode-class 'special)