From 827786cf759a0a14c3e2ebea2963478c2f1a9b5c Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 18 Nov 2020 11:32:38 +0100 Subject: [PATCH] Preserve `dired-filename' text properties in Tramp * lisp/net/tramp-sh.el (tramp-sh-handle-insert-directory): Restore `dired-filename' text property, which has been destroyed by `decode-coding-region'. (Bug#44682) --- lisp/net/tramp-sh.el | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index ccf0c0d0e28..c4390b3d041 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -2658,7 +2658,8 @@ The method used must be an out-of-band method." #'file-name-nondirectory (list localname))))))) (save-restriction - (let ((beg (point))) + (let ((beg (point)) + match) (narrow-to-region (point) (point)) ;; We cannot use `insert-buffer-substring' because the Tramp ;; buffer changes its contents before insertion due to calling @@ -2696,10 +2697,25 @@ The method used must be an out-of-band method." (re-search-forward tramp-display-escape-sequence-regexp nil t) (replace-match ""))) - ;; Decode the output, it could be multibyte. - (decode-coding-region - beg (point-max) - (or file-name-coding-system default-file-name-coding-system)) + ;; Decode the output, it could be multibyte. We must + ;; restore the text property, because `decode-coding-region' + ;; has destroyed it. However, text-property-search.el + ;; exists since Emacs 27 only. + (if (not (require 'text-property-search nil 'noerror)) + (decode-coding-region + beg (point-max) + (or file-name-coding-system default-file-name-coding-system)) + (goto-char beg) + (while (setq match + (tramp-compat-funcall + 'text-property-search-forward 'dired-filename t t)) + (decode-coding-region + (tramp-compat-funcall 'prop-match-beginning match) + (tramp-compat-funcall 'prop-match-end match) + (or file-name-coding-system default-file-name-coding-system)) + (put-text-property + (tramp-compat-funcall 'prop-match-beginning match) + (point) 'dired-filename t))) ;; The inserted file could be from somewhere else. (when (and (not wildcard) (not full-directory-p)) -- 2.39.5