[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC] Gnus generalized search, part II
From: |
Eric Abrahamsen |
Subject: |
Re: [RFC] Gnus generalized search, part II |
Date: |
Mon, 24 Apr 2017 13:30:28 -0700 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) |
Lars Ingebrigtsen <address@hidden> writes:
> Eric Abrahamsen <address@hidden> writes:
>
>> The query entered by the user is parsed into a sexp structure, and then
>> each engine is responsible for interpreting that.
>
> I think this sounds like a good approach. I haven't tried the code
> myself, but I skimmed it briefly and it looks good to me. :-)
Okay, I've pushed these changes as the scratch/nnir-search branch.
This branch is mostly the same as the nnir.el file I posted last time,
but with more switches for turning query parsing on and off. In the
storied Gnus tradition of over-customization, there are now a grand
total of four ways of controlling whether queries are parsed or raw:
1. The big switch is `nnir-use-parsed-queries'. It is t by default,
but if set to nil, Gnus will behave more or less the way it does
now.
2. If a prefix argument is given to the nnir search command (ie, "C-u
G G" in the *Group* buffer), that search query will not be parsed,
and will be passed raw to all the marked servers/groups.
3. Individual search engines can be told never to parse search
queries, by specifying the `raw-queries-p' parameter to engine
creation. If multiple groups are marked for searching, the query
will be parsed for groups with engines that allow it, and not for
engines that don't.
4. Entire classes of engines can be marked never to parse queries, by
setting variables like nnir-notmuch-raw-queries-p, with "notmuch"
replaced by the various engine names. Again, queries to multiple
engines will still be parsed by engines that allow it.
I do hope people will test this. Actually testing that search groups
behave correctly is of course important, but if you just want to fool
with the search language and see how it is parsed, and transformed, you
can use stuff like this:
#+BEGIN_SRC elisp
(let* ((query-string "subject:gnus or since:1w")
(parsed-query (nnir-search-parse-query query-string))
(test-imap (make-instance 'gnus-search-imap))
(test-notmuch (make-instance 'gnus-search-notmuch)))
(message "notmuch query: %s\nimap query: %s"
(nnir-search-transform-top-level test-imap parsed-query)
(nnir-search-transform-top-level test-notmuch parsed-query)))
#+END_SRC
`nnir-search-parse-query' turns strings into sexps, and
`nnir-search-transform-top-level' turns the sexps back into
engine-specific strings -- it requires an engine instance as the first
argument.
All the engines are named gnus-search-*. There are more on the way.
- Re: [RFC] Gnus generalized search, part II, (continued)
- Re: [RFC] Gnus generalized search, part II, Stephen Leake, 2017/04/24
- Re: [RFC] Gnus generalized search, part II, Eli Zaretskii, 2017/04/26
- Re: [RFC] Gnus generalized search, part II, Noam Postavsky, 2017/04/22
Re: [RFC] Gnus generalized search, part II, Eli Zaretskii, 2017/04/22
Re: [RFC] Gnus generalized search, part II, Lars Ingebrigtsen, 2017/04/22
- Re: [RFC] Gnus generalized search, part II, Eric Abrahamsen, 2017/04/22
- Re: [RFC] Gnus generalized search, part II,
Eric Abrahamsen <=
- Re: [RFC] Gnus generalized search, part II, Andrew Cohen, 2017/04/26
- Re: [RFC] Gnus generalized search, part II, Andrew Cohen, 2017/04/26
Re: [RFC] Gnus generalized search, part II, Dan Christensen, 2017/04/23