org-agenda: Refactor org-agenda-overriding-header code

* lisp/org-agenda.el (org-agenda--insert-overriding-header): Add macro.
(org-agenda-list)
(org-search-view)
(org-todo-list)
(org-tags-view): Use macro.
(org-agenda-overriding-header): Update docstring.

* etc/ORG-NEWS: Explain that header can be disabled with empty string.

Replace org-agenda-overriding-header tests in these four functions with
calls to a macro, eliminating the duplicate code.  Also, disable the
header when the variable is set to the empty string.
This commit is contained in:
Adam Porter 2017-08-19 21:26:12 -05:00 committed by Nicolas Goaziou
parent 601b8e1d52
commit b6c5a174da
2 changed files with 82 additions and 61 deletions

View File

@ -135,6 +135,10 @@ See docstring for details.
=org-agenda-tags-column= can now be set to =auto=, which will
automatically align tags to the right edge of the window. This is now
the default setting.
**** Disable =org-agenda-overriding-header= by setting to empty string
The =org-agenda-overriding-header= inserted into agenda views can now be
disabled by setting it to an empty string.
*** New value for ~org-publish-sitemap-sort-folders~

View File

@ -2064,6 +2064,22 @@ works you probably want to add it to `org-agenda-custom-commands' for good."
(setcdr ass (cdr entry))
(push entry org-agenda-custom-commands))))
(defmacro org-agenda--insert-overriding-header (default)
"Insert header into agenda view depending on value of `org-agenda-overriding-header'.
If the empty string, don't insert a header. If any other string,
insert it as a header. If nil, insert DEFAULT, which should
evaluate to a string."
(declare (debug (form)) (indent defun))
`(pcase org-agenda-overriding-header
("" nil) ; Don't insert a header if set to empty string
;; Insert user-specified string
((pred stringp) (insert
(org-add-props (copy-sequence org-agenda-overriding-header)
nil 'face 'org-agenda-structure)
"\n"))
;; When nil, make string automatically and insert it
((pred null) (insert ,default))))
;;; Define the org-agenda-mode
(defvar org-agenda-mode-map (make-sparse-keymap)
@ -4155,10 +4171,8 @@ items if they have an hour specification like [h]h:mm."
(w1 (org-days-to-iso-week d1))
(w2 (org-days-to-iso-week d2)))
(setq s (point))
(if org-agenda-overriding-header
(insert (org-add-props (copy-sequence org-agenda-overriding-header)
nil 'face 'org-agenda-structure) "\n")
(insert (org-agenda-span-name span)
(org-agenda--insert-overriding-header
(concat (org-agenda-span-name span)
"-agenda"
(if (< (- d2 d1) 350)
(if (= w1 w2)
@ -4576,25 +4590,25 @@ in `org-agenda-text-search-extra-files'."
(goto-char (1- end))))))))))
(setq rtn (nreverse ee))
(setq rtnall (append rtnall rtn)))
(if org-agenda-overriding-header
(insert (org-add-props (copy-sequence org-agenda-overriding-header)
nil 'face 'org-agenda-structure) "\n")
(insert "Search words: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure))
(setq pos (point))
(insert string "\n")
(add-text-properties pos (1- (point)) (list 'face 'org-warning))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys "\
(org-agenda--insert-overriding-header
(with-temp-buffer
(insert "Search words: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure))
(setq pos (point))
(insert string "\n")
(add-text-properties pos (1- (point)) (list 'face 'org-warning))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys "\
Press `\\[org-agenda-manipulate-query-add]', \
`\\[org-agenda-manipulate-query-subtract]' to add/sub word, \
`\\[org-agenda-manipulate-query-add-re]', \
`\\[org-agenda-manipulate-query-subtract-re]' to add/sub regexp, \
`\\[universal-argument] \\[org-agenda-redo]' to edit\n"))
(add-text-properties pos (1- (point))
(list 'face 'org-agenda-structure))))
(add-text-properties pos (1- (point))
(list 'face 'org-agenda-structure)))
(buffer-string)))
(org-agenda-mark-header-line (point-min))
(when rtnall
(insert (org-agenda-finalize-entries rtnall 'search) "\n"))
@ -4672,31 +4686,31 @@ for a keyword. A numeric prefix directly selects the Nth keyword in
(org-check-agenda-file file)
(setq rtn (org-agenda-get-day-entries file date :todo))
(setq rtnall (append rtnall rtn))))
(if org-agenda-overriding-header
(insert (org-add-props (copy-sequence org-agenda-overriding-header)
nil 'face 'org-agenda-structure) "\n")
(insert "Global list of TODO items of type: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure
'short-heading
(concat "ToDo: "
(or org-select-this-todo-keyword "ALL"))))
(org-agenda-mark-header-line (point-min))
(insert (org-agenda-propertize-selected-todo-keywords
org-select-this-todo-keyword))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys "Available with \
(org-agenda--insert-overriding-header
(with-temp-buffer
(insert "Global list of TODO items of type: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure
'short-heading
(concat "ToDo: "
(or org-select-this-todo-keyword "ALL"))))
(org-agenda-mark-header-line (point-min))
(insert (org-agenda-propertize-selected-todo-keywords
org-select-this-todo-keyword))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys "Available with \
`N \\[org-agenda-redo]': (0)[ALL]"))
(let ((n 0) s)
(mapc (lambda (x)
(setq s (format "(%d)%s" (setq n (1+ n)) x))
(if (> (+ (current-column) (string-width s) 1) (frame-width))
(insert "\n "))
(insert " " s))
kwds))
(insert "\n"))
(add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure)))
(let ((n 0) s)
(mapc (lambda (x)
(setq s (format "(%d)%s" (setq n (1+ n)) x))
(if (> (+ (current-column) (string-width s) 1) (frame-width))
(insert "\n "))
(insert " " s))
kwds))
(insert "\n"))
(add-text-properties pos (1- (point)) (list 'face 'org-agenda-structure))
(buffer-string)))
(org-agenda-mark-header-line (point-min))
(when rtnall
(insert (org-agenda-finalize-entries rtnall 'todo) "\n"))
@ -4774,24 +4788,24 @@ The prefix arg TODO-ONLY limits the search to TODO entries."
matcher
org--matcher-tags-todo-only))
(setq rtnall (append rtnall rtn))))))))
(if org-agenda-overriding-header
(insert (org-add-props (copy-sequence org-agenda-overriding-header)
nil 'face 'org-agenda-structure) "\n")
(insert "Headlines with TAGS match: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure
'short-heading
(concat "Match: " match)))
(setq pos (point))
(insert match "\n")
(add-text-properties pos (1- (point)) (list 'face 'org-warning))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys
"Press `\\[universal-argument] \\[org-agenda-redo]' \
(org-agenda--insert-overriding-header
(with-temp-buffer
(insert "Headlines with TAGS match: ")
(add-text-properties (point-min) (1- (point))
(list 'face 'org-agenda-structure
'short-heading
(concat "Match: " match)))
(setq pos (point))
(insert match "\n")
(add-text-properties pos (1- (point)) (list 'face 'org-warning))
(setq pos (point))
(unless org-agenda-multi
(insert (substitute-command-keys
"Press `\\[universal-argument] \\[org-agenda-redo]' \
to search again with new search string\n")))
(add-text-properties pos (1- (point))
(list 'face 'org-agenda-structure)))
(add-text-properties pos (1- (point))
(list 'face 'org-agenda-structure))
(buffer-string)))
(org-agenda-mark-header-line (point-min))
(when rtnall
(insert (org-agenda-finalize-entries rtnall 'tags) "\n"))
@ -4815,8 +4829,11 @@ used by user-defined selections using `org-agenda-skip-function'.")
(defvar org-agenda-overriding-header nil
"When set during agenda, todo and tags searches it replaces the header.
This variable should not be set directly, but custom commands can bind it
in the options section.")
If an empty string, no header will be inserted. If any other
string, it will be inserted as a header. If nil, a header will
be generated automatically according to the command. This
variable should not be set directly, but custom commands can bind
it in the options section.")
(defun org-agenda-skip-entry-if (&rest conditions)
"Skip entry if any of CONDITIONS is true.