From: Juri Linkov Date: Sat, 27 Aug 2022 19:43:40 +0000 (+0300) Subject: Use a list of text properties to search in symlink filenames in Wdired X-Git-Tag: emacs-29.0.90~1893^2~3 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0ab49d46ddbe27970c62a56597de000bc1c3232c;p=emacs.git 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). --- 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)