X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch.el;h=0072c579208ef9c39b510601f482ac3a2cbda3fd;hp=907df2c09c96f1382afa69ccaf429a35ae9cf788;hb=03ea266bc29094aabd5e4e2aa98e5d74a7c6dea1;hpb=c1e16435cfe4471c3415d9f625f7230d59c8afb4 diff --git a/notmuch.el b/notmuch.el index 907df2c0..0072c579 100644 --- a/notmuch.el +++ b/notmuch.el @@ -868,36 +868,8 @@ global search. (setq buffer-read-only t)) (defun notmuch-search-find-thread-id () - (save-excursion - (beginning-of-line) - (let ((beg (point))) - (re-search-forward "thread:[a-fA-F0-9]*" nil t) - (filter-buffer-substring beg (point))))) - -(defun notmuch-search-markup-this-thread-id () - (beginning-of-line) - (let ((beg (point))) - (if (re-search-forward "thread:[a-fA-F0-9]*" nil t) - (progn - (forward-char) - (overlay-put (make-overlay beg (point)) 'invisible 'notmuch-search) - (re-search-forward ".*\\[[0-9]*/[0-9]*\\] \\([^;]*\\)\\(;\\)") - (let* ((authors (buffer-substring (match-beginning 1) (match-end 1))) - (authors-length (length authors))) - ;; Drop the semi-colon - (replace-match "" t nil nil 2) - (if (<= authors-length notmuch-search-authors-width) - (replace-match (concat authors (make-string - (- notmuch-search-authors-width - authors-length) ? )) t t nil 1) - (replace-match (concat (substring authors 0 (- notmuch-search-authors-width 3)) "...") t t nil 1))))))) - -(defun notmuch-search-markup-thread-ids () - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (notmuch-search-markup-this-thread-id) - (forward-line)))) + "Return the thread for the current thread" + (get-text-property (point) 'notmuch-search-thread-id)) (defun notmuch-search-show-thread () (interactive) @@ -969,6 +941,54 @@ This function advances point to the next line when finished." (notmuch-search-remove-tag "inbox") (forward-line)) +(defun notmuch-search-process-sentinel (proc msg) + "Add a message to let user know when \"notmuch search\" exits" + (let ((buffer (process-buffer proc)) + (status (process-status proc)) + (exit-status (process-exit-status proc))) + (if (memq status '(exit signal)) + (if (buffer-live-p buffer) + (with-current-buffer buffer + (save-excursion + (let ((inhibit-read-only t)) + (goto-char (point-max)) + (if (eq status 'signal) + (insert "Incomplete search results (search process was killed).\n")) + (if (eq status 'exit) + (progn + (insert "End of search results.") + (if (not (= exit-status 0)) + (insert (format " (process returned %d)" exit-status))) + (insert "\n")))))))))) + +(defun notmuch-search-process-filter (proc string) + "Process and filter the output of \"notmuch search\"" + (let ((buffer (process-buffer proc))) + (if (buffer-live-p buffer) + (with-current-buffer buffer + (save-excursion + (let ((line 0) + (more t) + (inhibit-read-only t)) + (while more + (if (string-match "^\\(thread:[0-9A-Fa-f]*\\) \\(.*\\) \\(\\[[0-9/]*\\]\\) \\([^:]*\\); \\(.*\\) (\\([^()]*\\))$" string line) + (let* ((thread-id (match-string 1 string)) + (date (match-string 2 string)) + (count (match-string 3 string)) + (authors (match-string 4 string)) + (authors-length (length authors)) + (subject (match-string 5 string)) + (tags (match-string 6 string))) + (if (> authors-length 40) + (set 'authors (concat (substring authors 0 (- 40 3)) "..."))) + (goto-char (point-max)) + (let ((beg (point-marker))) + (insert (format "%s %-7s %-40s %s (%s)\n" date count authors subject tags)) + (put-text-property beg (point-marker) 'notmuch-search-thread-id thread-id)) + (set 'line (match-end 0))) + (set 'more nil)))))) + (delete-process proc)))) + (defun notmuch-search (query &optional oldest-first) "Run \"notmuch search\" with the given query string and display results." (interactive "sNotmuch search: ") @@ -985,11 +1005,12 @@ This function advances point to the next line when finished." (erase-buffer) (goto-char (point-min)) (save-excursion - (if oldest-first - (call-process notmuch-command nil t nil "search" "--sort=oldest-first" query) - (call-process notmuch-command nil t nil "search" "--sort=newest-first" query)) - (notmuch-search-markup-thread-ids) - )) + (let ((proc (start-process-shell-command + "notmuch-search" buffer notmuch-command "search" + (if oldest-first "--sort=oldest-first" "--sort=newest-first") + (shell-quote-argument query)))) + (set-process-sentinel proc 'notmuch-search-process-sentinel) + (set-process-filter proc 'notmuch-search-process-filter)))) (run-hooks 'notmuch-search-hook))) (defun notmuch-search-refresh-view ()