]> git.eshelyaron.com Git - emacs.git/commitdiff
vtable: allow resetting column alignment when table data changes
authorJoost Kremers <joostkremers@fastmail.com>
Thu, 30 May 2024 23:38:54 +0000 (01:38 +0200)
committerEshel Yaron <me@eshelyaron.com>
Sat, 9 Nov 2024 15:49:22 +0000 (16:49 +0100)
* lisp/emacs-lisp/vtable.el (vtable--compute-columns): If a column
was not created with an explicit 'align' property, allow changing
this property when the column data changes from numeric to
non-numeric (or vice versa).  This makes it possible to add data to
an empty table, because in a table without data all columns are
assumed to be numeric and right-aligned.  (Bug#73775)

(cherry picked from commit 35e1ab970c1cfc6a1b62fbb920e0d2bb031765da)

lisp/emacs-lisp/vtable.el

index 4dccd025575be90628319749afe83fb45d584b16..3e389409e299026779b7cee9eb92d47067a79c24 100644 (file)
@@ -45,7 +45,8 @@
   getter
   formatter
   displayer
-  -numerical)
+  -numerical
+  -aligned)
 
 (defclass vtable ()
   ((columns :initarg :columns :accessor vtable-columns)
@@ -473,7 +474,17 @@ This also updates the displayed table."
    (t
     (elt object index))))
 
-(defun vtable--compute-columns (table)
+(defun vtable--compute-columns (table &optional recompute)
+  "Compute column specs for TABLE.
+Set the `align', `-aligned' and `-numerical' properties of each column.
+If the column contains only numerical data, set `-numerical' to t,
+otherwise to nil.  `-aligned' indicates whether the column has an
+`align' property set by the user.  If it does, `align' is not touched,
+otherwise it is set to `right' for numeric columns and to `left' for
+non-numeric columns.
+
+If RECOMPUTE is non-nil, do not set `-aligned'.  This can be used to
+recompute the column specs when the table data has changed."
   (let ((numerical (make-vector (length (vtable-columns table)) t))
         (columns (vtable-columns table)))
     ;; First determine whether there are any all-numerical columns.
@@ -484,11 +495,16 @@ This also updates the displayed table."
                                              table))
            (setf (elt numerical index) nil)))
        (vtable-columns table)))
+    ;; Check if any columns have an explicit `align' property.
+    (unless recompute
+      (dolist (column (vtable-columns table))
+        (when (vtable-column-align column)
+          (setf (vtable-column--aligned column) t))))
     ;; Then fill in defaults.
     (seq-map-indexed
      (lambda (column index)
        ;; This is used when displaying.
-       (unless (vtable-column-align column)
+       (unless (vtable-column--aligned column)
          (setf (vtable-column-align column)
                (if (elt numerical index)
                    'right
@@ -813,7 +829,7 @@ If NEXT, do the next column."
          (setq recompute t)))
      line)
     (when recompute
-      (vtable--compute-columns table))))
+      (vtable--compute-columns table t))))
 
 (defun vtable--set-header-line (table widths spacer)
   (setq header-line-format