branch: externals/org commit f02b4c8b4d1dd4305bddfeebddaf8c545b63482d Author: Ihor Radchenko <yanta...@posteo.net> Commit: Ihor Radchenko <yanta...@posteo.net>
org-refile-get-targets: Improve malformed target handling * lisp/org-refile.el (org-refile-get-targets): Throw better errors when `org-refile-targets' value is malformed. Allow common mistake with not using a cons cell in the target description. --- lisp/org-refile.el | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/lisp/org-refile.el b/lisp/org-refile.el index f96182c00a..248b3f8ef3 100644 --- a/lisp/org-refile.el +++ b/lisp/org-refile.el @@ -273,8 +273,10 @@ converted to a headline before refiling." (entries (or org-refile-targets '((nil . (:level . 1))))) targets tgs files desc descre) (message "Getting targets...") + (cl-assert (listp entries) t "`org-refile-targets' must be a list of targets") (with-current-buffer (or default-buffer (current-buffer)) (dolist (entry entries) + (cl-assert (consp entry) t "Refile target must be a cons cell (FILES . SPECIFICATION)") (setq files (car entry) desc (cdr entry)) (cond ((null files) (setq files (list (current-buffer)))) @@ -285,26 +287,33 @@ converted to a headline before refiling." ((and (symbolp files) (boundp files)) (setq files (symbol-value files)))) (when (stringp files) (setq files (list files))) - (cond - ((eq (car desc) :tag) - (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) ":"))) - ((eq (car desc) :todo) - (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ \t]"))) - ((eq (car desc) :regexp) - (setq descre (cdr desc))) - ((eq (car desc) :level) - (setq descre (concat "^\\*\\{" (number-to-string - (if org-odd-levels-only - (1- (* 2 (cdr desc))) - (cdr desc))) - "\\}[ \t]"))) - ((eq (car desc) :maxlevel) - (setq descre (concat "^\\*\\{1," (number-to-string + ;; Allow commonly used (FILE :maxlevel N) and similar values. + (when (and (listp (cdr desc)) (null (cddr desc))) + (setq desc (cons (car desc) (cadr desc)))) + (condition-case err + (cond + ((eq (car desc) :tag) + (setq descre (concat "^\\*+[ \t]+.*?:" (regexp-quote (cdr desc)) ":"))) + ((eq (car desc) :todo) + (setq descre (concat "^\\*+[ \t]+" (regexp-quote (cdr desc)) "[ \t]"))) + ((eq (car desc) :regexp) + (setq descre (cdr desc))) + ((eq (car desc) :level) + (setq descre (concat "^\\*\\{" (number-to-string (if org-odd-levels-only - (1- (* 2 (cdr desc))) + (1- (* 2 (cdr desc))) (cdr desc))) - "\\}[ \t]"))) - (t (error "Bad refiling target description %s" desc))) + "\\}[ \t]"))) + ((eq (car desc) :maxlevel) + (setq descre (concat "^\\*\\{1," (number-to-string + (if org-odd-levels-only + (1- (* 2 (cdr desc))) + (cdr desc))) + "\\}[ \t]"))) + (t (error "Bad refiling target description %s" desc))) + (error + (error "Error parsing refiling target description: %s" + (error-message-string err)))) (dolist (f files) (with-current-buffer (if (bufferp f) f (org-get-agenda-file-buffer f)) (unless (derived-mode-p 'org-mode)