Function: tabulated-list-print
tabulated-list-print is a byte-compiled function defined in
tabulated-list.el.gz.
Signature
(tabulated-list-print &optional REMEMBER-POS UPDATE)
Documentation
Populate the current Tabulated List mode buffer.
This sorts the tabulated-list-entries list if sorting is
specified by tabulated-list-sort-key. It then erases the
buffer and inserts the entries with tabulated-list-printer.
Optional argument REMEMBER-POS, if non-nil, means to move point to the entry with the same ID element as the current line.
Non-nil UPDATE argument means to use an alternative printing
method which is faster if most entries haven't changed since the
last print. The only difference in outcome is that tags will not
be removed from entries that haven't changed (see
tabulated-list-put-tag). Don't use this immediately after
changing tabulated-list-sort-key.
Probably introduced at or before Emacs version 25.1.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/tabulated-list.el.gz
(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
specified by `tabulated-list-sort-key'. It then erases the
buffer and inserts the entries with `tabulated-list-printer'.
Optional argument REMEMBER-POS, if non-nil, means to move point
to the entry with the same ID element as the current line.
Non-nil UPDATE argument means to use an alternative printing
method which is faster if most entries haven't changed since the
last print. The only difference in outcome is that tags will not
be removed from entries that haven't changed (see
`tabulated-list-put-tag'). Don't use this immediately after
changing `tabulated-list-sort-key'."
(let ((inhibit-read-only t)
(entries (if (functionp tabulated-list-entries)
(funcall tabulated-list-entries)
tabulated-list-entries))
(sorter (tabulated-list--get-sorter))
entry-id saved-pt saved-col)
(and remember-pos
(setq entry-id (tabulated-list-get-id))
(setq saved-col (current-column)))
;; Sort the entries, if necessary.
(when sorter
(setq entries (sort entries sorter)))
(unless (functionp tabulated-list-entries)
(setq tabulated-list-entries entries))
;; Without a sorter, we have no way to just update.
(when (and update (not sorter))
(setq update nil))
(if update (goto-char (point-min))
;; Redo the buffer, unless we're just updating.
(erase-buffer)
(unless tabulated-list-use-header-line
(tabulated-list-print-fake-header)))
;; Finally, print the resulting list.
(while entries
(let* ((elt (car entries))
(tabulated-list--near-rows
(list
(or (tabulated-list-get-entry (point-at-bol 0)) (cadr elt))
(cadr elt)
(or (cadr (cadr entries)) (cadr elt))))
(id (car elt)))
(and entry-id
(equal entry-id id)
(setq entry-id nil
saved-pt (point)))
;; If the buffer is empty, simply print each elt.
(if (or (not update) (eobp))
(apply tabulated-list-printer elt)
(while (let ((local-id (tabulated-list-get-id)))
;; If we find id, then nothing to update.
(cond ((equal id local-id)
(forward-line 1)
nil)
;; If this entry sorts after id (or it's the
;; end), then just insert id and move on.
((or (not local-id)
(funcall sorter elt
;; FIXME: Might be faster if
;; don't construct this list.
(list local-id (tabulated-list-get-entry))))
(apply tabulated-list-printer elt)
nil)
;; We find an entry that sorts before id,
;; it needs to be deleted.
(t t)))
(let ((old (point)))
(forward-line 1)
(delete-region old (point))))))
(setq entries (cdr entries)))
(when update
(delete-region (point) (point-max)))
(set-buffer-modified-p nil)
;; If REMEMBER-POS was specified, move to the "old" location.
(if saved-pt
(progn (goto-char saved-pt)
(move-to-column saved-col))
(goto-char (point-min)))))