]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/el-search/el-search.el
Small fix in el-search--setup-minibuffer
[gnu-emacs-elpa] / packages / el-search / el-search.el
index db57a5e12b17c23b041d7df700876f3608260cd2..8e08571f3b8a9f1ad904029f2bbd5a41ec5bbe2d 100644 (file)
@@ -292,11 +292,10 @@ error."
                             case-fold-search)))
     (string-match-p regexp string)))
 
-(defun el-search--print (expr)
-  (let ((print-quoted t)
-        (print-length nil)
+(defun el-search--pp-to-string (expr)
+  (let ((print-length nil)
         (print-level nil))
-    (prin1-to-string expr)))
+    (pp-to-string expr)))
 
 (defvar el-search-read-expression-map
   (let ((map (make-sparse-keymap)))
@@ -314,8 +313,9 @@ error."
   (use-local-map el-search-read-expression-map)
   (setq font-lock-mode t)
   (funcall font-lock-function 1)
-  (backward-sexp)
-  (indent-sexp)
+  (goto-char (minibuffer-prompt-end))
+  (when (looking-at ".*\n")
+    (indent-sexp))
   (goto-char (point-max))
   (when-let ((this-sexp (with-current-buffer (window-buffer (minibuffer-selected-window))
                           (thing-at-point 'sexp))))
@@ -332,6 +332,9 @@ error."
     (read-from-minibuffer prompt initial-contents el-search-read-expression-map read
                           (or hist 'read-expression-history) default)))
 
+(defvar el-search-history '()
+  "List of input strings.")
+
 (defvar el-search--initial-mb-contents nil)
 
 (defun el-search--read-pattern (prompt &optional default read)
@@ -353,9 +356,10 @@ and return it."
     (while not-done
       (let ((stop-here nil)
             (looking-at-from-back (lambda (regexp n)
-                                    (save-excursion
-                                      (backward-char n)
-                                      (looking-at regexp)))))
+                                    (and (> (point) n)
+                                         (save-excursion
+                                           (backward-char n)
+                                           (looking-at regexp))))))
         (while (not stop-here)
           (cond
            ((eobp) (signal 'end-of-buffer nil))
@@ -514,8 +518,8 @@ return nil (no error)."
           (with-temp-buffer
             (emacs-lisp-mode)
             (insert (if splice
-                        (mapconcat #'el-search--print replacement " ")
-                      (el-search--print replacement)))
+                        (mapconcat #'el-search--pp-to-string replacement " ")
+                      (el-search--pp-to-string replacement)))
             (goto-char 1)
             (let (start this-sexp end orig-match-start orig-match-end done)
               (while (and (< (point) (point-max))
@@ -584,6 +588,10 @@ MESSAGE are used to construct the error message."
                    type arg)))
         args))
 
+(defvar el-search-current-pattern nil)
+
+(defvar el-search-success nil)
+
 
 ;;;; Additional pattern type definitions
 
@@ -748,7 +756,7 @@ matches any of these expressions:
                                  "argument not a string or vector")
   `(pred (el-search--match-key-sequence ,key-sequence)))
 
-(defun el-search--s (expr)
+(defun el-search--transform-nontrivial-lpat (expr)
   (cond
    ((symbolp expr) `(or (symbol ,(symbol-name expr))
                         (,'\` (,'quote    (,'\, (symbol ,(symbol-name expr)))))
@@ -799,10 +807,60 @@ could use this pattern:
                     ('_ '`(,_))
                     ('_? '(or '() `(,_))) ;FIXME: useful - document? or should we provide a (? PAT)
                                           ;thing?
-                    (_ `(,'\` ((,'\, ,(el-search--s elt)))))))
+                    (_ `(,'\` ((,'\, ,(el-search--transform-nontrivial-lpat elt)))))))
                 lpats)
              ,@(if match-end '() '(_)))))
 
+(el-search-defpattern char-prop (property)
+  "Matches the object if completely covered with PROPERTY.
+This pattern matches the object if its representation in the
+search buffer is completely covered with the character property
+PROPERTY.
+
+This pattern always tests the complete expression in the search
+buffer, it is not possible to test subexpressions calculated in
+the search pattern."
+  `(guard (and (get-char-property (point) ',property)
+               ,(macroexp-let2 nil limit '(scan-sexps (point) 1)
+                  `(= (next-single-char-property-change
+                       (point) ',property nil ,limit)
+                      ,limit)))))
+
+(el-search-defpattern includes-prop (property)
+  "Matches the object if partly covered with PROPERTY.
+This pattern matches the object if its representation in the
+search buffer is partly covered with the character property
+PROPERTY.
+
+This pattern always tests the complete expression in the search
+buffer, it is not possible to test subexpressions calculated in
+the search pattern."
+  `(guard (or (get-char-property (point) ',property)
+              ,(macroexp-let2 nil limit '(scan-sexps (point) 1)
+                 `(not (= (next-single-char-property-change
+                           (point) ',property nil ,limit)
+                          ,limit))))))
+
+(el-search-defpattern change ()
+  "Matches the object if it is part of a change.
+This is equivalent to (char-prop diff-hl-hunk).
+
+You need `diff-hl-mode' turned on, provided by the library
+\"diff-hl\" available in Gnu Elpa."
+  (or (bound-and-true-p diff-hl-mode)
+      (error "diff-hl-mode not enabled"))
+  '(char-prop diff-hl-hunk))
+
+(el-search-defpattern changed ()
+  "Matches the object if it contains a change.
+This is equivalent to (includes-prop diff-hl-hunk).
+
+You need `diff-hl-mode' turned on, provided by the library
+\"diff-hl\" available in Gnu Elpa."
+  (or (bound-and-true-p diff-hl-mode)
+      (error "diff-hl-mode not enabled"))
+  '(includes-prop diff-hl-hunk))
+
 
 ;;;; Highlighting
 
@@ -878,14 +936,8 @@ could use this pattern:
 
 ;;;; Core functions
 
-(defvar el-search-history '()
-  "List of input strings.")
-
-(defvar el-search-success nil)
-(defvar el-search-current-pattern nil)
-
 ;;;###autoload
-(defun el-search-pattern (pattern)
+(defun el-search-pattern (pattern &optional no-error)
   "Start new or resume last elisp search.
 
 Search current buffer for expressions that are matched by `pcase'
@@ -912,7 +964,7 @@ The following additional pattern types are currently defined:"
                            (error "Please don't forget the quote when searching for a symbol"))
                          (el-search--wrap-pattern pattern)))))
   (if (not (called-interactively-p 'any))
-      (el-search--search-pattern pattern)
+      (el-search--search-pattern pattern no-error)
     (setq this-command 'el-search-pattern) ;in case we come from isearch
     (setq el-search-current-pattern pattern)
     (let ((opoint (point)))
@@ -1061,7 +1113,8 @@ Hit any key to proceed."
 
 TO-EXPR is an Elisp expression that is evaluated repeatedly for
 each match with bindings created in FROM-PATTERN in effect to
-produce a replacement expression.
+produce a replacement expression.  Operate from point
+to (point-max).
 
 As each match is found, the user must type a character saying
 what to do with it.  For directions, type ? at that time."