sexp-at-point is a pretty roundabout way to parse this that I think will basically parse the S-expression three times (in end-of-sexp, in beginning-of-sexp, and then for real in read-from-whole-string). How about
(prog1 (read (current-buffer)) (skip-chars-forward " \t\n\f") (unless (eobp) (error "Trailing garbage after notmuch output"))) ? Technically, just the (read (current-buffer)) part would be equivalent to the current (json-read) call (which will ignore any trailing garbage). There's also another synchronous JSON query in notmuch-mua.el that should be fixed. I wouldn't worry too much about the error handling. I don't think this can deal worse with errors than the current JSON code does. My schema versioning series has a patch [1] that should help improve error handling. It's for JSON right now, but will be trivial to port to S-expressions. [1] id:1354416002-3557-9-git-send-email-amdragon at mit.edu Quoth Mark Walters on Dec 08 at 2:11 pm: > This changes the queries used by notmuch-show from json to sexp (patch > based on a comment by Tomi on irc as to the trivial change needed). > > The async query parsed used by search is not as easy to convert. > --- > > It's probably worth making this change: sexps are significantly faster > but I doubt anyone would notice in show (since the query is small and > the wash processing etc relatively large). > > At the moment this doesn't do any error fixing. The json version did > not either but the sexp parser and the json parser might behave > differently on malformed input. > > Best wishes > > Mark > > > emacs/notmuch-query.el | 7 ++----- > 1 files changed, 2 insertions(+), 5 deletions(-) > > diff --git a/emacs/notmuch-query.el b/emacs/notmuch-query.el > index d66baea..0ee6cca 100644 > --- a/emacs/notmuch-query.el > +++ b/emacs/notmuch-query.el > @@ -29,10 +29,7 @@ A thread is a forest or list of trees. A tree is a two > element > list where the first element is a message, and the second element > is a possibly empty forest of replies. > " > - (let ((args '("show" "--format=json")) > - (json-object-type 'plist) > - (json-array-type 'list) > - (json-false 'nil)) > + (let ((args '("show" "--format=sexp"))) > (if notmuch-show-process-crypto > (setq args (append args '("--decrypt")))) > (setq args (append args search-terms)) > @@ -40,7 +37,7 @@ is a possibly empty forest of replies. > (progn > (apply 'call-process (append (list notmuch-command nil (list t nil) > nil) args)) > (goto-char (point-min)) > - (json-read))))) > + (sexp-at-point))))) > > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > ;; Mapping functions across collections of messages.