[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search c66d1da 160/332: Make the el-search-object st
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search c66d1da 160/332: Make the el-search-object struct contain an alist of properties |
Date: |
Tue, 1 Dec 2020 15:48:34 -0500 (EST) |
branch: externals/el-search
commit c66d1da291a1ff46ea74e8e74e8e5f853fad6aca
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Make the el-search-object struct contain an alist of properties
Make the el-search-object struct contain a field "properties". Use it
to store diverse metadata. Remove the "command" field; instead, use
the property "description" which can be bound to a string describing
the search.
Factor out `el-search--get-search-description-string' which can be
called to get a description text for the occur buffer or completion
annotation.
Make `el-search-setup-search-1' accept an additional optional argument
SETUP-FUNCTION that can be used to manipulate the new "properties"
field of newly created searches. Use it.
---
el-search.el | 120 +++++++++++++++++++++++++++++++++++++----------------------
1 file changed, 75 insertions(+), 45 deletions(-)
diff --git a/el-search.el b/el-search.el
index a3ce166..ace64d1 100644
--- a/el-search.el
+++ b/el-search.el
@@ -889,13 +889,17 @@ optional MESSAGE are used to construct the error message."
pattern ;the search pattern
head ;an `el-search-head' instance, modified ("moved") while searching
last-match ;position of last match found
- command ;nil or invoking command + args
get-matches ;method returning a stream of all matches
+ properties ;An alist of additional properties. Meaningful properties
+ ;are:
+ ; - is-single-buffer Indicates a single-buffer search
+ ; - description When specified, a string describing the
search
)
(defun copy-el-search-object (search)
(let ((copy (copy-el-search-object--1 search)))
(cl-callf copy-el-search-head (el-search-object-head copy))
+ (cl-callf copy-alist (el-search-object-properties copy))
copy))
(defun el-search--current-pattern ()
@@ -921,6 +925,22 @@ optional MESSAGE are used to construct the error message."
buffers ;stream of buffers and/or files yet to search
)
+(defun el-search--get-search-description-string (search &optional verbose)
+ (concat
+ (or (alist-get 'description (el-search-object-properties search))
+ "Search")
+ (when verbose
+ (format " [%s, %s]"
+ (if (alist-get 'is-single-buffer (el-search-object-properties
search))
+ "single-buffer" "paused")
+ (if-let ((buffer (el-search-head-buffer (el-search-object-head
search))))
+ (if (buffer-live-p buffer) (buffer-name buffer) "a killed
buffer")
+ "completed")))
+ " for"
+ (let ((printed-pattern (el-search--pp-to-string (el-search-object-pattern
search))))
+ (format (if (string-match-p "\n" printed-pattern) ":\n%s" " %s")
+ (propertize printed-pattern 'face 'shadow)))))
+
(defun el-search-kill-left-over-search-buffers (&optional not-current-buffer)
"Kill all buffers that were opened for searching."
@@ -1262,18 +1282,15 @@ in, in order, when called with no arguments."
(el-search-compile-pattern-in-search copy)
copy))
-(defun el-search-setup-search-1 (pattern get-buffer-stream &optional
from-here)
+(defun el-search-setup-search-1 (pattern get-buffer-stream &optional
from-here setup-function)
(setq el-search--success nil)
(setq el-search--current-search
(el-search-make-search pattern get-buffer-stream))
- (let ((call
- ;; (car command-history) ;FIXME: this is not always what we want!
- nil))
- (ring-insert el-search-history el-search--current-search)
- (setf (el-search-object-command el-search--current-search) call))
+ (when setup-function (funcall setup-function el-search--current-search))
+ (ring-insert el-search-history el-search--current-search)
(when from-here (setq el-search--temp-buffer-flag nil)))
-(defun el-search-setup-search (pattern get-buffer-stream &optional from-here)
+(defun el-search-setup-search (pattern get-buffer-stream &optional
setup-function from-here)
"Create and start a new el-search.
PATTERN is the search pattern. GET-BUFFER-STREAM is a function
of no arguments that should return a stream of buffers and/or
@@ -1282,7 +1299,7 @@ files (i.e. file names) to search in.
With optional FROM-HERE non-nil, the first buffer in this stream
should be the current buffer, and searching will start at the
current buffer's point instead of its beginning."
- (el-search-setup-search-1 pattern get-buffer-stream)
+ (el-search-setup-search-1 pattern get-buffer-stream nil setup-function)
(if (not el-search-occur-flag)
(el-search-continue-search from-here)
(setq el-search-occur-flag nil)
@@ -1755,22 +1772,11 @@ that the current search."
(let ((completion-extra-properties
`(:annotation-function
,(lambda (elt)
- (let ((search (ring-ref el-search-history
(string-to-number elt))))
- (concat
- " "
- (if-let ((command (el-search-object-command
search)))
- (concat "`" (prin1-to-string (car
command)) "'")
- "Search")
- (if-let ((buffer
- (el-search-head-buffer
- (el-search-object-head
- search))))
- (format " [paused in %s]"
- (if (buffer-live-p buffer)
- (concat "buffer "
(buffer-name buffer))
- "a killed buffer"))
- " [completed]")
- "\n" (pp-to-string (el-search-object-pattern
search))))))))
+ (concat
+ " "
+ (el-search--get-search-description-string
+ (ring-ref el-search-history (string-to-number
elt))
+ t))))))
(completing-read
"Resume previous search: "
(mapcar #'prin1-to-string
@@ -1947,6 +1953,7 @@ additional pattern types are currently defined:"
pattern
(let ((current-buffer (current-buffer)))
(lambda () (stream (list current-buffer))))
+ (lambda (search) (setf (alist-get 'is-single-buffer
(el-search-object-properties search)) t))
'from-here))))
(put 'el-search-pattern 'function-documentation '(el-search--make-docstring
'el-search-pattern))
@@ -1975,7 +1982,8 @@ With prefix arg, restart the current search."
pattern
(let ((current-buffer (current-buffer)))
(lambda () (stream (list current-buffer))))
- 'from-here)
+ 'from-here
+ (lambda (search) (setf (alist-get 'is-single-buffer
(el-search-object-properties search)) t)))
;; Make this buffer the current search buffer so that a following C-S
;; doesn't delete highlighting
(el-search--next-buffer el-search--current-search))
@@ -2112,6 +2120,7 @@ Use the normal search commands to seize the search."
pattern
(let ((current-buffer (current-buffer)))
(lambda () (stream (list current-buffer))))
+ (lambda (search) (setf (alist-get 'is-single-buffer
(el-search-object-properties search)) t))
'from-here)
(setq-local el-search-keep-hl 'once))))))
@@ -2161,11 +2170,7 @@ Use the normal search commands to seize the search."
(setq el-search-occur-search-object search))
(insert (format ";;; * %s -*- mode: el-search-occur -*-\n\n;; %s\n\n"
(current-time-string)
- (if-let ((command-or-pattern
- (or (el-search-object-command
el-search-occur-search-object)
- (el-search-object-pattern
el-search-occur-search-object))))
- (el-search--pp-to-string command-or-pattern)
- "")))
+ (el-search--get-search-description-string search)))
(condition-case-unless-debug err
(let ((stream-of-matches
(el-search--stream-partition
@@ -2349,7 +2354,9 @@ use of `hs-minor-mode' and `orgstruct-mode'."
(seq-filter
(lambda (buffer) (with-current-buffer buffer (and (derived-mode-p
'emacs-lisp-mode)
(not (eq major-mode
'el-search-occur-mode)))))
- (stream (buffer-list))))))
+ (stream (buffer-list))))
+ (lambda (search) (setf (alist-get 'description (el-search-object-properties
search))
+ "el-search-buffers"))))
;;;###autoload
(defun el-search-directory (pattern directory &optional recursively)
@@ -2363,7 +2370,11 @@ With prefix arg RECURSIVELY non-nil, search
subdirectories recursively."
current-prefix-arg))
(el-search-setup-search
pattern
- (lambda () (el-search-stream-of-directory-files directory recursively))))
+ (lambda () (el-search-stream-of-directory-files directory recursively))
+ (lambda (search) (setf (alist-get 'description (el-search-object-properties
search))
+ (concat (if recursively "Recursive directory search in "
+ "Directory search in ")
+ directory)))))
;;;###autoload
(defun el-search-emacs-elisp-sources (pattern)
@@ -2376,7 +2387,9 @@ This command recursively searches all elisp files under
(lambda ()
(el-search-stream-of-directory-files
(expand-file-name "lisp/" source-directory)
- t))))
+ t))
+ (lambda (search) (setf (alist-get 'description (el-search-object-properties
search))
+ "Search the Emacs Elisp sources"))))
;;;###autoload
(defun el-search-load-path (pattern)
@@ -2389,7 +2402,9 @@ are ignored."
(lambda ()
(stream-concatenate
(seq-map (lambda (path) (el-search-stream-of-directory-files path nil))
- (stream (delq nil load-path)))))))
+ (stream (delq nil load-path)))))
+ (lambda (search) (setf (alist-get 'description (el-search-object-properties
search))
+ "Search `load-path'"))))
(declare-function dired-get-marked-files "dired")
@@ -2414,7 +2429,9 @@ related user options."
(if (file-directory-p file)
(el-search-stream-of-directory-files file recursively)
(stream (list file))))
- (stream files))))))
+ (stream files))))
+ (lambda (search) (setf (alist-get 'description (el-search-object-properties
search))
+ "el-search-dired-marked-files"))))
;;;; Query-replace
@@ -2538,7 +2555,13 @@ reindent."
(el-search-setup-search-1 pattern
(let ((current-buffer (current-buffer)))
(lambda () (stream (list current-buffer))))
- t))
+ t
+ (lambda (search)
+ (setf (alist-get 'is-single-buffer
+ (el-search-object-properties
search))
+ t)
+ (setf (alist-get 'description
(el-search-object-properties search))
+ "Search created by
`el-search-query-replace'"))))
(let ((replace-all nil) (replace-all-and-following nil)
nbr-replaced nbr-skipped (done nil) (nbr-replaced-multi 0)
(nbr-changed-buffers 0)
(el-search-keep-hl t) (opoint (point))
@@ -2813,14 +2836,21 @@ used for history entries."
(barf-if-buffer-read-only)
(el-search--search-and-replace-pattern
from-pattern to-expr nil textual-to
- (and el-search--current-search
- (eq last-command 'el-search-pattern)
- (let ((buffer-stream (funcall
- (el-search-head-get-buffer-stream
- (el-search-object-head
el-search--current-search)))))
- (or (not (eq (stream-first buffer-stream) (current-buffer)))
- (stream-first (stream-rest buffer-stream))))
- (y-or-n-p "Multi-buffer query-replace all remaining matches of the
current search? "))))
+ (let ((search-head (and el-search--current-search
+ (el-search-object-head el-search--current-search))))
+ (and
+ search-head
+ (eq (el-search-head-buffer search-head) (current-buffer))
+ (equal from-pattern (el-search-object-pattern el-search--current-search))
+ (or (eq last-command 'el-search-pattern)
+ (and (not (alist-get 'is-single-buffer
+ (el-search-object-properties
el-search--current-search)))
+ (y-or-n-p "Use the last search to steer query-replace? ")
+ (prog1 t
+ (unless (equal (point) (el-search-head-position search-head))
+ (if (y-or-n-p "Continue from search head (y) or from here
(n)? ")
+ (el-search-jump-to-search-head)
+ (setf (el-search-head-position search-head) (copy-marker
(point))))))))))))
(defun el-search--take-over-from-isearch (&optional goto-left-end)
(let ((other-end (and goto-left-end isearch-other-end))
- [elpa] externals/el-search 56d9f20 165/332: Add some useful commands for *El Occur* buffers, (continued)
- [elpa] externals/el-search 56d9f20 165/332: Add some useful commands for *El Occur* buffers, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 40217c0 174/332: Fix replacing matches with nil, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1bfe7c0 110/332: Simplify `el-search--transform-nontrivial-lpat', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 6ff7aa4 116/332: Work around Emacs bug#24542, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 817c902 123/332: Document change-revision transformer function; make a defcustom, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2d6aad6 132/332: Explicitly `error' when trying to jump to invalid search head, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8875d2a 137/332: Avoid infinite recursion in circular programs, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search f02e86f 142/332: New command `el-search-from-beginning', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 4b6a363 138/332: Improve handling of reader errors in el-search-atom-list, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 806bfc4 157/332: Add new command `el-search-this-sexp', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c66d1da 160/332: Make the el-search-object struct contain an alist of properties,
Stefan Monnier <=
- [elpa] externals/el-search 4a6c3e2 162/332: Some details, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d412688 199/332: Update copyrights of some packages, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search cf465e0 203/332: * el-search/el-search.el: Add two more autoload cookies, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 42c776a 207/332: * el-search/el-search.el: Tweak el-search-jump-to-search-head, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ce97e9d 108/332: el-search: bump version to 0.2.2, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e5bd647 214/332: * el-search/el-search.el: Work around Emacs Bug#29857, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d995af1 166/332: Don't let el-search-pattern resume a paused search, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ceb23fc 169/332: More multi query-replace related improvements, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1aded2b 172/332: Make amount of context around occur matches adjustable, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search dc1d703 175/332: Require the new rmc.el lib when available, Stefan Monnier, 2020/12/01