From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kyle Meyer Subject: Re: feature request for empty blocks in customized agenda Date: Sat, 13 Jun 2015 19:00:58 -0400 Message-ID: <871thfnrh1.fsf@kmlap.domain.org> References: <557C8E8D.9020400@lbl.gov> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52132) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z3uQF-0007Fk-0G for emacs-orgmode@gnu.org; Sat, 13 Jun 2015 19:01:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z3uQB-0004vT-Ka for emacs-orgmode@gnu.org; Sat, 13 Jun 2015 19:01:06 -0400 Received: from mail-qk0-f177.google.com ([209.85.220.177]:34377) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z3uQB-0004td-Gh for emacs-orgmode@gnu.org; Sat, 13 Jun 2015 19:01:03 -0400 Received: by qkdm188 with SMTP id m188so13595813qkd.1 for ; Sat, 13 Jun 2015 16:01:02 -0700 (PDT) In-Reply-To: <557C8E8D.9020400@lbl.gov> (Arun Persaud's message of "Sat, 13 Jun 2015 13:11:57 -0700") 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-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Arun Persaud Cc: emacs-orgmode Hi, Arun Persaud wrote: > Hi > > I just started using a customized agenda with many blocks and some of my > blocks are often empty. However, org-mode still insert the header and > the separator between blocks. Is there a way to skip empty blocks > completely? Not that I'm aware of. > I had a quick look at org-agenda.el and it seems that it directly > inserts text, e.g. the header, into the buffer, before it even knows how > many items it added. I guess one could remember point at the beginning, > count the items inserted and if that's 0, delete backwards to the saved > point? > My elisp knowledge is probably not good enough to add this though and it > also seems one would have to add it at different location > (org-agenda-list, org-agenda-todo, etc). > > I also checked org-agenda-compact-blocks, but that removes the separator > from all blocks, which is not what I want. > > Any chance to get something like this added? I'm not sure if someone will find this feature useful enough to incorporate. However, even if it doesn't get added, I think you can get the behavior you want using org-agenda-finalize-hook. Hopefully the snippet below can be a useful starting point. #+begin_src elisp (defun org-agenda-delete-empty-blocks () "Remove empty agenda blocks. A block is identified as empty if there are fewer than 2 non-empty lines in the block (excluding the line with `org-agenda-block-separator' characters)." (when org-agenda-compact-blocks (user-error "Cannot delete empty compact blocks")) (setq buffer-read-only nil) (save-excursion (goto-char (point-min)) (let* ((blank-line-re "^\\s-*$") (content-line-count (if (looking-at-p blank-line-re) 0 1)) (start-pos (point)) (block-re (format "%c\\{10,\\}" org-agenda-block-separator))) (while (and (not (eobp)) (forward-line)) (cond ((looking-at-p block-re) (when (< content-line-count 2) (delete-region start-pos (1+ (point-at-bol)))) (setq start-pos (point)) (forward-line) (setq content-line-count (if (looking-at-p blank-line-re) 0 1))) ((not (looking-at-p blank-line-re)) (setq content-line-count (1+ content-line-count))))) (when (< content-line-count 2) (delete-region start-pos (point-max))) (goto-char (point-min)) ;; The above strategy can leave a separator line at the beginning ;; of the buffer. (when (looking-at-p block-re) (delete-region (point) (1+ (point-at-eol)))))) (setq buffer-read-only t)) (add-hook 'org-agenda-finalize-hook #'org-agenda-delete-empty-blocks) #+end_src -- Kyle