Merge: (org-ql-open-link) And associated changes

This commit is contained in:
Adam Porter 2023-10-25 03:30:41 -05:00
commit bd2dd12a41
4 changed files with 261 additions and 124 deletions

View file

@ -119,6 +119,12 @@ Note that these commands are compatible with [[https://github.com/oantolin/embar
[[images/org-ql-find.png]] [[images/org-ql-find.png]]
*** org-ql-open-link
This command finds links in entries matching the input query and offers them for selection; the selected link is then opened with ~org-open-at-point~.
The input is matched using the default predicate, which means it searches both entry content and outline paths. This is helpful when a collection of links are kept in Org files: rather than having to first visit the entry containing the desired link, then locate it within the entry, and then open it, the user can simply select the link and open it directly. For example, if an entry with the heading =Emacs= contained a link named =mailing list=, one could search for =Emacs list= and open the link to the mailing list directly.
*** org-ql-refile *** org-ql-refile
This command refiles the current Org entry to one selected by searching with Org QL completion. It searches files listed in ~org-refile-targets~ as well as the current buffer. This command refiles the current Org entry to one selected by searching with Org QL completion. It searches files listed in ~org-refile-targets~ as well as the current buffer.
@ -554,6 +560,7 @@ Simple links may also be written manually in either sexp or non-sexp form, like:
+ Function ~org-ql-completing-read~, used by command ~org-ql-find~, now specifies the completion category as ~org-heading~, providing compatibility with [[https://github.com/oantolin/embark][Embark]]. (This is a powerful feature, as it means any ~org-ql-find~ result can be acted on from inside the search results with Embark, which provides common actions from Org Agenda and Org speed keys bindings.) ([[https://github.com/alphapapa/org-ql/issues/299][#299]]. Thanks to [[https://github.com/oantolin][Omar Antolín Camarena]], [[https://github.com/minad][Daniel Mendler]], and [[https://github.com/akirak][Akira Komamura]].) + Function ~org-ql-completing-read~, used by command ~org-ql-find~, now specifies the completion category as ~org-heading~, providing compatibility with [[https://github.com/oantolin/embark][Embark]]. (This is a powerful feature, as it means any ~org-ql-find~ result can be acted on from inside the search results with Embark, which provides common actions from Org Agenda and Org speed keys bindings.) ([[https://github.com/alphapapa/org-ql/issues/299][#299]]. Thanks to [[https://github.com/oantolin][Omar Antolín Camarena]], [[https://github.com/minad][Daniel Mendler]], and [[https://github.com/akirak][Akira Komamura]].)
+ Command ~org-ql-find~ may be called in an ~org-agenda~ or ~org-ql-view~ buffer to search the buffers which contributed to the agenda/view buffer. + Command ~org-ql-find~ may be called in an ~org-agenda~ or ~org-ql-view~ buffer to search the buffers which contributed to the agenda/view buffer.
+ Command ~org-ql-find-path~, which searches outline paths in the current buffer. + Command ~org-ql-find-path~, which searches outline paths in the current buffer.
+ Command ~org-ql-open-link~, which finds links in entries matching the given query, and opens the selected one with ~org-open-at-point~. (This is helpful when a collection of links are kept in Org files: rather than having to first visit the entry containing the desired link, then locate it within the entry, and then open it, the user can simply select the link and open it directly.)
*Compatibility* *Compatibility*

View file

@ -73,14 +73,58 @@ For an experience like `org-rifle', use a newline."
(defface org-ql-completing-read-snippet '((t (:inherit font-lock-comment-face))) (defface org-ql-completing-read-snippet '((t (:inherit font-lock-comment-face)))
"Snippets.") "Snippets.")
(defvar org-ql-completing-read-input-regexp nil
"Current regexp for `org-ql-completing-read' input.
To be used in, e.g. annotation functions.")
;;;; Functions ;;;; Functions
(defun org-ql-completing-read-action ()
"Default action for `org-ql-completing-read'.
Returns (STRING . MARKER) cons for entry at point."
(font-lock-ensure (point-at-bol) (point-at-eol))
(cons (org-link-display-format (org-entry-get nil "ITEM")) (point-marker)))
(defun org-ql-completing-read-snippet (marker)
"Return snippet for entry at MARKER.
Returns value returned by function
`org-ql-completing-read-snippet-function' or
`org-ql-completing-read--snippet-simple', whichever returns a
value, or nil."
(pcase (while-no-input
;; Using `while-no-input' here doesn't make it as
;; responsive as, e.g. Helm while typing, but it seems to
;; help a little when using the org-rifle-style snippets.
(org-with-point-at marker
(or (funcall org-ql-completing-read-snippet-function)
(org-ql-completing-read--snippet-simple))))
(`t ;; Interrupted: return nil (which can be concatted).
nil)
(else else)))
(defun org-ql-completing-read-path (marker)
"Return formatted outline path for entry at MARKER."
(org-with-point-at marker
(let ((path (thread-first (org-get-outline-path nil t)
(org-format-outline-path (window-width) nil "")
(org-split-string ""))))
(if org-ql-completing-read-reverse-paths
(concat "\\" (string-join (reverse path) "\\"))
(concat "/" (string-join path "/"))))))
;;;;; Completing read ;;;;; Completing read
;;;###autoload ;;;###autoload
(cl-defun org-ql-completing-read (buffers-files &key query-prefix query-filter (cl-defun org-ql-completing-read
(buffers-files &key query-prefix query-filter
(action #'org-ql-completing-read-action)
;; FIXME: Unused argument.
(annotate #'org-ql-completing-read-snippet)
(snippet #'org-ql-completing-read-snippet)
(path #'org-ql-completing-read-path)
(action-filter #'list)
(prompt "Find entry: ")) (prompt "Find entry: "))
"Return marker at Org entry in BUFFERS-FILES selected with `org-ql'. "Return marker at entry in BUFFERS-FILES selected with `org-ql'.
PROMPT is shown to the user. PROMPT is shown to the user.
QUERY-PREFIX may be a string to prepend to the query entered by QUERY-PREFIX may be a string to prepend to the query entered by
@ -107,30 +151,29 @@ single predicate)."
(let ((table (make-hash-table :test #'equal)) (let ((table (make-hash-table :test #'equal))
(disambiguations (make-hash-table :test #'equal)) (disambiguations (make-hash-table :test #'equal))
(window-width (window-width)) (window-width (window-width))
last-input org-outline-path-cache query-tokens snippet-regexp) last-input org-outline-path-cache query-tokens)
(cl-labels (;; (debug-message (cl-labels (;; (debug-message
;; (f &rest args) (apply #'message (concat "ORG-QL-COMPLETING-READ: " f) args)) ;; (f &rest args) (apply #'message (concat "ORG-QL-COMPLETING-READ: " f) args))
(action (action ()
() (font-lock-ensure (point-at-bol) (point-at-eol)) (font-lock-ensure (point-at-bol) (point-at-eol))
;; FIXME: We want the fontified heading, and `org-heading-components' returns it ;; This function needs to handle multiple candidates per
;; without properties, so we have to use `org-get-heading', which added additional ;; call, so we loop over a list of values by default.
;; optional arguments in a certain Org version, so in those versions, it will (pcase-dolist (`(,string . ,marker) (funcall action-filter (funcall action)))
;; return priority cookies and comment strings. (when string
(let ((heading (org-link-display-format (org-entry-get (point) "ITEM")))) (if (string-empty-p string)
(if (string-empty-p heading)
;; A heading's string can be empty, but we can't use one because it ;; A heading's string can be empty, but we can't use one because it
;; wouldn't be useful to the user; and if one is found, it's very ;; wouldn't be useful to the user; and if one is found, it's very
;; likely to indicate an unnoticed mistake or corruption in the ;; likely to indicate an unnoticed mistake or corruption in the
;; file: so display a warning and don't record it as a candidate. ;; file: so display a warning and don't record it as a candidate.
(warn "Empty heading at %S in %S" (point) (buffer-name)) (display-warning 'org-ql-completing-read (format-message "Empty heading at %S" marker))
(when (gethash heading table) (when (gethash string table)
;; Disambiguate heading (even adding the path isn't enough, because that could ;; Disambiguate string (even adding the path isn't enough, because that could
;; also be duplicated). ;; also be duplicated).
(if-let ((suffix (gethash heading disambiguations))) (if-let ((suffix (gethash string disambiguations)))
(setf heading (format "%s <%s>" heading (cl-incf suffix))) (setf string (format "%s <%s>" string (cl-incf suffix)))
(setf heading (format "%s <%s>" heading (puthash heading 2 disambiguations))))) (setf string (format "%s <%s>" string (puthash string 2 disambiguations)))))
(let ((marker (point-marker))) (puthash (propertize string 'org-marker marker) marker table)))))
(puthash (propertize heading 'org-marker marker) marker table)))))
(path (marker) (path (marker)
(org-with-point-at marker (org-with-point-at marker
(let* ((path (thread-first (org-get-outline-path nil t) (let* ((path (thread-first (org-get-outline-path nil t)
@ -149,7 +192,7 @@ single predicate)."
(cl-loop for completion in completions (cl-loop for completion in completions
for marker = (get-text-property 0 'org-marker completion) for marker = (get-text-property 0 'org-marker completion)
for prefix = (todo marker) for prefix = (todo marker)
for suffix = (concat (path marker) " " (snippet marker)) for suffix = (concat (funcall path marker) " " (funcall snippet marker))
collect (list completion prefix suffix))) collect (list completion prefix suffix)))
(annotate (candidate) (annotate (candidate)
;; (debug-message "ANNOTATE:%S" candidate) ;; (debug-message "ANNOTATE:%S" candidate)
@ -162,7 +205,7 @@ single predicate)."
(marker) (when-let (marker) (when-let
((snippet ((snippet
(org-with-point-at marker (org-with-point-at marker
(or (funcall org-ql-completing-read-snippet-function snippet-regexp) (or (funcall org-ql-completing-read-snippet-function org-ql-completing-read-input-regexp)
(org-ql-completing-read--snippet-simple))))) (org-ql-completing-read--snippet-simple)))))
(propertize (concat " " snippet) (propertize (concat " " snippet)
'face 'org-ql-completing-read-snippet))) 'face 'org-ql-completing-read-snippet)))
@ -183,7 +226,16 @@ single predicate)."
(cons 'category 'org-heading) (cons 'category 'org-heading)
(cons 'group-function #'group) (cons 'group-function #'group)
(cons 'affixation-function #'affix) (cons 'affixation-function #'affix)
(cons 'annotation-function #'annotate))) (cons 'annotation-function #'annotate)
(cons 'display-sort-function
(lambda (strings)
(let ((quoted-tokens (mapcar #'regexp-quote query-tokens)))
(sort strings
(lambda (a b)
(cl-labels ((matches
(s) (cl-loop for token in quoted-tokens
count (string-match-p token s))))
(> (matches a) (matches b))))))))))
(`t (`t
;; (debug-message "COLLECTION:t INPUT:%S KEYS:%S" ;; (debug-message "COLLECTION:t INPUT:%S KEYS:%S"
;; input (hash-table-keys table)) ;; input (hash-table-keys table))
@ -240,23 +292,24 @@ single predicate)."
(clrhash disambiguations) (clrhash disambiguations)
(when query-filter (when query-filter
(setf input (funcall query-filter input))) (setf input (funcall query-filter input)))
(pcase org-ql-completing-read-snippet-function
('org-ql-completing-read--snippet-regexp
(setf query-tokens (setf query-tokens
;; Remove any tokens that specify predicates or are too short. ;; Remove any tokens that specify predicates or are too short.
(--select (not (or (string-match-p (rx bos (1+ (not (any ":"))) ":") it) (--select (not (or (string-match-p (rx bos (1+ (not (any ":"))) ":") it)
(< (length it) org-ql-completing-read-snippet-minimum-token-length))) (< (length it) org-ql-completing-read-snippet-minimum-token-length)))
(split-string input nil t (rx space))) (split-string input nil t (rx blank)))
snippet-regexp org-ql-completing-read-input-regexp
(when query-tokens (when query-tokens
;; Limiting each context word to 15 characters prevents ;; Limiting each context word to 15 characters prevents
;; excessively long, non-word strings from ending up in ;; excessively long, non-word strings from ending up in
;; snippets, which can adversely affect performance. ;; snippets, which can adversely affect performance.
(rx-to-string `(seq (optional (repeat 1 3 (repeat 1 15 (not space)) (0+ space))) (rx-to-string `(seq (optional (repeat 1 3 (repeat 1 15 (not space)) (0+ space)))
bow (or ,@query-tokens) (0+ (not space)) bow (or ,@query-tokens) (0+ (not space))
(optional (repeat 1 3 (0+ space) (repeat 1 15 (not space)))))))))) (optional (repeat 1 3 (0+ space) (repeat 1 15 (not space))))))))
(org-ql-select buffers-files (org-ql--query-string-to-sexp input) (org-ql-select buffers-files (org-ql--query-string-to-sexp input)
:action #'action)))) :action #'action))))
(unless (listp buffers-files)
;; Since we map across this argument, we ensure it's a list.
(setf buffers-files (list buffers-files)))
;; NOTE: It seems that the `completing-read' machinery can call, abort, and re-call the ;; NOTE: It seems that the `completing-read' machinery can call, abort, and re-call the
;; collection function while the user is typing, which can interrupt the machinery Org uses to ;; collection function while the user is typing, which can interrupt the machinery Org uses to
;; prepare an Org buffer when an Org file is loaded. This results in, e.g. the buffer being ;; prepare an Org buffer when an Org file is loaded. This results in, e.g. the buffer being
@ -266,9 +319,6 @@ single predicate)."
;; `completing-read' machinery, which interrupts it, so we must work around this problem by ;; `completing-read' machinery, which interrupts it, so we must work around this problem by
;; ensuring all of the BUFFERS-FILES are loaded and initialized before calling ;; ensuring all of the BUFFERS-FILES are loaded and initialized before calling
;; `completing-read'. ;; `completing-read'.
(unless (listp buffers-files)
;; Since we map across this argument, we ensure it's a list.
(setf buffers-files (list buffers-files)))
(mapc #'org-ql--ensure-buffer buffers-files) (mapc #'org-ql--ensure-buffer buffers-files)
(let* ((completion-styles '(org-ql-completing-read)) (let* ((completion-styles '(org-ql-completing-read))
(completion-styles-alist (list (list 'org-ql-completing-read #'try #'all "Org QL Find"))) (completion-styles-alist (list (list 'org-ql-completing-read #'try #'all "Org QL Find")))
@ -287,7 +337,7 @@ single predicate)."
(car (hash-table-values table)) (car (hash-table-values table))
(user-error "No results for input")))))) (user-error "No results for input"))))))
(defun org-ql-completing-read--snippet-simple (&optional _regexp) (defun org-ql-completing-read--snippet-simple ()
"Return a snippet of the current entry. "Return a snippet of the current entry.
Returns up to `org-ql-completing-read-snippet-length' characters." Returns up to `org-ql-completing-read-snippet-length' characters."
(save-excursion (save-excursion

View file

@ -141,6 +141,57 @@ which see (but only the files are used)."
(let ((org-ql-default-predicate 'outline-path)) (let ((org-ql-default-predicate 'outline-path))
(org-ql-find (current-buffer)))) (org-ql-find (current-buffer))))
;;;###autoload
(cl-defun org-ql-open-link (buffers-files &key query-prefix query-filter
(prompt "Open link: "))
"Open a link selected with `org-ql-completing-read'.
Links found in entries matching the input query are offered as
candidates, and the selected one is opened with
`org-open-at-point'. Arguments BUFFERS-FILES, QUERY-FILTER,
QUERY-PREFIX, and PROMPT are passed to `org-ql-completing-read',
which see."
(interactive
;; FIXME: Factor this out.
(list (if current-prefix-arg
(mapcar #'get-buffer
(completing-read-multiple
"Buffers: "
(cl-loop for buffer in (buffer-list)
when (eq 'org-mode (buffer-local-value 'major-mode buffer))
collect (buffer-name buffer))
nil t))
(progn
(unless (eq major-mode 'org-mode)
(user-error "This is not an Org buffer: %S" (current-buffer)))
(current-buffer)))))
(let* ((marker (org-ql-completing-read buffers-files
:query-prefix query-prefix
:query-filter query-filter
:prompt prompt
:action-filter #'identity
:action (lambda ()
(save-excursion
(cl-loop with limit = (org-entry-end-position)
while (re-search-forward org-link-any-re limit t)
for link = (string-trim (match-string 0))
do (progn
(set-text-properties 0 (length link) '(face org-link) link)
(setf link (org-link-display-format link)))
collect (cons link (copy-marker (match-beginning 0))))))
:snippet (lambda (&rest _)
"")
:path (lambda (marker)
(org-with-point-at marker
(let* ((path (thread-first (org-get-outline-path t t)
(org-format-outline-path (window-width) nil "")
(org-split-string "")))
(formatted-path (if org-ql-completing-read-reverse-paths
(concat "\\" (string-join (reverse path) "\\"))
(concat "/" (string-join path "/")))))
formatted-path))))))
(org-with-point-at marker
(org-open-at-point))))
(provide 'org-ql-find) (provide 'org-ql-find)
;;; org-ql-find.el ends here ;;; org-ql-find.el ends here

View file

@ -48,6 +48,7 @@ Usage
Commands Commands
* org-ql-find:: * org-ql-find::
* org-ql-open-link::
* org-ql-refile:: * org-ql-refile::
* org-ql-search:: * org-ql-search::
* helm-org-ql:: * helm-org-ql::
@ -207,6 +208,7 @@ File: README.info, Node: Commands, Next: Queries, Up: Usage
* Menu: * Menu:
* org-ql-find:: * org-ql-find::
* org-ql-open-link::
* org-ql-refile:: * org-ql-refile::
* org-ql-search:: * org-ql-search::
* helm-org-ql:: * helm-org-ql::
@ -216,7 +218,7 @@ File: README.info, Node: Commands, Next: Queries, Up: Usage
* org-ql-sparse-tree:: * org-ql-sparse-tree::
 
File: README.info, Node: org-ql-find, Next: org-ql-refile, Up: Commands File: README.info, Node: org-ql-find, Next: org-ql-open-link, Up: Commands
4.1.1 org-ql-find 4.1.1 org-ql-find
----------------- -----------------
@ -237,9 +239,28 @@ called on a completion candidate (i.e. a search result) to act on it
immediately, without having to visit the entry in its source Org buffer. immediately, without having to visit the entry in its source Org buffer.
 
File: README.info, Node: org-ql-refile, Next: org-ql-search, Prev: org-ql-find, Up: Commands File: README.info, Node: org-ql-open-link, Next: org-ql-refile, Prev: org-ql-find, Up: Commands
4.1.2 org-ql-refile 4.1.2 org-ql-open-link
----------------------
This command finds links in entries matching the input query and offers
them for selection; the selected link is then opened with
org-open-at-point.
The input is matched using the default predicate, which means it
searches both entry content and outline paths. This is helpful when a
collection of links are kept in Org files: rather than having to first
visit the entry containing the desired link, then locate it within the
entry, and then open it, the user can simply select the link and open it
directly. For example, if an entry with the heading Emacs contained a
link named mailing list, one could search for Emacs list and open
the link to the mailing list directly.

File: README.info, Node: org-ql-refile, Next: org-ql-search, Prev: org-ql-open-link, Up: Commands
4.1.3 org-ql-refile
------------------- -------------------
This command refiles the current Org entry to one selected by searching This command refiles the current Org entry to one selected by searching
@ -249,7 +270,7 @@ with Org QL completion. It searches files listed in
 
File: README.info, Node: org-ql-search, Next: helm-org-ql, Prev: org-ql-refile, Up: Commands File: README.info, Node: org-ql-search, Next: helm-org-ql, Prev: org-ql-refile, Up: Commands
4.1.3 org-ql-search 4.1.4 org-ql-search
------------------- -------------------
_Note: This command supports both sexp queries and ._ _Note: This command supports both sexp queries and ._
@ -297,7 +318,7 @@ entry in its source Org buffer.
 
File: README.info, Node: helm-org-ql, Next: org-ql-view, Prev: org-ql-search, Up: Commands File: README.info, Node: helm-org-ql, Next: org-ql-view, Prev: org-ql-search, Up: Commands
4.1.4 helm-org-ql 4.1.5 helm-org-ql
----------------- -----------------
_Note: This command uses . It is available separately in the package _Note: This command uses . It is available separately in the package
@ -311,7 +332,7 @@ _Note: This command uses . It is available separately in the package
 
File: README.info, Node: org-ql-view, Next: org-ql-view-sidebar, Prev: helm-org-ql, Up: Commands File: README.info, Node: org-ql-view, Next: org-ql-view-sidebar, Prev: helm-org-ql, Up: Commands
4.1.5 org-ql-view 4.1.6 org-ql-view
----------------- -----------------
Choose and display a view stored in org-ql-views. Choose and display a view stored in org-ql-views.
@ -326,7 +347,7 @@ Choose and display a view stored in org-ql-views.
 
File: README.info, Node: org-ql-view-sidebar, Next: org-ql-view-recent-items, Prev: org-ql-view, Up: Commands File: README.info, Node: org-ql-view-sidebar, Next: org-ql-view-recent-items, Prev: org-ql-view, Up: Commands
4.1.6 org-ql-view-sidebar 4.1.7 org-ql-view-sidebar
------------------------- -------------------------
Show a sidebar window listing views stored in org-ql-views for easy Show a sidebar window listing views stored in org-ql-views for easy
@ -336,7 +357,7 @@ point, and press c to customize the view at point.
 
File: README.info, Node: org-ql-view-recent-items, Next: org-ql-sparse-tree, Prev: org-ql-view-sidebar, Up: Commands File: README.info, Node: org-ql-view-recent-items, Next: org-ql-sparse-tree, Prev: org-ql-view-sidebar, Up: Commands
4.1.7 org-ql-view-recent-items 4.1.8 org-ql-view-recent-items
------------------------------ ------------------------------
Show items in FILES from last DAYS days with timestamps of TYPE. Show items in FILES from last DAYS days with timestamps of TYPE.
@ -347,7 +368,7 @@ returned by the function org-agenda-files.
 
File: README.info, Node: org-ql-sparse-tree, Prev: org-ql-view-recent-items, Up: Commands File: README.info, Node: org-ql-sparse-tree, Prev: org-ql-view-recent-items, Up: Commands
4.1.8 org-ql-sparse-tree 4.1.9 org-ql-sparse-tree
------------------------ ------------------------
Arguments: (query &key keep-previous (buffer (current-buffer))) Arguments: (query &key keep-previous (buffer (current-buffer)))
@ -1059,6 +1080,13 @@ File: README.info, Node: 08-pre, Next: 073, Up: Changelog
agenda/view buffer. agenda/view buffer.
• Command org-ql-find-path, which searches outline paths in the • Command org-ql-find-path, which searches outline paths in the
current buffer. current buffer.
• Command org-ql-open-link, which finds links in entries matching
the given query, and opens the selected one with
org-open-at-point. (This is helpful when a collection of links
are kept in Org files: rather than having to first visit the entry
containing the desired link, then locate it within the entry, and
then open it, the user can simply select the link and open it
directly.)
*Compatibility* *Compatibility*
@ -1811,74 +1839,75 @@ GPLv3
 
Tag Table: Tag Table:
Node: Top225 Node: Top225
Node: Contents1824 Node: Contents1845
Node: Screenshots1947 Node: Screenshots1968
Node: Installation2065 Node: Installation2086
Node: Quelpa2579 Node: Quelpa2600
Node: Helm support3107 Node: Helm support3128
Node: Usage3510 Node: Usage3531
Node: Commands3908 Node: Commands3929
Node: org-ql-find4352 Node: org-ql-find4394
Node: org-ql-refile5167 Node: org-ql-open-link5212
Node: org-ql-search5490 Node: org-ql-refile6067
Node: helm-org-ql7421 Node: org-ql-search6395
Node: org-ql-view7799 Node: helm-org-ql8326
Node: org-ql-view-sidebar8329 Node: org-ql-view8704
Node: org-ql-view-recent-items8709 Node: org-ql-view-sidebar9234
Node: org-ql-sparse-tree9205 Node: org-ql-view-recent-items9614
Node: Queries10005 Node: org-ql-sparse-tree10110
Node: Non-sexp query syntax11122 Node: Queries10910
Node: General predicates12881 Node: Non-sexp query syntax12027
Node: Ancestor/descendant predicates19868 Node: General predicates13786
Node: Date/time predicates20996 Node: Ancestor/descendant predicates20773
Node: Functions / Macros24120 Node: Date/time predicates21901
Node: Agenda-like views24418 Node: Functions / Macros25025
Ref: Function org-ql-block24580 Node: Agenda-like views25323
Node: Listing / acting-on results25841 Ref: Function org-ql-block25485
Ref: Caching26049 Node: Listing / acting-on results26746
Ref: Function org-ql-select26962 Ref: Caching26954
Ref: Function org-ql-query29388 Ref: Function org-ql-select27867
Ref: Macro org-ql (deprecated)31162 Ref: Function org-ql-query30293
Node: Custom predicates31477 Ref: Macro org-ql (deprecated)32067
Ref: Macro org-ql-defpred31701 Node: Custom predicates32382
Node: Dynamic block35142 Ref: Macro org-ql-defpred32606
Node: Links37866 Node: Dynamic block36047
Node: Tips38553 Node: Links38771
Node: Changelog38877 Node: Tips39458
Node: 08-pre39687 Node: Changelog39782
Node: 07341020 Node: 08-pre40592
Node: 07241755 Node: 07342357
Node: 07142674 Node: 07243092
Node: 0743483 Node: 07144011
Node: 06346407 Node: 0744820
Node: 06246938 Node: 06347744
Node: 06147243 Node: 06248275
Node: 0647811 Node: 06148580
Node: 05250865 Node: 0649148
Node: 05151167 Node: 05252202
Node: 0551592 Node: 05152504
Node: 04953123 Node: 0552929
Node: 04853405 Node: 04954460
Node: 04753754 Node: 04854742
Node: 04654163 Node: 04755091
Node: 04554571 Node: 04655500
Node: 04454932 Node: 04555908
Node: 04355291 Node: 04456269
Node: 04255494 Node: 04356628
Node: 04155655 Node: 04256831
Node: 0455902 Node: 04156992
Node: 03260003 Node: 0457239
Node: 03160406 Node: 03261340
Node: 0360603 Node: 03161743
Node: 02363903 Node: 0361940
Node: 02264137 Node: 02365240
Node: 02164417 Node: 02265474
Node: 0264622 Node: 02165754
Node: 0168700 Node: 0265959
Node: Notes68801 Node: 0170037
Node: Comparison with Org Agenda searches68963 Node: Notes70138
Node: org-sidebar69852 Node: Comparison with Org Agenda searches70300
Node: License70131 Node: org-sidebar71189
Node: License71468
 
End Tag Table End Tag Table