]> git.eshelyaron.com Git - emacs.git/commitdiff
Add support for column background colors in vtable
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 13 Apr 2022 14:25:52 +0000 (16:25 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 13 Apr 2022 14:26:01 +0000 (16:26 +0200)
* doc/misc/vtable.texi (Making A Table): Document it.

* lisp/emacs-lisp/vtable.el (vtable): Add a column color element.
(make-vtable): Use it.
(vtable--insert-line): Insert the colors here.

doc/misc/vtable.texi
lisp/emacs-lisp/vtable.el

index 472dee70ec0c8b6f7c81c5e005280e97b554f774..48e6301fce0130e240cbf772505554a100425f0f 100644 (file)
@@ -387,6 +387,12 @@ The face to be used.  This defaults to @code{variable-pitch}.  This
 face doesn't override the faces in the data, or the faces supplied by
 the getter and formatter functions.
 
+@item :column-colors
+If present, this should be a list of color names to be used as the
+background color on the columns.  If there are fewer colors here than
+there are columns, the colors will be repeated.  The most common use
+case here is to have alternating background colors on the columns.
+
 @item :actions
 This uses the same syntax as @code{define-keymap}, but doesn't refer
 to commands directly.  Instead each key is bound to a command that
index 8d777335315e087b7df06a3350e5ac6f33670cfb..98106e4670026be557ff98ea0195df3abda8128b 100644 (file)
@@ -57,6 +57,7 @@
    (separator-width :initarg :separator-width :accessor vtable-separator-width)
    (sort-by :initarg :sort-by :accessor vtable-sort-by)
    (ellipsis :initarg :ellipsis :accessor vtable-ellipsis)
+   (column-colors :initarg :column-colors :accessor vtable-column-colors)
    (-cache :initform (make-hash-table :test #'equal)))
   "A object to hold the data for a table.")
 
@@ -83,7 +84,8 @@
                             (separator-width 1)
                             sort-by
                             (ellipsis t)
-                            (insert t))
+                            (insert t)
+                            column-colors)
   "Create and insert a vtable at point.
 The vtable object is returned.  If INSERT is nil, the table won't
 be inserted."
@@ -122,6 +124,7 @@ be inserted."
                         :keymap keymap
                         :separator-width separator-width
                         :sort-by sort-by
+                        :column-colors column-colors
                         :ellipsis ellipsis)))
     ;; Compute missing column data.
     (setf (vtable-columns table) (vtable--compute-columns table))
@@ -377,7 +380,8 @@ This also updates the displayed table."
 (defun vtable--insert-line (table line widths spacer
                                   &optional ellipsis ellipsis-width)
   (let ((start (point))
-        (columns (vtable-columns table)))
+        (columns (vtable-columns table))
+        (colors (vtable-column-colors table)))
     (seq-do-indexed
      (lambda (elem index)
        (let ((value (nth 0 elem))
@@ -438,7 +442,12 @@ This also updates the displayed table."
                      (propertize " " 'display
                                  (list 'space
                                        :width (list spacer)))))
-           (put-text-property start (point) 'vtable-column index))))
+           (put-text-property start (point) 'vtable-column index)
+           (when colors
+             (add-face-text-property
+              start (point)
+              (list :background
+                    (elt colors (mod index (length colors)))))))))
      (cdr line))
     (insert "\n")
     (put-text-property start (point) 'vtable-object (car line))))