;; Introduction
;; ============
;;
-;;
+;;
;; The main user entry point is the command `el-search-pattern'. It
;; prompts for a `pcase' pattern and searches the current buffer for
;; expressions that are matched by it when read. Point is put at the
;; Example: In some buffer you want to swap the two expressions at the
;; places of the first two arguments in all calls of function `foo',
;; so that e.g.
-;;
+;;
;; (foo 'a (* 2 (+ 3 4)) t)
-;;
+;;
;; becomes
-;;
+;;
;; (foo (* 2 (+ 3 4)) 'a t).
-;;
+;;
;; This will do it:
;;
;; M-x el-search-query-replace RET
;;Point must be at sexp beginning
(or (scan-sexps (point) 1) (point-max)))
-(defun el-search--goto-next-sexp ()
- "Move point to the beginning of the next sexp.
-Don't move if already at beginning of a sexp."
+(defun el-search--ensure-sexp-start ()
+ "Move point to the beginning of the next sexp if necessary.
+Don't move if already at beginning of a sexp.
+Point must not be inside a string or comment."
(let ((not-done t) res)
(while not-done
(let ((stop-here nil) syntax-here
(if (catch 'no-match
(while (not match-beg)
(condition-case nil
- (setq current-expr (el-search--goto-next-sexp))
+ (setq current-expr (el-search--ensure-sexp-start))
(end-of-buffer
(goto-char opoint)
(throw 'no-match t)))
(condition-case nil
(while (< (point) (or bound (point-max)))
(let* ((this-sexp-end (save-excursion (thing-at-point--end-of-sexp) (point)))
- (this-sexp (buffer-substring-no-properties (point) this-sexp-end)))
- (funcall do-fun this-sexp this-sexp-end))
+ (this-sexp-bounds (buffer-substring-no-properties (point) this-sexp-end)))
+ (funcall do-fun this-sexp-bounds this-sexp-end))
(forward-char)
- (el-search--goto-next-sexp))
+ (el-search--ensure-sexp-start))
(end-of-buffer))
(when ret-fun (funcall ret-fun))))