diff --git a/org-ql-search.el b/org-ql-search.el index 4fb54897..2e75ded3 100644 --- a/org-ql-search.el +++ b/org-ql-search.el @@ -242,6 +242,15 @@ automatically from the query." "Insert content for org-ql dynamic block at point according to PARAMS. Valid parameters include: + :scope The scope to consider for the Org QL query. This can + be one of the following: + + `buffer' the current buffer + `org-agenda-files' all agenda files + `org-directory' all org files + `(\"path\" ...)' list of buffer names or file paths + `all' all agenda files, and org-mode buffers + :query An Org QL query expression in either sexp or string form. @@ -271,13 +280,18 @@ Valid parameters include: For example, an org-ql dynamic block header could look like: #+BEGIN: org-ql :query (todo \"UNDERWAY\") :columns (priority todo heading) :sort (priority date) :ts-format \"%Y-%m-%d %H:%M\"" - (-let* (((&plist :query :columns :sort :ts-format :take) params) + (-let* (((&plist :scope :query :columns :sort :ts-format :take) params) (query (cl-etypecase query (string (org-ql--query-string-to-sexp query)) (list ;; SAFETY: Query is in sexp form: ask for confirmation, because it could contain arbitrary code. (org-ql--ask-unsafe-query query) query))) (columns (or columns '(heading todo (priority "P")))) + (scope (cond ((and (listp scope) (seq-every-p #'stringp scope)) scope) + ((string-equal scope "org-agenda-files") (org-agenda-files)) + ((or (not scope) (string-equal scope "buffer")) (current-buffer)) + ((string-equal scope "org-directory") (org-ql-search-directories-files)) + (t (user-error "Unknown scope '%s'" scope)))) ;; MAYBE: Custom column functions. (format-fns ;; NOTE: Backquoting this alist prevents the lambdas from seeing @@ -285,9 +299,19 @@ For example, an org-ql dynamic block header could look like: (list (cons 'todo (lambda (element) (org-element-property :todo-keyword element))) (cons 'heading (lambda (element) - (org-make-link-string (org-element-property :raw-value element) - (org-link-display-format - (org-element-property :raw-value element))))) + (cond + ((and org-id-link-to-org-use-id + (org-element-property :ID element)) + (org-make-link-string (format "id:%s" (org-element-property :ID element)) + (org-element-property :raw-value element))) + ((org-element-property :file element) + (org-make-link-string (format "file:%s::*%s" + (org-element-property :file element) + (org-element-property :raw-value element)) + (org-element-property :raw-value element))) + (t (org-make-link-string (org-element-property :raw-value element) + (org-link-display-format + (org-element-property :raw-value element))))))) (cons 'priority (lambda (element) (--when-let (org-element-property :priority element) (char-to-string it)))) @@ -302,9 +326,9 @@ For example, an org-ql dynamic block header could look like: (ts-format ts-format (ts-parse-org-element it))))) (cons 'property (lambda (element property) (org-element-property (intern (concat ":" (upcase property))) element))))) - (elements (org-ql-query :from (current-buffer) + (elements (org-ql-query :from scope :where query - :select '(org-element-headline-parser (line-end-position)) + :select '(org-element-put-property (org-element-headline-parser (line-end-position)) :file (buffer-file-name)) :order-by sort))) (when take (setf elements (cl-etypecase take