summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuri Linkov <juri@linkov.net>2022-08-27 22:43:40 +0300
committerJuri Linkov <juri@linkov.net>2022-08-27 22:43:40 +0300
commit0ab49d46ddbe27970c62a56597de000bc1c3232c (patch)
tree460023d68311d8685bff8c426faea5f75eb5e3e0
parentf427b985a1857523412a846fcaa9082c87c0bbd1 (diff)
downloademacs-0ab49d46ddbe27970c62a56597de000bc1c3232c.tar.gz
Use a list of text properties to search in symlink filenames in Wdired
* lisp/dired-aux.el (dired-isearch-search-filenames): Use text properties 'dired-filename' and 'dired-symlink-filename'. * lisp/dired.el (dired-font-lock-keywords): Add text property 'dired-symlink-filename' on symlinks. * lisp/isearch.el (isearch-search-fun-in-text-property): Support a list of text properties (bug#57293).
-rw-r--r--etc/NEWS5
-rw-r--r--lisp/dired-aux.el3
-rw-r--r--lisp/dired.el6
-rw-r--r--lisp/isearch.el32
4 files changed, 32 insertions, 14 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 1fd05d7dcc6..1317cd01283 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2023,7 +2023,10 @@ the buffer will take you to that directory.
*** Search and replace in Dired/Wdired supports more regexps.
For example, the regexp ".*" will match only characters that are part
of the file name. Also "^.*$" can be used to match at the beginning
-of the file name and at the end of the file name.
+of the file name and at the end of the file name. This is used only
+when searching on file names. In Wdired this can be used when the new
+user option 'wdired-search-replace-filenames' is non-nil (which is the
+default).
** Bookmarks
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 94b2baf72d0..06f0b86fc43 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -3544,7 +3544,8 @@ Intended to be added to `isearch-mode-hook'."
The returned function narrows the search to match the search string
only as part of a file name enclosed by the text property `dired-filename'.
It's intended to override the default search function."
- (isearch-search-fun-in-text-property (funcall orig-fun) 'dired-filename))
+ (isearch-search-fun-in-text-property
+ (funcall orig-fun) '(dired-filename dired-symlink-filename)))
;;;###autoload
(defun dired-isearch-filenames ()
diff --git a/lisp/dired.el b/lisp/dired.el
index f45d215ed60..fa06c8fd441 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -786,7 +786,7 @@ Subexpression 2 must end right before the \\n.")
nil
'(1 'dired-broken-symlink)
'(2 dired-symlink-face)
- '(3 'dired-broken-symlink)))
+ '(3 '(face dired-broken-symlink dired-symlink-filename t))))
;;
;; Symbolic link to a directory.
(list dired-re-sym
@@ -798,7 +798,7 @@ Subexpression 2 must end right before the \\n.")
'(dired-move-to-filename)
nil
'(1 dired-symlink-face)
- '(2 dired-directory-face)))
+ '(2 '(face dired-directory-face dired-symlink-filename t))))
;;
;; Symbolic link to a non-directory.
(list dired-re-sym
@@ -812,7 +812,7 @@ Subexpression 2 must end right before the \\n.")
'(dired-move-to-filename)
nil
'(1 dired-symlink-face)
- '(2 'default)))
+ '(2 '(face default dired-symlink-filename t))))
;;
;; Sockets, pipes, block devices, char devices.
(list dired-re-special
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 31fcf01949f..9f1fbb14a4a 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -4512,21 +4512,35 @@ is a list of cons cells of the form (START . END)."
(setq bounds (cdr bounds))))
found))))
-(defun isearch-search-fun-in-text-property (search-fun property)
- "Return the function to search inside text that has the specified PROPERTY.
+(defun isearch-search-fun-in-text-property (search-fun properties)
+ "Return the function to search inside text that has the specified PROPERTIES.
The function will limit the search for matches only inside text which has
-this property in the current buffer.
+at least one of the text PROPERTIES.
The argument SEARCH-FUN provides the function to search text, and
defaults to the value of `isearch-search-fun-default' when nil."
+ (setq properties (ensure-list properties))
(apply-partially
#'search-within-boundaries
search-fun
- (lambda (pos) (get-text-property (if isearch-forward pos
- (max (1- pos) (point-min)))
- property))
- (lambda (pos) (if isearch-forward
- (next-single-property-change pos property)
- (previous-single-property-change pos property)))))
+ (lambda (pos)
+ (let ((pos (if isearch-forward pos (max (1- pos) (point-min)))))
+ (seq-some (lambda (property)
+ (get-text-property pos property))
+ properties)))
+ (lambda (pos)
+ (let ((pos-list (if isearch-forward
+ (mapcar (lambda (property)
+ (next-single-property-change
+ pos property))
+ properties)
+ (mapcar (lambda (property)
+ (previous-single-property-change
+ pos property))
+ properties))))
+ (setq pos-list (delq nil pos-list))
+ (when pos-list (if isearch-forward
+ (seq-min pos-list)
+ (seq-max pos-list)))))))
(defun search-within-boundaries ( search-fun get-fun next-fun
string &optional bound noerror count)