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).
This commit is contained in:
Juri Linkov 2022-08-27 22:43:40 +03:00
parent f427b985a1
commit 0ab49d46dd
4 changed files with 32 additions and 14 deletions

View file

@ -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

View file

@ -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 ()

View file

@ -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

View file

@ -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)