On Fri, Apr 10, 2020 at 5:16 PM João Távora <joaotavora@gmail.com> wrote:
>
> On Fri, Apr 10, 2020 at 5:09 PM João Távora <joaotavora@gmail.com> wrote:
>
> > leaves me wondering if there isn't a hook ordering bug here. Maybe it's
> > just a question of delaying entry in tabulated-list-mode until important stuff
> > is set up.
>
> Or maybe all that's needed is this (100% untested) change:
>
> diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el

Finally looked into the problem and no, this doesn't work because
flymake-diagnostics-buffer-mode erases local vars before setting up the
tabulated-list-mode derived mode.  This is kind of a chicken-and-egg
issue that can only be fixed in flymake.el with some ugly hacks.

But after some analysis, I think it is tabulated-list-mode, or rather
its recent adaptation to display-line-numbers-mode, which is in the
wrong here.  It used to be that using a mode derived from
tabulated-list-mode didn't immediately force a request for refreshing its
rows.  After display-line-numbers-mode came along, that ceased to be
true in some situations.

Reading the special code in tabulated-list-mode concerned with line
numbers, the latter seem to affect only the header line, not the
buffer's contents.  So this seems to be the correct fix:

commit 0145b3c87f329e51c729703d778848cdc8393a33
Author: João Távora <joaotavora@gmail.com>
Date:   Sun Apr 12 13:10:45 2020 +0100

    Fix tabulated-list-mode bootstrapping problem
   
    Fixes: bug#40529
    Don't refresh all the tabulated-list rows when entering
    tabulated-list-mode just because display-line-number-mode is t.
   
    * lisp/emacs-lisp/tabulated-list.el (tabulated-list-mode): Don't
    call tabulated-list-revert, just tabulated-list-init-header.

diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el
index 501cc3a29e..68eaef1fcd 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -765,7 +765,7 @@ tabulated-list-mode
   ;; 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-init-header 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)