Add: (rifle/smart) Predicate
This commit is contained in:
parent
968a249ae3
commit
4f29bcfd67
3 changed files with 90 additions and 46 deletions
|
|
@ -236,6 +236,9 @@ Arguments are listed next to predicate names, where applicable.
|
||||||
+ =property (property &optional value)= :: Return non-nil if current entry has ~PROPERTY~ (a string), and optionally ~VALUE~ (a string). Note that property inheritance is currently /not/ enabled for this predicate. If you need to test with inheritance, you could use a custom predicate form, like ~(org-entry-get (point) "PROPERTY" 'inherit)~.
|
+ =property (property &optional value)= :: Return non-nil if current entry has ~PROPERTY~ (a string), and optionally ~VALUE~ (a string). Note that property inheritance is currently /not/ enabled for this predicate. If you need to test with inheritance, you could use a custom predicate form, like ~(org-entry-get (point) "PROPERTY" 'inherit)~.
|
||||||
+ =regexp (&rest regexps)= :: Return non-nil if current entry matches all of ~REGEXPS~ (regexp strings). Matches against entire entry, from beginning of its heading to the next heading.
|
+ =regexp (&rest regexps)= :: Return non-nil if current entry matches all of ~REGEXPS~ (regexp strings). Matches against entire entry, from beginning of its heading to the next heading.
|
||||||
- Aliases: =r=.
|
- Aliases: =r=.
|
||||||
|
+ =rifle (&rest strings)= :: Return non-nil if each string is found in either the entry or its outline path. Works like =org-rifle=. This is probably the most useful, intuitive, general-purpose predicate.
|
||||||
|
- Aliases: ~smart~.
|
||||||
|
- *Note:* By default, this is the default predicate used for plain-string query tokens (i.e. given without a specified predicate). This can be customized with the option ~org-ql-default-predicate~.
|
||||||
+ ~src (&key lang regexps)~ :: Return non-nil if current entry contains an Org Babel source block. If ~LANG~ is non-nil, match blocks of that language. If ~REGEXPS~ is non-nil, require that block's contents match all regexps.
|
+ ~src (&key lang regexps)~ :: Return non-nil if current entry contains an Org Babel source block. If ~LANG~ is non-nil, match blocks of that language. If ~REGEXPS~ is non-nil, require that block's contents match all regexps.
|
||||||
+ =tags (&optional tags)= :: Return non-nil if current heading has one or more of ~TAGS~ (a list of strings). Tests both inherited and local tags.
|
+ =tags (&optional tags)= :: Return non-nil if current heading has one or more of ~TAGS~ (a list of strings). Tests both inherited and local tags.
|
||||||
+ =tags-inherited (&optional tags)= :: Return non-nil if current heading's inherited tags include one or more of ~TAGS~ (a list of strings). If ~TAGS~ is nil, return non-nil if heading has any inherited tags.
|
+ =tags-inherited (&optional tags)= :: Return non-nil if current heading's inherited tags include one or more of ~TAGS~ (a list of strings). If ~TAGS~ is nil, return non-nil if heading has any inherited tags.
|
||||||
|
|
@ -539,6 +542,7 @@ Simple links may also be written manually in either sexp or non-sexp form, like:
|
||||||
|
|
||||||
*Added*
|
*Added*
|
||||||
+ Commands ~org-ql-find~, ~org-ql-find-heading~, and ~org-ql-find-path~, which jump to entries selected using Emacs's built-in completion facilities and Org QL queries (like ~helm-org-ql~, but doesn't require Helm.).
|
+ Commands ~org-ql-find~, ~org-ql-find-heading~, and ~org-ql-find-path~, which jump to entries selected using Emacs's built-in completion facilities and Org QL queries (like ~helm-org-ql~, but doesn't require Helm.).
|
||||||
|
+ Predicate ~rifle~, which matches an entry if each of the given arguments is found in either the entry's contents or its outline path. This provides very intuitive results, mimicing the behavior of [[https://github.com/alphapapa/org-rifle][=org-rifle=]]. In fact, the results are so useful that it's now the default predicate for plain-string query tokens. (It is also aliased to ~smart~, since it's so "smart," and not all users have used =org-rifle=.)
|
||||||
+ Option ~org-ql-default-predicate~, applied to plain-string query tokens (before, the ~regexp~ predicate was always used, but now it may be customized).
|
+ Option ~org-ql-default-predicate~, applied to plain-string query tokens (before, the ~regexp~ predicate was always used, but now it may be customized).
|
||||||
|
|
||||||
*Changed*
|
*Changed*
|
||||||
|
|
|
||||||
26
org-ql.el
26
org-ql.el
|
|
@ -298,11 +298,13 @@ See Info node `(org-ql)Queries'."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
:risky t)
|
:risky t)
|
||||||
|
|
||||||
(defcustom org-ql-default-predicate 'regexp
|
(defcustom org-ql-default-predicate 'rifle
|
||||||
"Predicate used for plain-string tokens without a specified predicate."
|
"Predicate used for plain-string tokens without a specified predicate."
|
||||||
:type '(choice (const heading)
|
:type '(choice (const heading)
|
||||||
(const heading-regexp)
|
(const heading-regexp)
|
||||||
(const regexp)
|
(const regexp)
|
||||||
|
(const rifle)
|
||||||
|
(const smart)
|
||||||
(const outline-path)
|
(const outline-path)
|
||||||
(const outline-path-segment)))
|
(const outline-path-segment)))
|
||||||
|
|
||||||
|
|
@ -1555,6 +1557,28 @@ any link is found."
|
||||||
(string-match-p description-or-target
|
(string-match-p description-or-target
|
||||||
(match-string org-ql-link-description-group)))))))))
|
(match-string org-ql-link-description-group)))))))))
|
||||||
|
|
||||||
|
(org-ql-defpred (rifle smart) (&rest strings)
|
||||||
|
"Return non-nil if each string argument is found in either the entry or its outline path.
|
||||||
|
Works like `org-rifle'. This is probably the most useful,
|
||||||
|
intuitive, general-purpose predicate."
|
||||||
|
;; NOTE: This predicate advertises that it takes strings, but they
|
||||||
|
;; are normalized to regexps. Because of that, we must use a
|
||||||
|
;; coalescing function.
|
||||||
|
:coalesce-multiple-calls (lambda (coalesced-args current-args)
|
||||||
|
(setf (plist-get coalesced-args :regexps)
|
||||||
|
(list 'quote (append (cadr (plist-get coalesced-args :regexps))
|
||||||
|
(cadr (plist-get current-args :regexps)))))
|
||||||
|
coalesced-args)
|
||||||
|
:normalizers ((`(,predicate-names . ,(and rest (guard (cl-every #'stringp rest))))
|
||||||
|
;; If this doesn't match, it's already normalized.
|
||||||
|
`(rifle :regexps ',(mapcar #'regexp-quote rest))))
|
||||||
|
:preambles ((`(,predicate-names :regexps ',regexps)
|
||||||
|
(list :regexp (rx-to-string `(seq bow (or ,@(mapcar (lambda (s) `(regexp ,s)) regexps))))
|
||||||
|
:case-fold t :query query)))
|
||||||
|
:body (cl-loop for regexp in (plist-get strings :regexps)
|
||||||
|
always (or (org-ql--predicate-regexp regexp)
|
||||||
|
(org-ql--predicate-outline-path regexp))))
|
||||||
|
|
||||||
;; MAYBE: Preambles for outline-path predicates. Not sure if possible without complicated logic.
|
;; MAYBE: Preambles for outline-path predicates. Not sure if possible without complicated logic.
|
||||||
;; FIXME: These preds say they accept regexps but the strings get regexp-quoted. They should probably just take strings.
|
;; FIXME: These preds say they accept regexps but the strings get regexp-quoted. They should probably just take strings.
|
||||||
|
|
||||||
|
|
|
||||||
106
org-ql.info
106
org-ql.info
|
|
@ -483,6 +483,15 @@ Arguments are listed next to predicate names, where applicable.
|
||||||
strings). Matches against entire entry, from beginning of its
|
strings). Matches against entire entry, from beginning of its
|
||||||
heading to the next heading.
|
heading to the next heading.
|
||||||
• Aliases: ‘r’.
|
• Aliases: ‘r’.
|
||||||
|
‘rifle (&rest strings)’
|
||||||
|
Return non-nil if each string is found in either the entry or its
|
||||||
|
outline path. Works like ‘org-rifle’. This is probably the most
|
||||||
|
useful, intuitive, general-purpose predicate.
|
||||||
|
• Aliases: ‘smart’.
|
||||||
|
• *Note:* By default, this is the default predicate used for
|
||||||
|
plain-string query tokens (i.e. given without a specified
|
||||||
|
predicate). This can be customized with the option
|
||||||
|
‘org-ql-default-predicate’.
|
||||||
‘src (&key lang regexps)’
|
‘src (&key lang regexps)’
|
||||||
Return non-nil if current entry contains an Org Babel source block.
|
Return non-nil if current entry contains an Org Babel source block.
|
||||||
If ‘LANG’ is non-nil, match blocks of that language. If ‘REGEXPS’
|
If ‘LANG’ is non-nil, match blocks of that language. If ‘REGEXPS’
|
||||||
|
|
@ -1008,6 +1017,13 @@ File: README.info, Node: 07-pre, Next: 062, Up: Changelog
|
||||||
‘org-ql-find-path’, which jump to entries selected using Emacs’s
|
‘org-ql-find-path’, which jump to entries selected using Emacs’s
|
||||||
built-in completion facilities and Org QL queries (like
|
built-in completion facilities and Org QL queries (like
|
||||||
‘helm-org-ql’, but doesn’t require Helm.).
|
‘helm-org-ql’, but doesn’t require Helm.).
|
||||||
|
• Predicate ‘rifle’, which matches an entry if each of the given
|
||||||
|
arguments is found in either the entry’s contents or its outline
|
||||||
|
path. This provides very intuitive results, mimicing the behavior
|
||||||
|
of ‘org-rifle’ (https://github.com/alphapapa/org-rifle). In fact,
|
||||||
|
the results are so useful that it’s now the default predicate for
|
||||||
|
plain-string query tokens. (It is also aliased to ‘smart’, since
|
||||||
|
it’s so "smart," and not all users have used ‘org-rifle’.)
|
||||||
• Option ‘org-ql-default-predicate’, applied to plain-string query
|
• Option ‘org-ql-default-predicate’, applied to plain-string query
|
||||||
tokens (before, the ‘regexp’ predicate was always used, but now it
|
tokens (before, the ‘regexp’ predicate was always used, but now it
|
||||||
may be customized).
|
may be customized).
|
||||||
|
|
@ -1646,51 +1662,51 @@ Node: org-ql-sparse-tree8345
|
||||||
Node: Queries9145
|
Node: Queries9145
|
||||||
Node: Non-sexp query syntax10262
|
Node: Non-sexp query syntax10262
|
||||||
Node: General predicates12021
|
Node: General predicates12021
|
||||||
Node: Ancestor/descendant predicates18260
|
Node: Ancestor/descendant predicates18763
|
||||||
Node: Date/time predicates19388
|
Node: Date/time predicates19891
|
||||||
Node: Functions / Macros22512
|
Node: Functions / Macros23015
|
||||||
Node: Agenda-like views22810
|
Node: Agenda-like views23313
|
||||||
Ref: Function ‘org-ql-block’22972
|
Ref: Function ‘org-ql-block’23475
|
||||||
Node: Listing / acting-on results24233
|
Node: Listing / acting-on results24736
|
||||||
Ref: Caching24441
|
Ref: Caching24944
|
||||||
Ref: Function ‘org-ql-select’25354
|
Ref: Function ‘org-ql-select’25857
|
||||||
Ref: Function ‘org-ql-query’27780
|
Ref: Function ‘org-ql-query’28283
|
||||||
Ref: Macro ‘org-ql’ (deprecated)29554
|
Ref: Macro ‘org-ql’ (deprecated)30057
|
||||||
Node: Custom predicates29869
|
Node: Custom predicates30372
|
||||||
Ref: Macro ‘org-ql-defpred’30093
|
Ref: Macro ‘org-ql-defpred’30596
|
||||||
Node: Dynamic block33534
|
Node: Dynamic block34037
|
||||||
Node: Links36258
|
Node: Links36761
|
||||||
Node: Tips36945
|
Node: Tips37448
|
||||||
Node: Changelog37269
|
Node: Changelog37772
|
||||||
Node: 07-pre38037
|
Node: 07-pre38540
|
||||||
Node: 06238786
|
Node: 06239801
|
||||||
Node: 06139094
|
Node: 06140109
|
||||||
Node: 0639662
|
Node: 0640677
|
||||||
Node: 05242716
|
Node: 05243731
|
||||||
Node: 05143016
|
Node: 05144031
|
||||||
Node: 0543439
|
Node: 0544454
|
||||||
Node: 04944968
|
Node: 04945983
|
||||||
Node: 04845248
|
Node: 04846263
|
||||||
Node: 04745595
|
Node: 04746610
|
||||||
Node: 04646004
|
Node: 04647019
|
||||||
Node: 04546412
|
Node: 04547427
|
||||||
Node: 04446773
|
Node: 04447788
|
||||||
Node: 04347132
|
Node: 04348147
|
||||||
Node: 04247335
|
Node: 04248350
|
||||||
Node: 04147496
|
Node: 04148511
|
||||||
Node: 0447743
|
Node: 0448758
|
||||||
Node: 03251844
|
Node: 03252859
|
||||||
Node: 03152247
|
Node: 03153262
|
||||||
Node: 0352444
|
Node: 0353459
|
||||||
Node: 02355744
|
Node: 02356759
|
||||||
Node: 02255978
|
Node: 02256993
|
||||||
Node: 02156258
|
Node: 02157273
|
||||||
Node: 0256463
|
Node: 0257478
|
||||||
Node: 0160541
|
Node: 0161556
|
||||||
Node: Notes60642
|
Node: Notes61657
|
||||||
Node: Comparison with Org Agenda searches60804
|
Node: Comparison with Org Agenda searches61819
|
||||||
Node: org-sidebar61693
|
Node: org-sidebar62708
|
||||||
Node: License61972
|
Node: License62987
|
||||||
|
|
||||||
End Tag Table
|
End Tag Table
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue