OSDN Git Service

update version strings in generated files
[howm/howm.git] / howm-mode.el
index bce17f5..56c61bb 100644 (file)
@@ -1,5 +1,5 @@
 ;;; howm-mode.el --- Wiki-like note-taking tool
-;;; Copyright (C) 2002, 2003, 2004, 2005-2021
+;;; Copyright (C) 2002, 2003, 2004, 2005-2022
 ;;;   HIRAOKA Kazuyuki <khi@users.osdn.me>
 ;;;
 ;;; This program is free software; you can redistribute it and/or modify
@@ -440,26 +440,65 @@ key       binding
   (howm-list-grep-general t))
 
 (defun howm-list-grep-general (&optional completion-p)
-  (let* ((regexp (if completion-p
-                     (howm-completing-read-keyword)
-                   (read-from-minibuffer "Search all (grep): "))))
+  (let* ((action (lambda (pattern) (howm-search pattern completion-p)))
+         (regexp (howm-iigrep completion-p action)))
     (when completion-p  ;; Goto link works only for fixed string at now.
       (howm-write-history regexp))
-    (howm-search regexp completion-p)))
+    (funcall action regexp)))
 
-(defun howm-search (regexp fixed-p &optional emacs-regexp filter)
+(defun howm-search (regexp fixed-p &optional emacs-regexp filter bufname)
   (if (string= regexp "")
       (howm-list-all)
     (howm-message-time "search"
       (let* ((trio (howm-call-view-search-internal regexp fixed-p emacs-regexp))
              (kw (car trio))
-             (name (cadr trio))
+             (name (or bufname (cadr trio)))
              (items (cl-caddr trio)))
         (when filter
           (setq items (funcall filter items)))
         (howm-normalize-show name items (or emacs-regexp regexp) nil nil kw)
         (howm-record-view-window-configuration)))))
 
+(defun howm-iigrep (completion-p action)
+  (howm-with-iigrep (howm-iigrep-command-for-pattern completion-p)
+      howm-iigrep-show-what action
+    (if completion-p
+        (howm-completing-read-keyword)
+      (read-from-minibuffer "Search all (grep): "))))
+
+(defmacro howm-with-iigrep (command-for-pattern show-what action &rest body)
+  (declare (indent 3))
+  `(let ((*iigrep-post-sentinel* (howm-iigrep-post-sentinel ,action))
+         (howm-view-summary-name "*howmS(preview)*")
+         (howm-view-contents-name "*howmC(preview)*")
+         (howm-history-limit 0)
+         (*howm-show-item-filename* nil)
+         (howm-message-time nil))
+     (unwind-protect
+         (iigrep-with-grep ,command-for-pattern ,show-what
+           ,@body)
+       (mapc (lambda (b) (and (get-buffer b) (kill-buffer b)))
+             (list howm-view-summary-name howm-view-contents-name)))))
+
+(defmacro howm-iigrep-command-for-pattern (&optional fixed-p converter)
+  ;; use macro due to dynamic binding. Sigh...
+  `(and howm-view-use-grep
+        (lambda (str)
+          (let* ((pattern (funcall (or ,converter #'identity) str))
+                 (trio (howm-real-grep-single-command
+                        pattern (list howm-directory) ,fixed-p))
+                 (com (car trio))
+                 (args (cl-second trio))
+                 (fs (cl-third trio)))
+            (append (list com) (cons "-I" args) fs)))))
+
+(defmacro howm-iigrep-post-sentinel (action)
+  ;; use macro due to dynamic binding. Sigh...
+  `(lambda (hits pattern)
+     (when (<= hits howm-iigrep-preview-items)
+       (save-selected-window
+         (funcall ,action pattern)))))
+
 (defvar *howm-view-window-configuration* nil
   "For internal use")
 (defun howm-view-window-configuration ()
@@ -486,14 +525,26 @@ key       binding
   (howm-set-command 'howm-list-migemo)
   (if completion-p
       (howm-list-grep t)
-    (let* ((roma (read-from-minibuffer "Search all (migemo): "))
-           (e-reg (howm-migemo-get-pattern roma "emacs"))
-           (g-reg (if howm-view-use-grep
-                      (howm-migemo-get-pattern roma "egrep")
-                    e-reg)))
-      (if (and e-reg g-reg)
-          (howm-search g-reg nil e-reg)
-        (message "No response from migemo-client.")))))
+    (howm-list-migemo-action (howm-iigrep-migemo))))
+
+(defun howm-list-migemo-action (roma)
+  (let* ((e-reg (howm-migemo-get-pattern roma "emacs"))
+         (g-reg (if howm-view-use-grep
+                    (howm-migemo-get-pattern roma "egrep")
+                  e-reg)))
+    (if (and e-reg g-reg)
+        (howm-search g-reg nil e-reg nil roma)
+      (message "No response from migemo-client."))))
+
+(defun howm-iigrep-migemo ()
+  (let* ((converter (lambda (yomi) (howm-migemo-get-pattern yomi "egrep")))
+         (command-for-pattern (howm-iigrep-command-for-pattern nil converter))
+         (show-what (if (eq howm-iigrep-migemo-show-what 'inherit)
+                        howm-iigrep-show-what
+                      howm-iigrep-migemo-show-what)))
+    (howm-with-iigrep command-for-pattern show-what
+                      #'howm-list-migemo-action
+      (read-from-minibuffer "Search all (migemo): "))))
 
 (defun howm-migemo-get-pattern (roma type)
   (when (and (null howm-migemo-client) (not howm-view-use-grep))