From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stig Brautaset Subject: Re: Conditional summing in column-mode? Date: Fri, 01 Sep 2017 01:07:07 +0100 Message-ID: References: <87bmn4ytce.fsf@nicolasgoaziou.fr> <87shgfxvzr.fsf@nicolasgoaziou.fr> <87tw0qrgqd.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:50653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dnZUQ-0005DW-1G for emacs-orgmode@gnu.org; Thu, 31 Aug 2017 20:07:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dnZUM-0000mn-Rh for emacs-orgmode@gnu.org; Thu, 31 Aug 2017 20:07:14 -0400 Received: from relay2-d.mail.gandi.net ([2001:4b98:c:538::194]:48175) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dnZUM-0000m0-Ku for emacs-orgmode@gnu.org; Thu, 31 Aug 2017 20:07:10 -0400 In-reply-to: <87tw0qrgqd.fsf@nicolasgoaziou.fr> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Nicolas Goaziou Cc: emacs-org list Nicolas Goaziou writes: >> Is there a hook I can use that is called before the property values >> are extracted? (I wasn't able to find one.) > > There isn't. > > But here is an idea: `org-columns-summary-types' could also accept > entries like: > > (LABEL SUMMARIZE COLLECT) > > where COLLECT is a function called on each summarized entry. SUMMARIZE > is applied on the values returned by COLLECT. When not provided, COLLECT > default to `org-entry-get' as it is the case already. > > WDYT? I think I like it. So I could then do something like: (defun sb/org-collect-confirmed-days () "Return `DAYS' for `CONFIRMED' entries, otherwise return 0" (let ((days (org-entry-get nil "DAYS")) (confirmed (org-entry-get nil "CONFIRMED"))) (if (and days (string= "[X]" confirmed)) days "0"))) (setq org-columns-summary-types '(("X+" org-columns--summary-sum sb/org-collect-confirmed-days))) That seems quite elegant! I guess the COLLECT function would be called in `org-agenda-colview-summarize' such that the existing summary functions would not need to change? Though, there will then be a tight coupling between the "X+" label and the column name, which is not ideal. Perhaps the COLLECT function could (optionally?) take the column name (or the whole column spec) as an argument so we could do something like: (defun sb/org-collect-confirmed-things (thing) "Return `THING for `CONFIRMED' entries, otherwise return 0" (let ((thing (org-entry-get nil thing)) (confirmed (org-entry-get nil "CONFIRMED"))) (if (and thing (string= "[X]" confirmed)) thing "0"))) Then we could use =X+= to calculate both confirmed Days and Bananas: #+COLUMNS: %TIMESTAMP(When) %ITEM(What) %CONFIRMED(Confirmed?){X/} %Days(X+) %Bananas(X+) Does this make sense? I don't mind having a go at adding support for this, though I admit I'm slightly terrified of the code in `org-agenda-colview-summarize' :-) Stig