[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] feature request for empty blocks in customized agenda
From: |
Kyle Meyer |
Subject: |
Re: [O] feature request for empty blocks in customized agenda |
Date: |
Sat, 13 Jun 2015 19:00:58 -0400 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Hi,
Arun Persaud <address@hidden> 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