4 (defun egrep-regexps-1 (result-buffer regexp predicate args)
5 (let ((file-name (buffer-file-name)))
7 (goto-char (point-min))
8 (while (re-search-forward regexp nil t)
9 (if (or (not predicate) (save-excursion (goto-char (match-beginning 0))
10 (apply predicate args)))
11 (let ((line (count-lines (point-min) (point)))
12 (column (current-column))
13 (text (buffer-substring (save-excursion (beginning-of-line) (point))
14 (save-excursion (end-of-line) (point)))))
15 (with-current-buffer result-buffer
16 (let ((inhibit-read-only t))
17 (insert (format "%s:%d:%d: %s\n"
18 (dired-make-relative file-name default-directory)
19 line column text))))))))))
21 (defun egrep-prepare-result-buffer ()
22 (let ((result-buffer (get-buffer-create "*egrep*")))
23 (with-current-buffer result-buffer
24 (let ((inhibit-read-only t))
27 (insert (format "; Searching for '%s' ...\n" regexp))
28 (pop-to-buffer result-buffer)))
31 (defun egrep-finalize-result-buffer (result-buffer)
32 (goto-char (point-min)))
34 (defun egrep-regexps (regexp &optional predicate &rest args)
35 (interactive "sRegexp: ")
36 (let ((result-buffer (egrep-prepare-result-buffer)))
37 (egrep-regexps-1 result-buffer regexp predicate args)
38 (egrep-finalize-result-buffer result-buffer)))
40 (defun egrep-font-face-predicate (face-symbol)
41 (eq (get-text-property (point) 'face) face-symbol))
43 (defun egrep-regexps-with-face (regexp face-symbol)
44 (interactive (list (read-string "Regexp: ")
45 (intern (completing-read "Face symbol: "
46 (mapcar (lambda (face) (symbol-name face)) (face-list))
48 (egrep-regexps regexp 'egrep-font-face-predicate face-symbol))
50 (defun egrep-regexps-dired-marked-files (regexp &optional prepare predicate &rest args)
51 (interactive "sRegexp: ")
52 (let ((result-buffer (egrep-prepare-result-buffer)))
53 (loop for file-name in (dired-get-marked-files nil current-prefix-arg)
54 do (let ((buffer (find-file-noselect file-name)))
55 (with-current-buffer buffer
56 (message (format "Searching %s ..." (file-name-nondirectory file-name)))
58 (if prepare (funcall prepare))
59 (egrep-regexps-1 result-buffer regexp predicate args))))
60 (egrep-finalize-result-buffer result-buffer)
61 (message "Search complete.")))
63 (defun egrep-string-startswith (string start)
64 (and (> (length string) (length start))
65 (string= (substring string 0 (length start)) start)))
67 (defun egrep-grep-list (func list)
70 (if (funcall func (car list))
71 (setq r (cons (car list) r)))
72 (setq list (cdr list)))
75 (defun egrep-read-font-lock-face (prompt &optional predicate initial hist default inherit-input-method)
76 (intern (completing-read prompt
77 (egrep-grep-list (lambda (font) (egrep-string-startswith font "font-lock-"))
78 (mapcar (lambda (face) (symbol-name face)) (face-list)))
79 predicate t (or initial "font-lock-") hist default inherit-input-method)))
81 (defun egrep-regexps-with-face-dired-marked-files (regexp face-symbol)
82 (interactive (list (read-string "Regexp: ")
83 (egrep-read-font-lock-face "Font symbol: ")))
84 (egrep-regexps-dired-marked-files regexp
86 (font-lock-fontify-buffer)
87 (htmlize-ensure-fontified))
88 'egrep-font-face-predicate