+emacs+删除掉空的agenda-block
在使用org-agenda-custom-commands时,有时会创建agenda-block。如果你是用的org-ql-block,那么在未query到结果时会为空;但如果你用的org-agenda,则可能会因为一些原因留有空的block。
根据reddit的一个帖子,以下函数可以在某个block有小于2行不以空格开头时,删除掉这个block。
(标题为一行,分割线上的空格为一行)
(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+ (pos-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))) ;; 上面这个函数是针对agenda-block在最下方写的,会让agenda中更改todo状态后的文本消失。 (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+ (pos-eol)))))) (setq buffer-read-only t)) (add-hook 'org-agenda-finalize-hook #'org-agenda-delete-empty-blocks)
当然,我们也可以自定义 blank-line-re
的值,用来匹配其他文本内容。