From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms1.migadu.com with LMTPS id mKhjJLnLJmZ5AwAAqHPOHw:P1 (envelope-from ) for ; Mon, 22 Apr 2024 22:42:33 +0200 Received: from aspmx1.migadu.com ([2001:41d0:403:58f0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id mKhjJLnLJmZ5AwAAqHPOHw (envelope-from ) for ; Mon, 22 Apr 2024 22:42:33 +0200 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1713818553; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=ZOtVW3IT0oB+lbJd2mJRBauk8kqrxeSZL1KlIBxfFaA=; b=ocHvEkh4BItHeqbj+isc2Bi4W+Yz12LePEkyOiuQL+wSdoTBErdwMXJNibZJhoNpl0FGa4 n5/zc1EFS8KxS9/dKQmevhNgjMgD4BauYIp234AqQC0YWHtARnEkQ0v5ZZS/J9Y+Lol34t D6/SE0bjBPqp4OHN8tgyFXDmlu10ocLOfpfjfR8hfZt65OCMfmdEIaXBAVUm0N4T2qX8wm RBhfJ4Ytfwhwv00P6FNSdr2eQqy3/jrvDHcYgIQCH+S4BbZ0bpzy722TbMZon9LCT21RUg tMU5ra284gRbg5PwRgroQlkZrWasO7+Khjzjlq5lzHpr2RHd7eYABjJDYqpIEA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1713818553; a=rsa-sha256; cv=none; b=i51NvJAUvGFEV6h3tMn4m6i9ODEo0Q1ndxdiZGVWliHk4SjZ+Rmuib2cMywGibFv7/JYqj UHsPByFjFOyCH8/ye+lfvoxZR1u2DQwLc9UAWIl91K5ypTxTfWIiAUxBG4bKjP7h7gK+Ia OnWqRY2QHzLWqqkOoS9+7iQEoNAj8bIMl/XjPuz5XOUr1rzTwj28uRxSm+hiQwiyAciBkF 8IDT3HVt8MhFWvb3hWbUU/mA5d73DSiYEJxb8gsSqFbMJ5r68tt8rR2ImXG/Iz4rIGbzSI VLzLTRg14n/aiuLSrc0H8PwWMU5ounGJxHc/CialXQzVktRa4uINTKLS60tWEg== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 2F60A65AC4 for ; Mon, 22 Apr 2024 22:42:33 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rz0Tq-00016w-Oc; Mon, 22 Apr 2024 16:41:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rz0To-00016X-KV for emacs-orgmode@gnu.org; Mon, 22 Apr 2024 16:41:36 -0400 Received: from smtprelay04.ispgateway.de ([80.67.29.8]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rz0Tl-0001mf-Hs for emacs-orgmode@gnu.org; Mon, 22 Apr 2024 16:41:36 -0400 Received: from [185.17.206.74] (helo=condition-alpha.com) by smtprelay04.ispgateway.de with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1rz0Th-000000005Fy-0ar6; Mon, 22 Apr 2024 22:41:29 +0200 Message-Id: <117e93f189241f4800af207ce30aa606@condition-alpha.com> From: Alexander Adolf To: Ihor Radchenko Cc: emacs-orgmode@gnu.org Subject: Re: columnview dynamic block - different time summing behaviour for EFFORT and CLOCKSUM In-Reply-To: <87mspmq1ce.fsf@localhost> References: <486d2b818b62c71b3f307305c06c4318@condition-alpha.com> <871q7cypxl.fsf@localhost> <00aa9bf72dc93f6554bdd236fdfba192@condition-alpha.com> <87y19hbb05.fsf@localhost> <8b72386d118136210f27b553f0a13066@condition-alpha.com> <87cyqtyzgt.fsf@localhost> <91dfeb0fed1a1fe0564e5eb9b95a409d@condition-alpha.com> <87a5lpeiey.fsf@localhost> <87zftp6zz3.fsf@localhost> <98f04a910f31ff9ab38e2ddf9e7f2f5c@condition-alpha.com> <87mspmq1ce.fsf@localhost> Date: Mon, 22 Apr 2024 22:41:28 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Df-Sender: YWxleGFuZGVyLmFkb2xmQGNvbmRpdGlvbi1hbHBoYS5jb20= Received-SPF: pass client-ip=80.67.29.8; envelope-from=alexander.adolf@condition-alpha.com; helo=smtprelay04.ispgateway.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Spam-Score: -6.38 X-Migadu-Scanner: mx11.migadu.com X-Spam-Score: -6.38 X-Migadu-Queue-Id: 2F60A65AC4 X-TUID: TstsOrK4UB7R --=-=-= Content-Type: text/plain Ihor Radchenko writes: > [...] > Calling `org-columns--clean-item' is a must to create a valid table. True. Additionally, it would seem advisable to call `org-quote-vert' on the data, too, as `org-columns--clean-item' does not take care of vertical bars? This is done in a previous step in `org-columns--capture-view', however, so that the vertical bars get converted to "\vert" before the formatting function gets called. `org-link-heading-search-string', and `org-link-make-string' (both called from the formatting function _after_ `org-columns--clean-item') OTOH take care of the link's path and description parts being appropriate for a link. Thus, we have both layers of safeguarding: "link-safe" data is generated from "table-safe" data. > [...] >> 2) Considering what happens when I do `org-store-link' and >> `org-insert-link', it would seem more advisable to: >> [...] > > I do not recall seeing `org-store-link' in the patches you submitted. > So, I am not sure what you are talking about. May you elaborate? > [...] Apologies for not having been clear enough. With "when I do" I wanted to refer to the "cleanup" of headline text when using `org-store-link' and `org-insert-link' interactively. I have moved the link generation to the formatting function as mentioned. This also removes the need for any new function parameters, since the formatting function receives the dynamic block's parameter list, which contains a :link property when set in the #+BEGIN line. Kindly find updated patches below. I hope to have succeeded in addressing all your comments; that was my intention at least. Many thanks and looking forward to your thoughts, --alexander --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-lisp-org-colview.el-Add-formatter-parameter-to-colvi.patch >From a36dba46a63d7d879bf2faf3c4c885b9ea3e28ad Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Sun, 14 Apr 2024 18:14:05 +0200 Subject: [PATCH 1/2] lisp/org-colview.el: Add formatter parameter to colview dynamic block * lisp/org-colview.el (org-dblock-write:column view): Factor out the existing formatting code to new function `org-columns-dblock-write-default', and honour new dblock parameter :formatter for specifying a different formatting function. (org-columns-dblock-write-default): New function with current formatting code. (org-columns--capture-view): Amend docstring to better explain the format of the data being passed to the formatting function. (org-clock-clocktable-formatter): New option to define a global default formatting function, defaulting to the current behaviour. * doc/org-manual.org (Capturing column view): Describe new :formatter parameter. * etc/ORG-NEWS (New option ~org-columns-dblock-formatter~): Announce new option. (=colview= dynamic block supports custom formatting function): Describe new custom formatting function feature. --- doc/org-manual.org | 7 +++++++ etc/ORG-NEWS | 29 +++++++++++++++++++++++++++++ lisp/org-colview.el | 41 +++++++++++++++++++++++++++++++++++------ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index d24230568..000783772 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -6014,6 +6014,13 @@ This dynamic block has the following parameters: Specify a column attribute (see [[*Column attributes]]) for the dynamic block. +- =:formatter= :: + + #+cindex: @samp{formatter}, dynamic block parameter + #+vindex: org-columns-dblock-formatter + A function to format column view data and insert it into the buffer. + See the option ~org-columns-dblock-formatter~. + The following commands insert or update the dynamic block: - ~org-columns-insert-dblock~ :: diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index dbf849422..84ea7cde9 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -999,6 +999,16 @@ even though it does not have its own ID. By giving files top-level id properties, links to headlines in the file can also be made more robust by using the file id instead of the file path. +*** New option ~org-columns-dblock-formatter~ + +=colview= dynamic blocks now understand a new ~:formatter~ parameter +to use a specific function for formatting and inserting the contents +of the dynamic block. This new option can be used to set the global +default formatting function that will be used for =colview= dynamic +blocks that do not specify any ~:formatter~ parameter. Its default +value (the new function ~org-columns-dblock-write-default~) yields the +previous (fixed) formatting behaviour. + ** New features *** ~org-paste-subtree~ now handles =C-u= and =C-u C-u= prefix arguments specially @@ -1035,6 +1045,25 @@ Example: : | PROYECTO EMACS | : #+END: +*** =colview= dynamic block supports custom formatting function + +The =colview= dynamic block understands a new ~:formatter~ parameter, +which specifies a user-supplied function to format and insert the data +in the dynamic block. + +A global default formatting function for =colview= dynamic blocks can +be set via the new option ~org-columns-dblock-formatter~ which +defaults to the new function ~org-columns-dblock-write-default~, that +implements the previous (fixed) formatting behaviour. Hence, the +default behaviour is identical to previous versions. + +The global default function can be overridden for any given =colview= +dynamic block individually by specifying a custom formatter function +using the new ~:formatter~ parameter on the block's =BEGIN= line. + +This new feature replicates the ~:formatter~ option already available +for =clocktable= dynamic blocks. + *** =ob-tangle.el=: New flag to remove tangle targets before writing When ~org-babel-tangle-remove-file-before-write~ is set to ~t~ the diff --git a/lisp/org-colview.el b/lisp/org-colview.el index 4718d1db7..7a6471377 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -123,6 +123,12 @@ in `org-columns-summary-types-default', which see." (function :tag "Summarize") (function :tag "Collect"))))) +(defcustom org-columns-dblock-formatter #'org-columns-dblock-write-default + "Function to format data in column view dynamic blocks. +For more information, see `org-columns-dblock-write-default'." + :group 'org-properties + :package-version '(Org . "9.7") + :type 'function) ;;; Column View @@ -1442,9 +1448,13 @@ that will be excluded from the resulting view. FORMAT is a format string for columns, or nil. When LOCAL is non-nil, only capture headings in current subtree. -This function returns a list containing the title row and all -other rows. Each row is a list of fields, as strings, or -`hline'." +This function returns a list containing the title row and all other +rows. Each row is either a list, or the symbol `hline'. The first list +is the heading row as a list of strings with the column titles according +to FORMAT. All subsequent lists each represent a body row as a list +whose first element is an integer indicating the outline level of the +entry, and whose remaining elements are strings with the contents for +the columns according to FORMAT." (org-columns (not local) format) (goto-char org-columns-top-level-marker) (let ((columns (length org-columns-current-fmt-compiled)) @@ -1545,8 +1555,15 @@ PARAMS is a property list of parameters: `:vlines' When non-nil, make each column a column group to enforce - vertical lines." - (let ((table + vertical lines. + +`:formatter' + + A function to format the data and insert it into the + buffer. Overrides the default formatting function set in + `org-columns-dblock-formatter'." + (let ((insert-pos (point)) + (table (let ((id (plist-get params :id)) view-file view-pos) (pcase id @@ -1573,7 +1590,17 @@ PARAMS is a property list of parameters: (plist-get params :exclude-tags) (plist-get params :format) view-pos))))) - (width-specs + (formatter (or (plist-get params :formatter) + org-columns-dblock-formatter + #'org-columns-dblock-write-default))) + (funcall formatter insert-pos table params))) + +(defun org-columns-dblock-write-default (ipos table params) + "Write out a columnview table at position IPOS in the current buffer. +TABLE is a table with data as produced by `org-columns--capture-view'. +PARAMS is the parameter property list obtained from the dynamic block +definition." + (let ((width-specs (mapcar (lambda (spec) (nth 2 spec)) org-columns-current-fmt-compiled))) (when table @@ -1616,6 +1643,8 @@ PARAMS is a property list of parameters: ;; to the resulting table, adding alignment field as the first ;; row. (push (mapcar (lambda (width) (when width (format "<%d>" width))) width-specs) table)) + ;; now insert the table into the buffer + (goto-char ipos) (let ((content-lines (org-split-string (plist-get params :content) "\n")) recalc) ;; Insert affiliated keywords before the table. -- 2.39.3 (Apple Git-146) --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0002-lisp-org-colview.el-Add-link-parameter-to-colview-dy.patch >From 6c3fd68419ac2be705f29bd56dcd23b01b6da86b Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 15 Apr 2024 18:01:40 +0200 Subject: [PATCH 2/2] lisp/org-colview.el: Add link parameter to colview dynamic block * lisp/org-colview.el (org-columns--capture-view): Add new link parameter, which when non-nil causes ITEM headlines to be linked to their origins. (org-dblock-write:columnview): Pass new link parameter to `org-columns--capture-view', and explain its use in the docstring. * doc/org-manual.org (Capturing column view): Describe new :link parameter. * etc/ORG-NEWS (=colview= dynamic block can link to headlines): Describe new link feature. --- doc/org-manual.org | 5 +++++ etc/ORG-NEWS | 6 ++++++ lisp/org-colview.el | 33 +++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 000783772..a77492971 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -6009,6 +6009,11 @@ This dynamic block has the following parameters: When non-~nil~, indent each =ITEM= field according to its level. +- =:link= :: + + When non-~nil~, link the =ITEM= headlines in the table to their + origins. + - =:format= :: Specify a column attribute (see [[*Column attributes]]) for the dynamic diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 84ea7cde9..b4aea10b8 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -1064,6 +1064,12 @@ using the new ~:formatter~ parameter on the block's =BEGIN= line. This new feature replicates the ~:formatter~ option already available for =clocktable= dynamic blocks. +*** =colview= dynamic block can link to headlines + +The =colview= dynamic block understands a new ~:link~ parameter, which +when non-~nil~ causes =ITEM= headlines in the table to be linked to +their origins. + *** =ob-tangle.el=: New flag to remove tangle targets before writing When ~org-babel-tangle-remove-file-before-write~ is set to ~t~ the diff --git a/lisp/org-colview.el b/lisp/org-colview.el index 7a6471377..74f7a8f58 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -1441,12 +1441,12 @@ and variances (respectively) of the individual estimates." (defun org-columns--capture-view (maxlevel match skip-empty exclude-tags format local) "Get the column view of the current buffer. -MAXLEVEL sets the level limit. SKIP-EMPTY tells whether to skip -empty rows, an empty row being one where all the column view -specifiers but ITEM are empty. EXCLUDE-TAGS is a list of tags -that will be excluded from the resulting view. FORMAT is a -format string for columns, or nil. When LOCAL is non-nil, only -capture headings in current subtree. +MAXLEVEL sets the level limit. SKIP-EMPTY tells whether to skip empty +rows, an empty row being one where all the column view specifiers but +ITEM are empty. EXCLUDE-TAGS is a list of tags that will be excluded +from the resulting view. FORMAT is a format string for columns, or nil. +When LOCAL is non-nil, only capture headings in current subtree. When +LINK is non-nil, item headlines will be linked to their origins. This function returns a list containing the title row and all other rows. Each row is either a list, or the symbol `hline'. The first list @@ -1557,6 +1557,10 @@ PARAMS is a property list of parameters: When non-nil, make each column a column group to enforce vertical lines. +`:link' + + Link the item headlines in the table to their origins. + `:formatter' A function to format the data and insert it into the @@ -1600,9 +1604,10 @@ PARAMS is a property list of parameters: TABLE is a table with data as produced by `org-columns--capture-view'. PARAMS is the parameter property list obtained from the dynamic block definition." - (let ((width-specs - (mapcar (lambda (spec) (nth 2 spec)) - org-columns-current-fmt-compiled))) + (let ((link (plist-get params :link)) + (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 @@ -1626,7 +1631,15 @@ definition." (and (numberp hlines) (<= level hlines)))) (push 'hline new-table)) (when item-index - (let ((item (org-columns--clean-item (nth item-index (cdr row))))) + (let* ((raw (nth item-index (cdr row))) + (cleaned (org-columns--clean-item raw)) + (item (if link + (let ((search (org-link-heading-search-string raw))) + (org-link-make-string + (if (not (buffer-file-name)) search + (format "file:%s::%s" (buffer-file-name) search)) + cleaned)) + cleaned))) (setf (nth item-index (cdr row)) (if (and indent (> level 1)) (concat "\\_" (make-string (* 2 (1- level)) ?\s) item) -- 2.39.3 (Apple Git-146) --=-=-=--