org-dblock-write:columnview: Write width specifications

* lisp/org-colview.el (org-dblock-write:columnview): When writing
table, write width specifications as well and apply them.
* testing/lisp/test-org-colview.el (test-org-colview/dblock): Add
test.
* etc/ORG-NEWS (=colview= dynamic block now writes column width
specifications): Document the change.

Link: https://orgmode.org/list/87r1015w30.fsf@localhost
This commit is contained in:
Ihor Radchenko 2024-04-05 14:03:31 +03:00
parent d491a74fd9
commit b2827aed98
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
3 changed files with 55 additions and 2 deletions

View File

@ -984,6 +984,36 @@ properties, links to headlines in the file can also be made more
robust by using the file id instead of the file path.
** New features
*** =colview= dynamic block now writes column width specifications
When column format contains width specifications, =colview= dynamic
block now writes these specifications as column width in the generated
tables and automatically shrinks the columns on display.
Example:
: * PROYECTO EMACS
: :PROPERTIES:
: :COLUMNS: %10ITEM(PROJECT)
: :END:
:
: Before
:
: #+BEGIN: columnview :id local
: | PROJECT |
: |----------------|
: | PROYECTO EMACS |
: #+END:
:
: After
:
: #+BEGIN: columnview :id local
: | <10> |
: | PROJECT |
: |----------------|
: | PROYECTO EMACS |
: #+END:
*** =ob-tangle.el=: New flag to remove tangle targets before writing
When ~org-babel-tangle-remove-file-before-write~ is set to ~t~ the

View File

@ -1559,7 +1559,10 @@ PARAMS is a property list of parameters:
(plist-get params :skip-empty-rows)
(plist-get params :exclude-tags)
(plist-get params :format)
view-pos))))))
view-pos)))))
(width-specs
(mapcar (lambda (spec) (nth 2 spec))
org-columns-current-fmt-compiled)))
(when table
;; Prune level information from the table. Also normalize
;; headings: remove stars, add indentation entities, if
@ -1595,6 +1598,11 @@ PARAMS is a property list of parameters:
(append (mapcar (lambda (x) (if (eq 'hline x) x (cons "" x)))
table)
(list (cons "/" (make-list size "<>")))))))
(when (seq-find #'identity width-specs)
;; There are width specifiers in column format. Pass them
;; to the resulting table, adding alignment field as the first
;; row.
(push (mapcar (lambda (width) (when width (format "<%d>" width))) width-specs) table))
(let ((content-lines (org-split-string (plist-get params :content) "\n"))
recalc)
;; Insert affiliated keywords before the table.
@ -1616,7 +1624,9 @@ PARAMS is a property list of parameters:
(insert "\n" line)
(unless recalc (setq recalc t))))))
(when recalc (org-table-recalculate 'all t))
(org-table-align)))))
(org-table-align)
(when (seq-find #'identity width-specs)
(org-table-shrink))))))
;;;###autoload
(defun org-columns-insert-dblock ()

View File

@ -1422,6 +1422,19 @@
"* H\n:PROPERTIES:\n:A: 1\n:END:\n<point>#+BEGIN: columnview\n#+END:"
(let ((org-columns-default-format "%ITEM %A")) (org-update-dblock))
(buffer-substring-no-properties (point) (point-max)))))
;; Test column widths.
(should
(equal
"#+BEGIN: columnview
| <5> |
| ITEM |
|------|
| H |
#+END:"
(org-test-with-temp-text
"* H\n<point>#+BEGIN: columnview\n#+END:"
(let ((org-columns-default-format "%5ITEM")) (org-update-dblock))
(buffer-substring-no-properties (point) (point-max)))))
;; Properties are case insensitive.
(should
(equal