Add: Negation in plain queries
This commit is contained in:
parent
6b2004e678
commit
949a06c3ab
4 changed files with 43 additions and 21 deletions
|
|
@ -164,6 +164,7 @@ The command =org-ql-search= also accepts, and the command =helm-org-ql= only acc
|
||||||
| ~(heading "quoted phrase" "word")~ | ~heading:"quoted phrase",word~ |
|
| ~(heading "quoted phrase" "word")~ | ~heading:"quoted phrase",word~ |
|
||||||
| ~(and (tags "book" "books") (priority "A"))~ | ~tags:book,books priority:A~ |
|
| ~(and (tags "book" "books") (priority "A"))~ | ~tags:book,books priority:A~ |
|
||||||
| ~(src :lang "elisp" :regexps ("defun"))~ | ~src:defun,lang=elisp~ or ~src:lang=elisp,defun~ |
|
| ~(src :lang "elisp" :regexps ("defun"))~ | ~src:defun,lang=elisp~ or ~src:lang=elisp,defun~ |
|
||||||
|
| ~(and (tags "space") (not (regexp "moon")))~ | ~tags:space !moon~ |
|
||||||
| ~(priority >= B)~ | ~priority:A,B~ |
|
| ~(priority >= B)~ | ~priority:A,B~ |
|
||||||
|
|
||||||
Note that the =priority= predicate does not support comparators in the non-sexp syntax, so multiple priorities should be passed instead, as seen in the last example.
|
Note that the =priority= predicate does not support comparators in the non-sexp syntax, so multiple priorities should be passed instead, as seen in the last example.
|
||||||
|
|
@ -375,6 +376,7 @@ Expands into a call to ~org-ql-select~ with the same arguments. For convenience
|
||||||
** 0.4-pre
|
** 0.4-pre
|
||||||
|
|
||||||
*Added*
|
*Added*
|
||||||
|
+ Negation of terms in plain queries using ~!~. For example, ~tags:space !moon~ to exclude entries which contain ~moon~.
|
||||||
+ Predicates =outline-path= (alias =olp=) and =outline-path-segment= (alias =olps=).
|
+ Predicates =outline-path= (alias =olp=) and =outline-path-segment= (alias =olps=).
|
||||||
+ Info manual.
|
+ Info manual.
|
||||||
+ Command ~org-ql-search~ can search files in ~org-directory~; customization options are available in the ~org-ql-search~ group.
|
+ Command ~org-ql-search~ can search files in ~org-directory~; customization options are available in the ~org-ql-search~ group.
|
||||||
|
|
|
||||||
12
org-ql.el
12
org-ql.el
|
|
@ -1487,10 +1487,15 @@ Builds the PEG expression using predicates defined in
|
||||||
Multiple predicates are combined with BOOLEAN."
|
Multiple predicates are combined with BOOLEAN."
|
||||||
(unless (s-blank-str? input)
|
(unless (s-blank-str? input)
|
||||||
(let* ((query (peg-parse-string
|
(let* ((query (peg-parse-string
|
||||||
((query (+ (or (and predicate-with-args `(pred args -- (cons (intern pred) args)))
|
((query (+ term
|
||||||
(and predicate-without-args `(pred -- (list (intern pred))))
|
|
||||||
(and plain-string `(s -- (list 'regexp s))))
|
|
||||||
(opt (+ (syntax-class whitespace) (any)))))
|
(opt (+ (syntax-class whitespace) (any)))))
|
||||||
|
(term (or (and negation (list positive-term)
|
||||||
|
;; This is a bit confusing, but it seems to work. There's probably a better way.
|
||||||
|
`(pred -- (list 'not (car pred))))
|
||||||
|
positive-term))
|
||||||
|
(positive-term (or (and predicate-with-args `(pred args -- (cons (intern pred) args)))
|
||||||
|
(and predicate-without-args `(pred -- (list (intern pred))))
|
||||||
|
(and plain-string `(s -- (list 'regexp s)))))
|
||||||
(plain-string (substring (+ (not (syntax-class whitespace)) (any))))
|
(plain-string (substring (+ (not (syntax-class whitespace)) (any))))
|
||||||
(predicate-with-args (substring predicate) ":" args)
|
(predicate-with-args (substring predicate) ":" args)
|
||||||
(predicate-without-args (substring predicate) ":")
|
(predicate-without-args (substring predicate) ":")
|
||||||
|
|
@ -1500,6 +1505,7 @@ Multiple predicates are combined with BOOLEAN."
|
||||||
(keyword (substring (+ (not (or separator "=" "\"" (syntax-class whitespace))) (any))))
|
(keyword (substring (+ (not (or separator "=" "\"" (syntax-class whitespace))) (any))))
|
||||||
(quoted-arg "\"" (substring (+ (not (or separator "\"")) (any))) "\"")
|
(quoted-arg "\"" (substring (+ (not (or separator "\"")) (any))) "\"")
|
||||||
(unquoted-arg (substring (+ (not (or separator "\"" (syntax-class whitespace))) (any))))
|
(unquoted-arg (substring (+ (not (or separator "\"" (syntax-class whitespace))) (any))))
|
||||||
|
(negation "!")
|
||||||
(separator "," ))
|
(separator "," ))
|
||||||
input 'noerror)))
|
input 'noerror)))
|
||||||
;; Discard the t that `peg-parse-string' always returns as the first
|
;; Discard the t that `peg-parse-string' always returns as the first
|
||||||
|
|
|
||||||
39
org-ql.info
39
org-ql.info
|
|
@ -339,6 +339,7 @@ Sexp syntax Non-sexp syntax
|
||||||
‘(heading "quoted phrase" "word")’ ‘heading:"quoted phrase",word’
|
‘(heading "quoted phrase" "word")’ ‘heading:"quoted phrase",word’
|
||||||
‘(and (tags "book" "books") (priority "A"))’ ‘tags:book,books priority:A’
|
‘(and (tags "book" "books") (priority "A"))’ ‘tags:book,books priority:A’
|
||||||
‘(src :lang "elisp" :regexps ("defun"))’ ‘src:defun,lang=elisp’ or ‘src:lang=elisp,defun’
|
‘(src :lang "elisp" :regexps ("defun"))’ ‘src:defun,lang=elisp’ or ‘src:lang=elisp,defun’
|
||||||
|
‘(and (tags "space") (not (regexp "moon")))’ ‘tags:space !moon’
|
||||||
‘(priority >= B)’ ‘priority:A,B’
|
‘(priority >= B)’ ‘priority:A,B’
|
||||||
|
|
||||||
Note that the priority predicate does not support comparators in the
|
Note that the priority predicate does not support comparators in the
|
||||||
|
|
@ -695,6 +696,8 @@ File: README.info, Node: 04-pre, Next: 031, Up: Changelog
|
||||||
===========
|
===========
|
||||||
|
|
||||||
*Added*
|
*Added*
|
||||||
|
• Negation of terms in plain queries using ‘!’. For example,
|
||||||
|
‘tags:space !moon’ to exclude entries which contain ‘moon’.
|
||||||
• Predicates outline-path (alias olp) and outline-path-segment (alias
|
• Predicates outline-path (alias olp) and outline-path-segment (alias
|
||||||
olps).
|
olps).
|
||||||
• Info manual.
|
• Info manual.
|
||||||
|
|
@ -980,24 +983,24 @@ Node: org-ql-view-recent-items6452
|
||||||
Node: org-ql-sparse-tree6936
|
Node: org-ql-sparse-tree6936
|
||||||
Node: Queries7736
|
Node: Queries7736
|
||||||
Node: Non-sexp query syntax8578
|
Node: Non-sexp query syntax8578
|
||||||
Node: Predicates10198
|
Node: Predicates10277
|
||||||
Node: Date/time predicates15312
|
Node: Date/time predicates15391
|
||||||
Node: Functions / Macros17947
|
Node: Functions / Macros18026
|
||||||
Node: Agenda-like views18134
|
Node: Agenda-like views18213
|
||||||
Node: Listing / acting-on results19539
|
Node: Listing / acting-on results19618
|
||||||
Node: Changelog24141
|
Node: Changelog24220
|
||||||
Node: 04-pre24663
|
Node: 04-pre24742
|
||||||
Node: 03125607
|
Node: 03125830
|
||||||
Node: 0325805
|
Node: 0326028
|
||||||
Node: 02328778
|
Node: 02329001
|
||||||
Node: 02229004
|
Node: 02229227
|
||||||
Node: 02129270
|
Node: 02129493
|
||||||
Node: 0229467
|
Node: 0229690
|
||||||
Node: 0133500
|
Node: 0133723
|
||||||
Node: Notes33599
|
Node: Notes33822
|
||||||
Node: Comparison with Org Agenda searches33761
|
Node: Comparison with Org Agenda searches33984
|
||||||
Node: org-sidebar34632
|
Node: org-sidebar34855
|
||||||
Node: License34911
|
Node: License35134
|
||||||
|
|
||||||
End Tag Table
|
End Tag Table
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,17 @@ RESULTS should be a list of strings as returned by
|
||||||
|
|
||||||
;; TODO: Other predicates.
|
;; TODO: Other predicates.
|
||||||
|
|
||||||
|
(it "Negated terms"
|
||||||
|
(expect (org-ql--plain-query "todo: !todo:CHECK,SOMEDAY")
|
||||||
|
:to-equal '(and (todo) (not (todo "CHECK" "SOMEDAY"))))
|
||||||
|
(expect (org-ql--plain-query "!todo:CHECK,SOMEDAY todo:")
|
||||||
|
:to-equal '(and (not (todo "CHECK" "SOMEDAY")) (todo)))
|
||||||
|
(expect (org-ql--plain-query "tags:universe !moon")
|
||||||
|
:to-equal '(and (tags "universe") (not (regexp "moon"))))
|
||||||
|
(expect (org-ql--plain-query "!moon tags:universe")
|
||||||
|
:to-equal '(and (not (regexp "moon")) (tags "universe")))
|
||||||
|
(expect (org-ql--plain-query "mars !ts:on=today")
|
||||||
|
:to-equal '(and (regexp "mars") (not (ts :on "today")))))
|
||||||
(it "Regexp predicates"
|
(it "Regexp predicates"
|
||||||
(expect (org-ql--plain-query "scheduled")
|
(expect (org-ql--plain-query "scheduled")
|
||||||
;; No colon after keyword, so not a predicate query.
|
;; No colon after keyword, so not a predicate query.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue