Hello, Adam Porter <a...@alphapapa.net> writes:
> Here is the new patch. Thank you. > I took the liberty of using a macro to replace the code that was > duplicated in the four agenda functions. Please let me know if you > would like any further changes. Some comments follow. > From 203bc583da0c482ab7092623383fe47c2d729420 Mon Sep 17 00:00:00 2001 > From: Adam Porter <a...@alphapapa.net> > Date: Sat, 19 Aug 2017 21:26:12 -0500 > Subject: [PATCH] org-agenda: Refactor org-agenda-overriding-header code > > 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. Nitpick: the paragraph above usually comes after the list of changes. > * lisp/org-agenda.el (org-agenda--insert-overriding-header): Add macro. > (org-agenda-list): Use macro. > (org-search-view): Use macro. > (org-todo-list): Use macro. > (org-tags-view): Use macro. Nitpick: you can only write "Use macro" once, on the last line. > +(cl-defmacro org-agenda--insert-overriding-header (&key default) Why `cl-defmacro'? Usually, `defmacro' is enough. > + "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 (&key form))) > + `(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")) While we're at it, `org-add-props' + `copy-sequence' = `propertize' > + ;; When nil, make string automatically and insert it > + ((pred null) (insert ,default)))) I suggest to use ,@default (and, obviously (&rest default) in the arguments) so we are not limited to one S-exp. > + (org-agenda--insert-overriding-header > + :default (concat (org-agenda-span-name span) > + "-agenda" > + (if (< (- d2 d1) 350) > + (if (= w1 w2) > + (format " (W%02d)" w1) > + (format " (W%02d-W%02d)" w1 w2)) > + "") If you're ready for further refactoring, the nested `if' above could be turned into a nicer `cond'. > + (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")) Same here: `mapc' + `lambda' = `dolist' to avoid funcall overhead. `s' could be let-bound too. All in all, the only requested change is `cl-defmacro' -> `defmacro'. This is no blocker if you don't want/have time to do the refactoring. Regards, -- Nicolas Goaziou