;;; jao-recoll.el --- Utilities to use recoll -*- lexical-binding: t; -*- ;; Copyright (C) 2025 Jose Antonio Ortega Ruiz ;; Author: Jose Antonio Ortega Ruiz ;; Keywords: mail, text ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Notably, a half-backed backend for Gnus ;;; Code: (require 'gnus-search) (defclass gnus-search-recoll (gnus-search-indexed) ((separator :type string :initform ".") (program :initform "recoll") (raw-queries-p :initform t))) (cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-recoll)) (prog1 (and (looking-at "^file://\\(.+\\)$") (list (match-string 1) 100)) (forward-line 1))) (cl-defmethod gnus-search-transform-expression ((_engine gnus-search-recoll) expr) expr) (cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-recoll) (qstring string) query &optional groups) (let* ((subdir (slot-value engine 'remove-prefix)) (sep (slot-value engine 'separator)) (gdirs (mapcar (lambda (g) (let ((g (gnus-group-short-name g))) (replace-regexp-in-string "\\." sep g))) (or groups (and (not (string= "" subdir)) (list subdir))))) (dirsq (and gdirs (concat "(" (mapconcat (lambda (d) (format "dir:%s" d)) gdirs " OR ") ")"))) (qstring (if (string-prefix-p "id:" qstring) (replace-regexp-in-string "<\\|>" "\"" qstring) qstring)) (qstring (if (cdr (assoc 'thread query)) (concat qstring " OR " (replace-regexp-in-string "id:\"" "ref:\"" qstring)) qstring)) (qstring (replace-regexp-in-string " or " " OR " qstring)) (qstring (replace-regexp-in-string " and " " AND " qstring)) (q (format "mime:message %s (%s)" dirsq qstring))) ;; (message "query is: %s -- %S" q query) `("-b" "-t" "-q" ,q))) (defun jao-recoll-gnus-search-engine (dir) `(nnml "" (gnus-search-engine gnus-search-recoll (remove-prefix ,dir)))) (provide 'jao-recoll) ;;; jao-recoll.el ends here