emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 66b49fc 2/3: Rework Tramp wrt string-match-p, looki


From: Michael Albinus
Subject: [Emacs-diffs] master 66b49fc 2/3: Rework Tramp wrt string-match-p, looking-at-p, save-match-data
Date: Thu, 6 Dec 2018 10:11:50 -0500 (EST)

branch: master
commit 66b49fc1d522b8d2cce7e957a5c6e7a4f6c90e0f
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>

    Rework Tramp wrt string-match-p, looking-at-p, save-match-data
    
    * lisp/net/tramp.el (tramp-find-method, tramp-find-user)
    (tramp-find-host, tramp-dissect-file-name, tramp-make-tramp-file-name)
    (tramp-completion-make-tramp-file-name, tramp-debug-message)
    (tramp-message, tramp-progress-reporter-update)
    (tramp-set-completion-function)
    (tramp-rfn-eshadow-update-overlay)
    (tramp-find-file-name-coding-system-alist)
    (tramp-file-name-for-operation)
    (tramp-use-absolute-autoload-file-names)
    (tramp-get-completion-methods, tramp-get-completion-user-host)
    (tramp-handle-directory-files)
    (tramp-handle-file-name-case-insensitive-p)
    (tramp-handle-file-name-completion, tramp-handle-file-truename)
    (tramp-handle-insert-directory, tramp-handle-load)
    (tramp-handle-shell-command, tramp-action-yesno)
    (tramp-action-yn, tramp-process-actions)
    (tramp-mode-string-to-int, tramp-get-local-locale)
    (tramp-local-host-p):
    * lisp/net/tramp-adb.el (tramp-adb-handle-file-system-info)
    (tramp-adb-handle-directory-files-and-attributes)
    (tramp-adb--gnu-switches-to-ash, tramp-adb-sh-fix-ls-output)
    (tramp-adb-handle-file-name-all-completions)
    (tramp-adb-handle-shell-command)
    (tramp-adb-handle-start-file-process):
    * lisp/net/tramp-archive.el (tramp-archive-dissect-file-name):
    * lisp/net/tramp-cache.el (tramp-get-hash-table)
    (tramp-flush-directory-properties, tramp-flush-file-function):
    * lisp/net/tramp-cmds.el (tramp-reporter-dump-variable)
    (tramp-append-tramp-buffers):
    * lisp/net/tramp-compat.el (tramp-compat-process-running-p):
    * lisp/net/tramp-gvfs.el (tramp-gvfs-handle-expand-file-name)
    (tramp-gvfs-get-file-attributes)
    (tramp-gvfs-handle-file-attributes)
    (tramp-gvfs-monitor-process-filter)
    (tramp-gvfs-handler-mounted-unmounted)
    (tramp-gvfs-connection-mounted-p, tramp-gvfs-mount-spec-entry)
    (tramp-gvfs-mount-spec, tramp-gvfs-maybe-open-connection):
    * lisp/net/tramp-sh.el (tramp-do-file-attributes-with-ls)
    (tramp-do-file-attributes-with-stat)
    (tramp-sh-handle-file-selinux-context)
    (tramp-sh-handle-directory-files-and-attributes)
    (tramp-do-directory-files-and-attributes-with-stat)
    (tramp-sh-handle-file-name-all-completions)
    (tramp-sh-handle-dired-compress-file)
    (tramp-sh-handle-insert-directory)
    (tramp-sh-handle-expand-file-name)
    (tramp-sh-handle-start-file-process)
    (tramp-sh-handle-process-file, tramp-sh-handle-write-region)
    (tramp-sh-handle-file-notify-add-watch)
    (tramp-sh-gio-monitor-process-filter)
    (tramp-sh-gvfs-monitor-dir-process-filter)
    (tramp-sh-inotifywait-process-filter)
    (tramp-sh-handle-file-system-info, tramp-maybe-send-script)
    (tramp-find-executable, tramp-open-shell, tramp-find-shell)
    (tramp-open-connection-setup-interactive-shell)
    (tramp-find-inline-encoding, tramp-call-local-coding-command)
    (tramp-compute-multi-hops, tramp-maybe-open-connection)
    (tramp-convert-file-attributes)
    (tramp-make-copy-program-file-name, tramp-get-remote-locale)
    (tramp-get-test-nt-command, tramp-get-remote-stat)
    (tramp-get-inline-coding):
    * lisp/net/tramp-smb.el (tramp-smb-handle-directory-files)
    (tramp-smb-action-get-acl, tramp-smb-handle-file-attributes)
    (tramp-smb-handle-file-name-all-completions)
    (tramp-smb-handle-file-system-info)
    (tramp-smb-handle-file-writable-p)
    (tramp-smb-handle-insert-directory)
    (tramp-smb-handle-make-directory)
    (tramp-smb-handle-make-directory-internal)
    (tramp-smb-handle-start-file-process, tramp-smb-get-localname)
    (tramp-smb-read-file-entry): Use `string-match-p' and
    `looking-at-p'.  Remove superfluous `save-match-data'.  Apply
    `eval-when-compile' on constant concat data.
    
    * lisp/net/tramp-compat.el (tramp-compat-file-name-quoted-p-p):
    Use `string-prefix-p'.
    (tramp-compat-file-name-unquote): Do not use match data.
---
 lisp/net/tramp-adb.el     |  62 ++---
 lisp/net/tramp-archive.el |   6 +-
 lisp/net/tramp-cache.el   |   8 +-
 lisp/net/tramp-cmds.el    |  15 +-
 lisp/net/tramp-compat.el  |  17 +-
 lisp/net/tramp-gvfs.el    |  52 ++--
 lisp/net/tramp-sh.el      | 662 ++++++++++++++++++++++++----------------------
 lisp/net/tramp-smb.el     | 102 ++++---
 lisp/net/tramp.el         | 284 ++++++++++----------
 9 files changed, 610 insertions(+), 598 deletions(-)

diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index d0cead2..76bcdf0 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -259,10 +259,11 @@ pass to the OPERATION."
        (goto-char (point-min))
        (forward-line)
        (when (looking-at
-              (concat "[[:space:]]*[^[:space:]]+"
-                      "[[:space:]]+\\([[:digit:]]+\\)"
-                      "[[:space:]]+\\([[:digit:]]+\\)"
-                      "[[:space:]]+\\([[:digit:]]+\\)"))
+              (eval-when-compile
+                (concat "[[:space:]]*[^[:space:]]+"
+                        "[[:space:]]+\\([[:digit:]]+\\)"
+                        "[[:space:]]+\\([[:digit:]]+\\)"
+                        "[[:space:]]+\\([[:digit:]]+\\)")))
          ;; The values are given as 1k numbers, so we must change
          ;; them to number of bytes.
          (list (* 1024 (string-to-number (match-string 1)))
@@ -462,7 +463,7 @@ pass to the OPERATION."
                     (sort result (lambda (x y) (string< (car x) (car y))))))
             (delq nil
                   (mapcar (lambda (x)
-                            (if (or (not match) (string-match match (car x)))
+                            (if (or (not match) (string-match-p match (car x)))
                                 x))
                           result)))))))))
 
@@ -499,7 +500,7 @@ Convert (\"-al\") to (\"-a\" \"-l\").  Remove arguments 
like \"--dired\"."
                  (delq nil
                        (mapcar
                         (lambda (s)
-                          (and (not (string-match "\\(^--\\|^[^-]\\)" s)) s))
+                          (and (not (string-match-p "\\(^--\\|^[^-]\\)" s)) s))
                         switches))))))
 
 (defun tramp-adb-sh-fix-ls-output (&optional sort-by-time)
@@ -514,7 +515,7 @@ Emacs dired can't find files."
         
"[[:space:]]\\([[:space:]][0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9][[:space:]]\\)" nil 
t)
       (replace-match "0\\1" "\\1" nil)
       ;; Insert missing "/".
-      (when (looking-at "[0-9][0-9]:[0-9][0-9][[:space:]]+$")
+      (when (looking-at-p "[0-9][0-9]:[0-9][0-9][[:space:]]+$")
        (end-of-line)
        (insert "/")))
     ;; Sort entries.
@@ -594,28 +595,27 @@ Emacs dired can't find files."
    filename
    (with-parsed-tramp-file-name (expand-file-name directory) nil
      (with-tramp-file-property v localname "file-name-all-completions"
-       (save-match-data
-        (tramp-adb-send-command
-         v (format "%s -a %s"
-                   (tramp-adb-get-ls-command v)
-                   (tramp-shell-quote-argument localname)))
-        (mapcar
-         (lambda (f)
-           (if (file-directory-p (expand-file-name f directory))
-               (file-name-as-directory f)
-             f))
-         (with-current-buffer (tramp-get-buffer v)
-           (delete-dups
-            (append
-             ;; In older Android versions, "." and ".." are not
-             ;; included.  In newer versions (toybox, since Android
-             ;; 6) they are.  We fix this by `delete-dups'.
-             '("." "..")
-             (delq
-              nil
-              (mapcar
-               (lambda (l) (and (not (string-match  "^[[:space:]]*$" l)) l))
-               (split-string (buffer-string) "\n"))))))))))))
+       (tramp-adb-send-command
+       v (format "%s -a %s"
+                 (tramp-adb-get-ls-command v)
+                 (tramp-shell-quote-argument localname)))
+       (mapcar
+       (lambda (f)
+         (if (file-directory-p (expand-file-name f directory))
+             (file-name-as-directory f)
+           f))
+       (with-current-buffer (tramp-get-buffer v)
+         (delete-dups
+          (append
+           ;; In older Android versions, "." and ".." are not
+           ;; included.  In newer versions (toybox, since Android 6)
+           ;; they are.  We fix this by `delete-dups'.
+           '("." "..")
+           (delq
+            nil
+            (mapcar
+             (lambda (l) (and (not (string-match-p  "^[[:space:]]*$" l)) l))
+             (split-string (buffer-string) "\n")))))))))))
 
 (defun tramp-adb-handle-file-local-copy (filename)
   "Like `file-local-copy' for Tramp files."
@@ -967,7 +967,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 (defun tramp-adb-handle-shell-command
   (command &optional output-buffer error-buffer)
   "Like `shell-command' for Tramp files."
-  (let* ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command))
+  (let* ((asynchronous (string-match-p "[ \t]*&[ \t]*\\'" command))
         ;; We cannot use `shell-file-name' and `shell-command-switch',
         ;; they are variables of the local host.
         (args (list "sh" "-c" (substring command 0 asynchronous)))
@@ -1111,7 +1111,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
                    p))))
 
          ;; Save exit.
-         (if (string-match tramp-temp-buffer-name (buffer-name))
+         (if (string-match-p tramp-temp-buffer-name (buffer-name))
              (ignore-errors
                (set-process-buffer (tramp-get-connection-process v) nil)
                (kill-buffer (current-buffer)))
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 4c94391..cb072ac 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -378,6 +378,7 @@ pass to the OPERATION."
 (defun tramp-archive-file-name-p (name)
   "Return t if NAME is a string with archive file name syntax."
   (and (stringp name)
+       ;; We cannot use `string-match-p', the matches are used.
        (string-match tramp-archive-file-name-regexp name)
        t))
 
@@ -430,8 +431,9 @@ name is kept in slot `hop'"
        ;; http://...
        ((and url-handler-mode
             tramp-compat-use-url-tramp-p
-             (string-match url-handler-regexp archive)
-            (string-match "https?" (url-type (url-generic-parse-url archive))))
+             (string-match-p url-handler-regexp archive)
+            (string-match-p
+             "https?" (url-type (url-generic-parse-url archive))))
        (let* ((url-tramp-protocols
                (cons
                 (url-type (url-generic-parse-url archive))
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index 51a8f13..0a799d7 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -104,7 +104,7 @@ matching entries of `tramp-connection-properties'."
             (puthash key (make-hash-table :test 'equal) tramp-cache-data)))
        (when (tramp-file-name-p key)
          (dolist (elt tramp-connection-properties)
-           (when (string-match
+           (when (string-match-p
                   (or (nth 0 elt) "")
                   (tramp-make-tramp-file-name key 'noloc 'nohop))
              (tramp-set-connection-property key (nth 1 elt) (nth 2 elt)))))
@@ -217,8 +217,8 @@ Remove also properties of all files in subdirectories."
      (lambda (key _value)
        (when (and (tramp-file-name-p key)
                  (stringp (tramp-file-name-localname key))
-                 (string-match (regexp-quote directory)
-                               (tramp-file-name-localname key)))
+                 (string-match-p (regexp-quote directory)
+                                 (tramp-file-name-localname key)))
         (remhash key tramp-cache-data)))
      tramp-cache-data)
     ;; Remove file properties of symlinks.
@@ -236,7 +236,7 @@ Remove also properties of all files in subdirectories."
 This is suppressed for temporary buffers."
   (save-match-data
     (unless (or (null (buffer-name))
-               (string-match "^\\( \\|\\*\\)" (buffer-name)))
+               (string-match-p "^\\( \\|\\*\\)" (buffer-name)))
       (let ((bfn (if (stringp (buffer-file-name))
                     (buffer-file-name)
                   default-directory))
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index 3c8f182..b886223 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -261,7 +261,7 @@ buffer in your bug report.
        (set varsym (read (format "(%s)" (tramp-cache-print val))))
       ;; There are non-7bit characters to be masked.
       (when (and (stringp val)
-                (string-match
+                (string-match-p
                  (concat "[^" (bound-and-true-p mm-7bit-chars) "]") val))
        (with-current-buffer reporter-eval-buffer
          (set
@@ -277,10 +277,11 @@ buffer in your bug report.
       ;; Remove string quotation.
       (forward-line -1)
       (when (looking-at
-            (concat "\\(^.*\\)" "\""                       ;; \1 "
-                    "\\((base64-decode-string \\)" "\\\\"  ;; \2 \
-                    "\\(\".*\\)" "\\\\"                    ;; \3 \
-                    "\\(\")\\)" "\"$"))                    ;; \4 "
+            (eval-when-compile
+              (concat "\\(^.*\\)" "\""                       ;; \1 "
+                      "\\((base64-decode-string \\)" "\\\\"  ;; \2 \
+                      "\\(\".*\\)" "\\\\"                    ;; \3 \
+                      "\\(\")\\)" "\"$")))                   ;; \4 "
        (replace-match "\\1\\2\\3\\4")
        (beginning-of-line)
        (insert " ;; Variable encoded due to non-printable characters.\n"))
@@ -305,7 +306,7 @@ buffer in your bug report.
           (delq nil
                 (mapcar
                  (lambda (b)
-                    (when (string-match "\\*tramp/" (buffer-name b)) b))
+                    (when (string-match-p "\\*tramp/" (buffer-name b)) b))
                  (buffer-list))))
     (let ((reporter-eval-buffer buffer)
          (elbuf (get-buffer-create " *tmp-reporter-buffer*")))
@@ -333,7 +334,7 @@ buffer in your bug report.
   (insert "\nload-path shadows:\n==================\n")
   (ignore-errors
     (mapc
-     (lambda (x) (when (string-match "tramp" x) (insert x "\n")))
+     (lambda (x) (when (string-match-p "tramp" x) (insert x "\n")))
      (split-string (list-load-path-shadows t) "\n")))
 
   ;; Append buffers only when we are in message mode.
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index 4db45f3..9e02ebb 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -97,7 +97,7 @@ Add the extension of F, if existing."
                          ;; The returned command name could be truncated
                          ;; to 15 characters.  Therefore, we cannot check
                          ;; for `string-equal'.
-                         (and comm (string-match
+                         (and comm (string-match-p
                                     (concat "^" (regexp-quote comm))
                                     process-name))))
              (setq result t)))))))))
@@ -195,7 +195,7 @@ This is a string of ten letters or dashes as in ls -l."
     (defsubst tramp-compat-file-name-quoted-p (name)
       "Whether NAME is quoted with prefix \"/:\".
 If NAME is a remote file name, check the local part of NAME."
-      (string-match "^/:" (or (file-remote-p name 'localname) name))))
+      (string-prefix-p "/:" (or (file-remote-p name 'localname) name))))
 
   (if (fboundp 'file-name-quote)
       (defalias 'tramp-compat-file-name-quote 'file-name-quote)
@@ -212,14 +212,11 @@ If NAME is a remote file name, the local part of NAME is 
quoted."
     (defsubst tramp-compat-file-name-unquote (name)
       "Remove quotation prefix \"/:\" from file NAME.
 If NAME is a remote file name, the local part of NAME is unquoted."
-      (save-match-data
-       (let ((localname (or (file-remote-p name 'localname) name)))
-         (when (tramp-compat-file-name-quoted-p localname)
-           (setq
-            localname
-            (replace-match
-             (if (= (length localname) 2) "/" "") nil t localname)))
-         (concat (file-remote-p name) localname))))))
+      (let ((localname (or (file-remote-p name 'localname) name)))
+       (when (tramp-compat-file-name-quoted-p localname)
+         (setq
+          localname (if (= (length localname) 2) "/" (substring localname 2))))
+       (concat (file-remote-p name) localname)))))
 
 ;; `tramp-syntax' has changed its meaning in Emacs 26.  We still
 ;; support old settings.
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 76747f7..8211872 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -899,14 +899,14 @@ file names."
               (tramp-get-connection-property v "default-location" "~")
               nil t localname 1)))
       ;; Tilde expansion is not possible.
-      (when (string-match "\\`\\(~[^/]*\\)\\(.*\\)\\'" localname)
+      (when (string-match-p "\\`\\(~[^/]*\\)\\(.*\\)\\'" localname)
        (tramp-error
         v 'file-error
         "Cannot expand tilde in file `%s'" name))
       (unless (tramp-run-real-handler 'file-name-absolute-p (list localname))
        (setq localname (concat "/" localname)))
       ;; We do not pass "/..".
-      (if (string-match "^\\(afp\\|davs?\\|smb\\)$" method)
+      (if (string-match-p "^\\(afp\\|davs?\\|smb\\)$" method)
          (when (string-match "^/[^/]+\\(/\\.\\./?\\)" localname)
            (setq localname (replace-match "/" t t localname 1)))
        (when (string-match "^/\\.\\./?" localname)
@@ -997,8 +997,8 @@ If FILE-SYSTEM is non-nil, return file system attributes."
   (setq filename (directory-file-name (expand-file-name filename)))
   (with-parsed-tramp-file-name filename nil
     (setq localname (tramp-compat-file-name-unquote localname))
-    (if (or (and (string-match "^\\(afp\\|davs?\\|smb\\)$" method)
-                (string-match "^/?\\([^/]+\\)$" localname))
+    (if (or (and (string-match-p "^\\(afp\\|davs?\\|smb\\)$" method)
+                (string-match-p "^/?\\([^/]+\\)$" localname))
            (string-equal localname "/"))
        (tramp-gvfs-get-root-attributes filename)
       (assoc
@@ -1038,7 +1038,8 @@ If FILE-SYSTEM is non-nil, return file system attributes."
              (if (eq id-format 'integer)
                  (string-to-number
                   (or (cdr (assoc "unix::uid" attributes))
-                      (format "%s" tramp-unknown-id-integer)))
+                      (eval-when-compile
+                        (format "%s" tramp-unknown-id-integer))))
                (or (cdr (assoc "owner::user" attributes))
                    (cdr (assoc "unix::uid" attributes))
                    tramp-unknown-id-string)))
@@ -1046,7 +1047,8 @@ If FILE-SYSTEM is non-nil, return file system attributes."
              (if (eq id-format 'integer)
                  (string-to-number
                   (or (cdr (assoc "unix::gid" attributes))
-                      (format "%s" tramp-unknown-id-integer)))
+                      (eval-when-compile
+                        (format "%s" tramp-unknown-id-integer))))
                (or (cdr (assoc "owner::group" attributes))
                    (cdr (assoc "unix::gid" attributes))
                    tramp-unknown-id-string)))
@@ -1216,14 +1218,16 @@ file-notify events."
           string (replace-regexp-in-string
                  "renamed to" "moved" string))
     ;; https://bugs.launchpad.net/bugs/1742946
-    (when (string-match "Monitoring not supported\\|No locations given" string)
+    (when
+       (string-match-p "Monitoring not supported\\|No locations given" string)
       (delete-process proc))
 
     (while (string-match
-           (concat "^.+:"
-                   "[[:space:]]\\(.+\\):"
-                   "[[:space:]]" (regexp-opt tramp-gio-events t)
-                   "\\([[:space:]]\\(.+\\)\\)?$")
+           (eval-when-compile
+             (concat "^.+:"
+                     "[[:space:]]\\(.+\\):"
+                     "[[:space:]]" (regexp-opt tramp-gio-events t)
+                     "\\([[:space:]]\\(.+\\)\\)?$"))
            string)
 
       (let ((file (match-string 1 string))
@@ -1233,11 +1237,11 @@ file-notify events."
        ;; File names are returned as URL paths.  We must convert them.
        (when (string-match ddu file)
          (setq file (replace-match dd nil nil file)))
-       (while (string-match "%\\([0-9A-F]\\{2\\}\\)" file)
+       (while (string-match-p "%\\([0-9A-F]\\{2\\}\\)" file)
          (setq file (url-unhex-string file)))
        (when (string-match ddu (or file1 ""))
          (setq file1 (replace-match dd nil nil file1)))
-       (while (string-match "%\\([0-9A-F]\\{2\\}\\)" (or file1 ""))
+       (while (string-match-p "%\\([0-9A-F]\\{2\\}\\)" (or file1 ""))
          (setq file1 (url-unhex-string file1)))
        ;; Remove watch when file or directory to be watched is deleted.
        (when (and (member action '(moved deleted))
@@ -1540,7 +1544,7 @@ file-notify events."
        (when (and (string-equal "dav" method) (string-equal "true" ssl))
          (setq method "davs"))
        (when (and (string-equal "davs" method)
-                  (string-match
+                  (string-match-p
                    tramp-gvfs-nextcloud-default-prefix-regexp prefix))
          (setq method "nextcloud"))
        (when (string-equal "google-drive" method)
@@ -1630,7 +1634,7 @@ file-notify events."
         (when (and (string-equal "dav" method) (string-equal "true" ssl))
           (setq method "davs"))
         (when (and (string-equal "davs" method)
-                   (string-match
+                   (string-match-p
                     tramp-gvfs-nextcloud-default-prefix-regexp prefix))
           (setq method "nextcloud"))
         (when (string-equal "google-drive" method)
@@ -1647,8 +1651,8 @@ file-notify events."
                (string-equal domain (tramp-file-name-domain vec))
                (string-equal host (tramp-file-name-host vec))
                (string-equal port (tramp-file-name-port vec))
-               (string-match (concat "^/" (regexp-quote (or share "")))
-                             (tramp-file-name-unquote-localname vec)))
+               (string-match-p (concat "^/" (regexp-quote (or share "")))
+                               (tramp-file-name-unquote-localname vec)))
           ;; Set mountpoint and location.
           (tramp-set-file-property vec "/" "fuse-mountpoint" fuse-mountpoint)
           (tramp-set-connection-property
@@ -1671,7 +1675,7 @@ file-notify events."
 (defun tramp-gvfs-mount-spec-entry (key value)
   "Construct a mount-spec entry to be used in a mount_spec.
 It was \"a(say)\", but has changed to \"a{sv})\"."
-  (if (string-match "^(aya{sv})" tramp-gvfs-mountlocation-signature)
+  (if (string-match-p "^(aya{sv})" tramp-gvfs-mountlocation-signature)
       (list :dict-entry key
            (list :variant (tramp-gvfs-dbus-string-to-byte-array value)))
     (list :struct key (tramp-gvfs-dbus-string-to-byte-array value))))
@@ -1686,7 +1690,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
         (localname (tramp-file-name-unquote-localname vec))
         (share (when (string-match "^/?\\([^/]+\\)" localname)
                  (match-string 1 localname)))
-        (ssl (if (string-match "^davs\\|^nextcloud" method) "true" "false"))
+        (ssl (if (string-match-p "^davs\\|^nextcloud" method) "true" "false"))
         (mount-spec
           `(:array
             ,@(cond
@@ -1694,7 +1698,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
                 (list (tramp-gvfs-mount-spec-entry "type" "smb-share")
                       (tramp-gvfs-mount-spec-entry "server" host)
                       (tramp-gvfs-mount-spec-entry "share" share)))
-               ((string-match "^dav\\|^nextcloud" method)
+               ((string-match-p "^dav\\|^nextcloud" method)
                 (list (tramp-gvfs-mount-spec-entry "type" "dav")
                       (tramp-gvfs-mount-spec-entry "host" host)
                       (tramp-gvfs-mount-spec-entry "ssl" ssl)))
@@ -1708,7 +1712,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
                ((string-equal "nextcloud" method)
                 (list (tramp-gvfs-mount-spec-entry "type" "owncloud")
                       (tramp-gvfs-mount-spec-entry "host" host)))
-               ((string-match "^http" method)
+               ((string-match-p "^http" method)
                 (list (tramp-gvfs-mount-spec-entry "type" "http")
                       (tramp-gvfs-mount-spec-entry
                       "uri"
@@ -1725,7 +1729,7 @@ It was \"a(say)\", but has changed to \"a{sv})\"."
             ,@(when port
                 (list (tramp-gvfs-mount-spec-entry "port" port)))))
         (mount-pref
-          (if (and (string-match "^dav" method)
+          (if (and (string-match-p "^dav" method)
                    (string-match "^/?[^/]+" localname))
               (match-string 0 localname)
            (tramp-gvfs-get-remote-prefix vec))))
@@ -1815,7 +1819,7 @@ connection if a previous connection has died for some 
reason."
                 (string-equal localname "/"))
        (tramp-error vec 'file-error "Filename must contain an AFP volume"))
 
-      (when (and (string-match method "davs?")
+      (when (and (string-match-p "davs?" method)
                 (string-equal localname "/"))
        (tramp-error vec 'file-error "Filename must contain a WebDAV share"))
 
@@ -1856,7 +1860,7 @@ connection if a previous connection has died for some 
reason."
 
        ;; The call must be asynchronously, because of the "askPassword"
        ;; or "askQuestion" callbacks.
-       (if (string-match "(so)$" tramp-gvfs-mountlocation-signature)
+       (if (string-match-p "(so)$" tramp-gvfs-mountlocation-signature)
            (with-tramp-dbus-call-method vec nil
              :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
              tramp-gvfs-interface-mounttracker tramp-gvfs-mountlocation
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 900b4b3..3f426bb 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -1257,18 +1257,17 @@ component is used as the target of the symlink."
       (with-parsed-tramp-file-name (expand-file-name filename) nil
        (with-tramp-file-property
            v localname (format "file-attributes-%s" id-format)
-         (save-excursion
-           (tramp-convert-file-attributes
-            v
-            (or
-             (cond
-              ((tramp-get-remote-stat v)
-               (tramp-do-file-attributes-with-stat v localname id-format))
-              ((tramp-get-remote-perl v)
-               (tramp-do-file-attributes-with-perl v localname id-format))
-              (t nil))
-             ;; The scripts could fail, for example with huge file size.
-             (tramp-do-file-attributes-with-ls v localname id-format)))))))))
+         (tramp-convert-file-attributes
+          v
+          (or
+           (cond
+            ((tramp-get-remote-stat v)
+             (tramp-do-file-attributes-with-stat v localname id-format))
+            ((tramp-get-remote-perl v)
+             (tramp-do-file-attributes-with-perl v localname id-format))
+            (t nil))
+           ;; The scripts could fail, for example with huge file size.
+           (tramp-do-file-attributes-with-ls v localname id-format))))))))
 
 (defun tramp-sh--quoting-style-options (vec)
   (or
@@ -1335,7 +1334,7 @@ component is used as the target of the symlink."
           (when symlinkp
             (search-forward "-> ")
             (setq res-symlink-target
-                  (if (looking-at "\"")
+                  (if (looking-at-p "\"")
                       (read (current-buffer))
                     (buffer-substring (point) (point-at-eol)))))
           ;; Return data gathered.
@@ -1383,15 +1382,16 @@ component is used as the target of the symlink."
   (tramp-send-command-and-read
    vec
    (format
-    (concat
-     ;; On Opsware, pdksh (which is the true name of ksh there)
-     ;; doesn't parse correctly the sequence "((".  Therefore, we add
-     ;; a space.  Apostrophes in the stat output are masked as
-     ;; `tramp-stat-marker', in order to make a proper shell escape of
-     ;; them in file names.
-     "( (%s %s || %s -h %s) && (%s -c "
-     "'((%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' "
-     "%s | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g') || echo nil)")
+    (eval-when-compile
+      (concat
+       ;; On Opsware, pdksh (which is the true name of ksh there)
+       ;; doesn't parse correctly the sequence "((".  Therefore, we
+       ;; add a space.  Apostrophes in the stat output are masked as
+       ;; `tramp-stat-marker', in order to make a proper shell escape
+       ;; of them in file names.
+       "( (%s %s || %s -h %s) && (%s -c "
+       "'((%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' "
+       "%s | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g') || echo nil)"))
     (tramp-get-file-exists-command vec)
     (tramp-shell-quote-argument localname)
     (tramp-get-test-command vec)
@@ -1399,9 +1399,11 @@ component is used as the target of the symlink."
     (tramp-get-remote-stat vec)
     tramp-stat-marker tramp-stat-marker
     (if (eq id-format 'integer)
-       "%u" (concat tramp-stat-marker "%U" tramp-stat-marker))
+       "%u"
+      (eval-when-compile (concat tramp-stat-marker "%U" tramp-stat-marker)))
     (if (eq id-format 'integer)
-       "%g" (concat tramp-stat-marker "%G" tramp-stat-marker))
+       "%g"
+      (eval-when-compile (concat tramp-stat-marker "%G" tramp-stat-marker)))
     tramp-stat-marker tramp-stat-marker
     (tramp-shell-quote-argument localname)
     tramp-stat-quoted-marker)))
@@ -1558,8 +1560,9 @@ be non-negative integers."
   (with-parsed-tramp-file-name filename nil
     (with-tramp-file-property v localname "file-selinux-context"
       (let ((context '(nil nil nil nil))
-           (regexp (concat "\\([a-z0-9_]+\\):" "\\([a-z0-9_]+\\):"
-                           "\\([a-z0-9_]+\\):" "\\([a-z0-9_]+\\)")))
+           (regexp (eval-when-compile
+                     (concat "\\([a-z0-9_]+\\):" "\\([a-z0-9_]+\\):"
+                             "\\([a-z0-9_]+\\):" "\\([a-z0-9_]+\\)"))))
        (when (and (tramp-remote-selinux-p v)
                   (tramp-send-command-and-check
                    v (format
@@ -1663,16 +1666,12 @@ be non-negative integers."
 ;; something smarter about it.
 (defun tramp-sh-handle-file-newer-than-file-p (file1 file2)
   "Like `file-newer-than-file-p' for Tramp files."
-  (cond ((not (file-exists-p file1))
-         nil)
-        ((not (file-exists-p file2))
-         t)
-        ;; We are sure both files exist at this point.
-        (t
-         (save-excursion
-          ;; We try to get the mtime of both files.  If they are not
-          ;; equal to the "dont-know" value, then we subtract the times
-          ;; and obtain the result.
+  (cond ((not (file-exists-p file1)) nil)
+        ((not (file-exists-p file2)) t)
+        (t ;; We are sure both files exist at this point.  We try to
+           ;; get the mtime of both files.  If they are not equal to
+           ;; the "dont-know" value, then we subtract the times and
+           ;; obtain the result.
           (let ((fa1 (file-attributes file1))
                 (fa2 (file-attributes file2)))
             (if (and
@@ -1701,7 +1700,7 @@ be non-negative integers."
                    file1 file2)))
               (with-parsed-tramp-file-name file1 nil
                 (tramp-run-test2
-                 (tramp-get-test-nt-command v) file1 file2))))))))
+                 (tramp-get-test-nt-command v) file1 file2)))))))
 
 ;; Functions implemented using the basic functions above.
 
@@ -1758,25 +1757,22 @@ be non-negative integers."
               (with-tramp-file-property
                   v localname
                   (format "directory-files-and-attributes-%s" id-format)
-                (save-excursion
-                  (mapcar
-                   (lambda (x)
-                     (cons (car x)
-                           (tramp-convert-file-attributes v (cdr x))))
-                   (or
-                    (cond
-                     ((tramp-get-remote-stat v)
-                      (tramp-do-directory-files-and-attributes-with-stat
-                       v localname id-format))
-                     ((tramp-get-remote-perl v)
-                      (tramp-do-directory-files-and-attributes-with-perl
-                       v localname id-format))
-                     (t nil)))))))))
+                (mapcar
+                 (lambda (x)
+                   (cons (car x) (tramp-convert-file-attributes v (cdr x))))
+                 (cond
+                  ((tramp-get-remote-stat v)
+                   (tramp-do-directory-files-and-attributes-with-stat
+                    v localname id-format))
+                  ((tramp-get-remote-perl v)
+                   (tramp-do-directory-files-and-attributes-with-perl
+                    v localname id-format))
+                  (t nil)))))))
           result item)
 
       (while temp
        (setq item (pop temp))
-       (when (or (null match) (string-match match (car item)))
+       (when (or (null match) (string-match-p match (car item)))
          (when full
            (setcar item (expand-file-name (car item) directory)))
          (push item result)))
@@ -1810,16 +1806,18 @@ be non-negative integers."
   (tramp-send-command-and-read
    vec
    (format
-    (concat
-     ;; We must care about file names with spaces, or starting with
-     ;; "-"; this would confuse xargs.  "ls -aQ" might be a solution,
-     ;; but it does not work on all remote systems.  Apostrophes in
-     ;; the stat output are masked as `tramp-stat-marker', in order to
-     ;; make a proper shell escape of them in file names.
-     "cd %s && echo \"(\"; (%s %s -a | "
-     "xargs %s -c "
-     "'(%s%%n%s (%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' "
-     "-- 2>/dev/null | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'); echo \")\"")
+    (eval-when-compile
+      (concat
+       ;; We must care about file names with spaces, or starting with
+       ;; "-"; this would confuse xargs.  "ls -aQ" might be a
+       ;; solution, but it does not work on all remote systems.
+       ;; Apostrophes in the stat output are masked as
+       ;; `tramp-stat-marker', in order to make a proper shell escape
+       ;; of them in file names.
+       "cd %s && echo \"(\"; (%s %s -a | "
+       "xargs %s -c "
+       "'(%s%%n%s (%s%%N%s) %%h %s %s %%X %%Y %%Z %%s %s%%A%s t %%i -1)' "
+       "-- 2>/dev/null | sed -e 's/\"/\\\\\"/g' -e 's/%s/\"/g'); echo \")\""))
     (tramp-shell-quote-argument localname)
     (tramp-get-ls-command vec)
     ;; On systems which have no quoting style, file names with special
@@ -1829,9 +1827,11 @@ be non-negative integers."
     tramp-stat-marker tramp-stat-marker
     tramp-stat-marker tramp-stat-marker
     (if (eq id-format 'integer)
-       "%u" (concat tramp-stat-marker "%U" tramp-stat-marker))
+       "%u"
+      (eval-when-compile (concat tramp-stat-marker "%U" tramp-stat-marker)))
     (if (eq id-format 'integer)
-       "%g" (concat tramp-stat-marker "%G" tramp-stat-marker))
+       "%g"
+      (eval-when-compile (concat tramp-stat-marker "%G" tramp-stat-marker)))
     tramp-stat-marker tramp-stat-marker
     tramp-stat-quoted-marker)))
 
@@ -1858,12 +1858,13 @@ be non-negative integers."
                  (format "tramp_perl_file_name_all_completions %s"
                          (tramp-shell-quote-argument localname)))
 
-             (format (concat
-                      "(cd %s 2>&1 && %s -a 2>/dev/null"
-                      " | while IFS= read f; do"
-                      " if %s -d \"$f\" 2>/dev/null;"
-                      " then \\echo \"$f/\"; else \\echo \"$f\"; fi; done"
-                      " && \\echo ok) || \\echo fail")
+             (format (eval-when-compile
+                       (concat
+                        "(cd %s 2>&1 && %s -a 2>/dev/null"
+                        " | while IFS= read f; do"
+                        " if %s -d \"$f\" 2>/dev/null;"
+                        " then \\echo \"$f/\"; else \\echo \"$f\"; fi; done"
+                        " && \\echo ok) || \\echo fail"))
                      (tramp-shell-quote-argument localname)
                      (tramp-get-ls-command v)
                      (tramp-get-test-command v))))
@@ -1874,7 +1875,7 @@ be non-negative integers."
 
             ;; Check result code, found in last line of output.
             (forward-line -1)
-            (if (looking-at "^fail$")
+            (if (looking-at-p "^fail$")
                 (progn
                   ;; Grab error message from line before last line
                   ;; (it was put there by `cd 2>&1').
@@ -1887,7 +1888,7 @@ be non-negative integers."
               ;; then it should end in `ok'.  If neither are in the
               ;; buffer something went seriously wrong on the remote
               ;; side.
-              (unless (looking-at "^ok$")
+              (unless (looking-at-p "^ok$")
                 (tramp-error
                  v 'file-error "\
 tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
@@ -2545,12 +2546,11 @@ The method used must be an out-of-band method."
     ;; whole cache.
     (tramp-flush-directory-properties
      v (if parents "/" (file-name-directory localname)))
-    (save-excursion
-      (tramp-barf-unless-okay
-       v (format "%s %s"
-                (if parents "mkdir -p" "mkdir")
-                (tramp-shell-quote-argument localname))
-       "Couldn't make directory %s" dir))))
+    (tramp-barf-unless-okay
+     v (format "%s %s"
+              (if parents "mkdir -p" "mkdir")
+              (tramp-shell-quote-argument localname))
+     "Couldn't make directory %s" dir)))
 
 (defun tramp-sh-handle-delete-directory (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
@@ -2584,41 +2584,39 @@ The method used must be an out-of-band method."
   ;; Code stolen mainly from dired-aux.el.
   (with-parsed-tramp-file-name file nil
     (tramp-flush-file-properties v localname)
-    (save-excursion
-      (let ((suffixes dired-compress-file-suffixes)
-           suffix)
-       ;; See if any suffix rule matches this file name.
-       (while suffixes
-         (let (case-fold-search)
-           (if (string-match (car (car suffixes)) localname)
-               (setq suffix (car suffixes) suffixes nil))
-           (setq suffixes (cdr suffixes))))
-
-       (cond ((file-symlink-p file)
-              nil)
-             ((and suffix (nth 2 suffix))
-              ;; We found an uncompression rule.
-              (with-tramp-progress-reporter
-                   v 0 (format "Uncompressing %s" file)
-                (when (tramp-send-command-and-check
-                       v (concat (nth 2 suffix) " "
-                                 (tramp-shell-quote-argument localname)))
-                  (dired-remove-file file)
-                  (string-match (car suffix) file)
-                  (concat (substring file 0 (match-beginning 0))))))
-             (t
-              ;; We don't recognize the file as compressed, so compress it.
-              ;; Try gzip.
-              (with-tramp-progress-reporter v 0 (format "Compressing %s" file)
-                (when (tramp-send-command-and-check
-                       v (concat "gzip -f "
-                                 (tramp-shell-quote-argument localname)))
-                  (dired-remove-file file)
-                  (cond ((file-exists-p (concat file ".gz"))
-                         (concat file ".gz"))
-                        ((file-exists-p (concat file ".z"))
-                         (concat file ".z"))
-                        (t nil))))))))))
+    (let ((suffixes dired-compress-file-suffixes)
+         suffix)
+      ;; See if any suffix rule matches this file name.
+      (while suffixes
+       (let (case-fold-search)
+         (if (string-match-p (car (car suffixes)) localname)
+             (setq suffix (car suffixes) suffixes nil))
+         (setq suffixes (cdr suffixes))))
+
+      (cond ((file-symlink-p file) nil)
+           ((and suffix (nth 2 suffix))
+            ;; We found an uncompression rule.
+            (with-tramp-progress-reporter
+                 v 0 (format "Uncompressing %s" file)
+              (when (tramp-send-command-and-check
+                     v (concat (nth 2 suffix) " "
+                               (tramp-shell-quote-argument localname)))
+                (dired-remove-file file)
+                (string-match (car suffix) file)
+                (concat (substring file 0 (match-beginning 0))))))
+           (t
+            ;; We don't recognize the file as compressed, so compress it.
+            ;; Try gzip.
+            (with-tramp-progress-reporter v 0 (format "Compressing %s" file)
+              (when (tramp-send-command-and-check
+                     v (concat "gzip -f "
+                               (tramp-shell-quote-argument localname)))
+                (dired-remove-file file)
+                (cond ((file-exists-p (concat file ".gz"))
+                       (concat file ".gz"))
+                      ((file-exists-p (concat file ".z"))
+                       (concat file ".z"))
+                      (t nil)))))))))
 
 (defun tramp-sh-handle-insert-directory
   (filename switches &optional wildcard full-directory-p)
@@ -2698,7 +2696,7 @@ The method used must be an out-of-band method."
 
          ;; Check for "--dired" output.
          (forward-line -2)
-         (when (looking-at "//SUBDIRED//")
+         (when (looking-at-p "//SUBDIRED//")
            (forward-line -1))
          (when (looking-at "//DIRED//\\s-+")
            (let ((databeg (match-end 0))
@@ -2719,7 +2717,7 @@ The method used must be an out-of-band method."
 
          ;; Some busyboxes are reluctant to discard colors.
          (unless
-             (string-match "color" (tramp-get-connection-property v "ls" ""))
+             (string-match-p "color" (tramp-get-connection-property v "ls" ""))
            (goto-char beg)
            (while
                (re-search-forward tramp-display-escape-sequence-regexp nil t)
@@ -2787,7 +2785,7 @@ the result will be a local, non-Tramp, file name."
          ;; appropriate either, because ssh and companions might
          ;; use a user name from the config file.
          (when (and (string-equal uname "~")
-                    (string-match "\\`su\\(do\\)?\\'" method))
+                    (string-match-p "\\`su\\(do\\)?\\'" method))
            (setq uname (concat uname user)))
          (setq uname
                (with-tramp-connection-property v uname
@@ -2837,7 +2835,7 @@ the result will be a local, non-Tramp, file name."
           ;; it might be that the arguments exceed the command line
           ;; length.  Therefore, we modify the command.
           (heredoc (and (stringp program)
-                        (string-match "sh$" program)
+                        (string-match-p "sh$" program)
                         (string-equal "-c" (car args))
                         (= (length args) 2)))
           ;; When PROGRAM is nil, we just provide a tty.
@@ -2861,7 +2859,7 @@ the result will be a local, non-Tramp, file name."
           env uenv
           (env (dolist (elt (cons prompt process-environment) env)
                   (or (member elt (default-toplevel-value 
'process-environment))
-                      (if (string-match "=" elt)
+                      (if (string-match-p "=" elt)
                           (setq env (append env `(,elt)))
                         (if (tramp-get-env-with-u-option v)
                             (setq env (append `("-u" ,elt) env))
@@ -2951,7 +2949,7 @@ the result will be a local, non-Tramp, file name."
                  p)))
 
          ;; Save exit.
-         (if (string-match tramp-temp-buffer-name (buffer-name))
+         (if (string-match-p tramp-temp-buffer-name (buffer-name))
              (ignore-errors
                (set-process-buffer p nil)
                (kill-buffer (current-buffer)))
@@ -2974,7 +2972,7 @@ the result will be a local, non-Tramp, file name."
       ;; We use as environment the difference to toplevel 
`process-environment'.
       (dolist (elt process-environment)
         (or (member elt (default-toplevel-value 'process-environment))
-            (if (string-match "=" elt)
+            (if (string-match-p "=" elt)
                 (setq env (append env `(,elt)))
               (if (tramp-get-env-with-u-option v)
                   (setq env (append `("-u" ,elt) env))
@@ -3114,50 +3112,49 @@ the result will be a local, non-Tramp, file name."
 
           ;; Use inline encoding for file transfer.
           (rem-enc
-           (save-excursion
-             (with-tramp-progress-reporter
-              v 3
-              (format-message "Encoding remote file `%s' with `%s'"
-                               filename rem-enc)
-              (tramp-barf-unless-okay
-               v (format rem-enc (tramp-shell-quote-argument localname))
-               "Encoding remote file failed"))
-
-             (with-tramp-progress-reporter
-                 v 3 (format-message "Decoding local file `%s' with `%s'"
-                                     tmpfile loc-dec)
-               (if (functionp loc-dec)
-                   ;; If local decoding is a function, we call it.
-                   ;; We must disable multibyte, because
-                   ;; `uudecode-decode-region' doesn't handle it
-                   ;; correctly.  Unset `file-name-handler-alist'.
-                   ;; Otherwise, epa-file gets confused.
-                   (let (file-name-handler-alist
-                         (coding-system-for-write 'binary))
-                     (with-temp-file tmpfile
-                       (set-buffer-multibyte nil)
-                       (insert-buffer-substring (tramp-get-buffer v))
-                       (funcall loc-dec (point-min) (point-max))))
-
-                 ;; If tramp-decoding-function is not defined for this
-                 ;; method, we invoke tramp-decoding-command instead.
-                 (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
-                   ;; Unset `file-name-handler-alist'.  Otherwise,
-                   ;; epa-file gets confused.
-                   (let (file-name-handler-alist
-                         (coding-system-for-write 'binary))
-                     (with-current-buffer (tramp-get-buffer v)
-                       (write-region
-                        (point-min) (point-max) tmpfile2 nil 'no-message)))
-                   (unwind-protect
-                       (tramp-call-local-coding-command
-                        loc-dec tmpfile2 tmpfile)
-                     (delete-file tmpfile2)))))
-
-             ;; Set proper permissions.
-             (set-file-modes tmpfile (tramp-default-file-modes filename))
-             ;; Set local user ownership.
-             (tramp-set-file-uid-gid tmpfile)))
+           (with-tramp-progress-reporter
+               v 3
+               (format-message
+                "Encoding remote file `%s' with `%s'" filename rem-enc)
+             (tramp-barf-unless-okay
+              v (format rem-enc (tramp-shell-quote-argument localname))
+              "Encoding remote file failed"))
+
+           (with-tramp-progress-reporter
+               v 3 (format-message
+                    "Decoding local file `%s' with `%s'" tmpfile loc-dec)
+             (if (functionp loc-dec)
+                 ;; If local decoding is a function, we call it.  We
+                 ;; must disable multibyte, because
+                 ;; `uudecode-decode-region' doesn't handle it
+                 ;; correctly.  Unset `file-name-handler-alist'.
+                 ;; Otherwise, epa-file gets confused.
+                 (let (file-name-handler-alist
+                       (coding-system-for-write 'binary))
+                   (with-temp-file tmpfile
+                     (set-buffer-multibyte nil)
+                     (insert-buffer-substring (tramp-get-buffer v))
+                     (funcall loc-dec (point-min) (point-max))))
+
+               ;; If tramp-decoding-function is not defined for this
+               ;; method, we invoke tramp-decoding-command instead.
+               (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
+                 ;; Unset `file-name-handler-alist'.  Otherwise,
+                 ;; epa-file gets confused.
+                 (let (file-name-handler-alist
+                       (coding-system-for-write 'binary))
+                   (with-current-buffer (tramp-get-buffer v)
+                     (write-region
+                      (point-min) (point-max) tmpfile2 nil 'no-message)))
+                 (unwind-protect
+                     (tramp-call-local-coding-command
+                      loc-dec tmpfile2 tmpfile)
+                   (delete-file tmpfile2)))))
+
+           ;; Set proper permissions.
+           (set-file-modes tmpfile (tramp-default-file-modes filename))
+           ;; Set local user ownership.
+           (tramp-set-file-uid-gid tmpfile))
 
           ;; Oops, I don't know what to do.
           (t (tramp-error
@@ -3323,8 +3320,9 @@ the result will be a local, non-Tramp, file name."
                                        loc-enc tmpfile t))
                          (tramp-error
                           v 'file-error
-                          (concat "Cannot write to `%s', "
-                                  "local encoding command `%s' failed")
+                          (eval-when-compile
+                            (concat "Cannot write to `%s', "
+                                    "local encoding command `%s' failed"))
                           filename loc-enc))))
 
                    ;; Send buffer into remote decoding command which
@@ -3369,8 +3367,9 @@ the result will be a local, non-Tramp, file name."
                             (buffer-string))))
                         (tramp-error
                          v 'file-error
-                         (concat "Couldn't write region to `%s',"
-                                 " decode using `%s' failed")
+                         (eval-when-compile
+                           (concat "Couldn't write region to `%s',"
+                                   " decode using `%s' failed"))
                          filename rem-dec)))))
 
                ;; Save exit.
@@ -3380,8 +3379,9 @@ the result will be a local, non-Tramp, file name."
             (t
              (tramp-error
               v 'file-error
-              (concat "Method `%s' should specify both encoding and "
-                      "decoding command or an scp program")
+              (eval-when-compile
+                (concat "Method `%s' should specify both encoding and "
+                        "decoding command or an scp program"))
               method))))
 
          ;; Make `last-coding-system-used' have the right value.
@@ -3568,11 +3568,13 @@ Fall back to normal file name handler if no Tramp 
handler exists."
              events
              (cond
               ((and (memq 'change flags) (memq 'attribute-change flags))
-               (concat "create,modify,move,moved_from,moved_to,move_self,"
-                       "delete,delete_self,attrib,ignored"))
+               (eval-when-compile
+                 (concat "create,modify,move,moved_from,moved_to,move_self,"
+                         "delete,delete_self,attrib,ignored")))
               ((memq 'change flags)
-               (concat "create,modify,move,moved_from,moved_to,move_self,"
-                       "delete,delete_self,ignored"))
+               (eval-when-compile
+                 (concat "create,modify,move,moved_from,moved_to,move_self,"
+                         "delete,delete_self,ignored")))
               ((memq 'attribute-change flags) "attrib,ignored"))
              sequence `(,command "-mq" "-e" ,events ,localname)
              ;; Make events a list of symbols.
@@ -3656,14 +3658,16 @@ Fall back to normal file name handler if no Tramp 
handler exists."
           string (replace-regexp-in-string
                  "renamed to" "moved" string))
     ;; https://bugs.launchpad.net/bugs/1742946
-    (when (string-match "Monitoring not supported\\|No locations given" string)
+    (when
+       (string-match-p "Monitoring not supported\\|No locations given" string)
       (delete-process proc))
 
     (while (string-match
-           (concat "^[^:]+:"
-                   "[[:space:]]\\([^:]+\\):"
-                   "[[:space:]]"  (regexp-opt tramp-gio-events t)
-                   "\\([[:space:]]\\([^:]+\\)\\)?$")
+           (eval-when-compile
+             (concat "^[^:]+:"
+                     "[[:space:]]\\([^:]+\\):"
+                     "[[:space:]]"  (regexp-opt tramp-gio-events t)
+                     "\\([[:space:]]\\([^:]+\\)\\)?$"))
            string)
 
       (let* ((file (match-string 1 string))
@@ -3712,11 +3716,12 @@ file-notify events."
                  "ATTRIB CHANGED" "ATTRIBUTE_CHANGED" string))
 
     (while (string-match
-           (concat "^[\n\r]*"
-                   "Directory Monitor Event:[\n\r]+"
-                   "Child = \\([^\n\r]+\\)[\n\r]+"
-                   "\\(Other = \\([^\n\r]+\\)[\n\r]+\\)?"
-                   "Event = \\([^[:blank:]]+\\)[\n\r]+")
+           (eval-when-compile
+             (concat "^[\n\r]*"
+                     "Directory Monitor Event:[\n\r]+"
+                     "Child = \\([^\n\r]+\\)[\n\r]+"
+                     "\\(Other = \\([^\n\r]+\\)[\n\r]+\\)?"
+                     "Event = \\([^[:blank:]]+\\)[\n\r]+"))
            string)
       (let* ((file (match-string 1 string))
             (file1 (match-string 3 string))
@@ -3755,10 +3760,11 @@ file-notify events."
     (tramp-message proc 6 "%S\n%s" proc string)
     (dolist (line (split-string string "[\n\r]+" 'omit))
       ;; Check, whether there is a problem.
-      (unless (string-match
-              (concat "^[^[:blank:]]+"
-                      "[[:blank:]]+\\([^[:blank:]]+\\)+"
-                      "\\([[:blank:]]+\\([^\n\r]+\\)\\)?")
+      (unless (string-match-p
+              (eval-when-compile
+                (concat "^[^[:blank:]]+"
+                        "[[:blank:]]+\\([^[:blank:]]+\\)+"
+                        "\\([[:blank:]]+\\([^\n\r]+\\)\\)?"))
               line)
        (tramp-error proc 'file-notify-error "%s" line))
 
@@ -3796,9 +3802,10 @@ file-notify events."
          (goto-char (point-min))
          (forward-line)
          (when (looking-at
-                (concat "[[:space:]]*\\([[:digit:]]+\\)"
-                        "[[:space:]]+\\([[:digit:]]+\\)"
-                        "[[:space:]]+\\([[:digit:]]+\\)"))
+                (eval-when-compile
+                  (concat "[[:space:]]*\\([[:digit:]]+\\)"
+                          "[[:space:]]+\\([[:digit:]]+\\)"
+                          "[[:space:]]+\\([[:digit:]]+\\)")))
            (list (string-to-number (match-string 1))
                  ;; The second value is the used size.  We need the
                  ;; free size.
@@ -3823,7 +3830,7 @@ Only send the definition if it has not already been done."
        (setq script (replace-regexp-in-string
                      (make-string 1 ?\t) (make-string 8 ? ) script))
        ;; The script could contain a call of Perl.  This is masked with `%s'.
-       (when (and (string-match "%s" script)
+       (when (and (string-match-p "%s" script)
                   (not (tramp-get-remote-perl vec)))
          (tramp-error vec 'file-error "No Perl available on remote host"))
        (tramp-barf-unless-okay
@@ -3884,12 +3891,12 @@ This function expects to be in the right *tramp* 
buffer."
       ;; 5.11") have problems with this command, we disable the call
       ;; therefore.
       (unless (or ignore-path
-                 (string-match
-                  (regexp-opt '("SunOS 5.10" "SunOS 5.11"))
+                 (string-match-p
+                  (eval-when-compile (regexp-opt '("SunOS 5.10" "SunOS 5.11")))
                   (tramp-get-connection-property vec "uname" "")))
        (tramp-send-command vec (format "which \\%s | wc -w" progname))
        (goto-char (point-min))
-       (if (looking-at "^\\s-*1$")
+       (if (looking-at-p "^\\s-*1$")
            (setq result (concat "\\" progname))))
       (unless result
        (when ignore-tilde
@@ -3903,11 +3910,12 @@ This function expects to be in the right *tramp* 
buffer."
            (setq dirlist (nreverse newdl))))
        (tramp-send-command
         vec
-        (format (concat "while read d; "
-                        "do if test -x $d/%s && test -f $d/%s; "
-                        "then echo tramp_executable $d/%s; "
-                        "break; fi; done <<'%s'\n"
-                        "%s\n%s")
+        (format (eval-when-compile
+                  (concat "while read d; "
+                          "do if test -x $d/%s && test -f $d/%s; "
+                          "then echo tramp_executable $d/%s; "
+                          "break; fi; done <<'%s'\n"
+                          "%s\n%s"))
                 progname progname progname
                 tramp-end-of-heredoc
                 (mapconcat 'identity dirlist "\n")
@@ -3996,7 +4004,7 @@ file exists and nonzero exit status otherwise."
          item extra-args)
       (while (and alist (null extra-args))
        (setq item (pop alist))
-       (when (string-match (car item) shell)
+       (when (string-match-p (car item) shell)
          (setq extra-args (cdr item))))
       ;; It is useful to set the prompt in the following command
       ;; because some people have a setting for $PS1 which /bin/sh
@@ -4017,9 +4025,10 @@ file exists and nonzero exit status otherwise."
       ;; initial probes to ensure the remote shell is usable.)
       (tramp-send-command
        vec (format
-           (concat
-            "exec env TERM='%s' INSIDE_EMACS='%s,tramp:%s' "
-            "ENV=%s %s PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s")
+           (eval-when-compile
+             (concat
+              "exec env TERM='%s' INSIDE_EMACS='%s,tramp:%s' "
+              "ENV=%s %s PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s"))
             tramp-terminal-type
             emacs-version tramp-version  ; INSIDE_EMACS
             (or (getenv-internal "ENV" tramp-remote-process-environment) "")
@@ -4057,13 +4066,14 @@ file exists and nonzero exit status otherwise."
              ;; CCC: "root" does not exist always, see my QNAP TS-459.
              ;; Which check could we apply instead?
              (tramp-send-command vec "echo ~root" t)
-             (if (or (string-match "^~root$" (buffer-string))
+             (if (or (string-match-p "^~root$" (buffer-string))
                      ;; The default shell (ksh93) of OpenSolaris and
                      ;; Solaris is buggy.  We've got reports for
                      ;; "SunOS 5.10" and "SunOS 5.11" so far.
-                     (string-match (regexp-opt '("SunOS 5.10" "SunOS 5.11"))
-                                   (tramp-get-connection-property
-                                    vec "uname" "")))
+                     (string-match-p
+                      (eval-when-compile
+                        (regexp-opt '("SunOS 5.10" "SunOS 5.11")))
+                      (tramp-get-connection-property vec "uname" "")))
 
                  (or (tramp-find-executable
                       vec "bash" (tramp-get-remote-path vec) t t)
@@ -4074,9 +4084,10 @@ file exists and nonzero exit status otherwise."
                          default-shell
                        (tramp-message
                         vec 2
-                        (concat
-                         "Couldn't find a remote shell which groks tilde "
-                         "expansion, using `%s'")
+                        (eval-when-compile
+                          (concat
+                           "Couldn't find a remote shell which groks tilde "
+                           "expansion, using `%s'"))
                         default-shell)))
 
                default-shell)))
@@ -4122,7 +4133,7 @@ process to set up.  VEC specifies the connection."
     (tramp-send-command vec "echo foo" t)
     (with-current-buffer (process-buffer proc)
       (goto-char (point-min))
-      (when (looking-at "echo foo")
+      (when (looking-at-p "echo foo")
        (tramp-set-connection-property proc "remote-echo" t)
        (tramp-message vec 5 "Remote echo still on. Ok.")
        ;; Make sure backspaces and their echo are enabled and no line
@@ -4161,10 +4172,10 @@ process to set up.  VEC specifies the connection."
       ;; Use MULE to select the right EOL convention for communicating
       ;; with the process.
       (let ((cs (or (and (memq 'utf-8-hfs (coding-system-list))
-                        (string-match "^Darwin" uname)
+                        (string-match-p "^Darwin" uname)
                         (cons 'utf-8-hfs 'utf-8-hfs))
                    (and (memq 'utf-8 (coding-system-list))
-                        (string-match "utf-?8" (tramp-get-remote-locale vec))
+                        (string-match-p "utf-?8" (tramp-get-remote-locale vec))
                         (cons 'utf-8 'utf-8))
                    (process-coding-system proc)
                    (cons 'undecided 'undecided)))
@@ -4174,7 +4185,7 @@ process to set up.  VEC specifies the connection."
              cs-encode (or (cdr cs) 'undecided)
              cs-encode
              (coding-system-change-eol-conversion
-              cs-encode (if (string-match "^Darwin" uname) 'mac 'unix)))
+              cs-encode (if (string-match-p "^Darwin" uname) 'mac 'unix)))
        (tramp-send-command vec "(echo foo ; echo bar)" t)
        (goto-char (point-min))
        (when (search-forward "\r" nil t)
@@ -4198,7 +4209,7 @@ process to set up.  VEC specifies the connection."
        (t
        (tramp-message
         vec 5 "Checking remote host type for `send-process-string' bug")
-       (if (string-match "^FreeBSD" uname) 500 0))))
+       (if (string-match-p "^FreeBSD" uname) 500 0))))
 
     ;; Set remote PATH variable.
     (tramp-set-remote-path vec)
@@ -4221,11 +4232,11 @@ process to set up.  VEC specifies the connection."
     ;; IRIX64 bash expands "!" even when in single quotes.  This
     ;; destroys our shell functions, we must disable it.  See
     ;; 
<http://stackoverflow.com/questions/3291692/irix-bash-shell-expands-expression-in-single-quotes-yet-shouldnt>.
-    (when (string-match "^IRIX64" uname)
+    (when (string-match-p "^IRIX64" uname)
       (tramp-send-command vec "set +H" t))
 
     ;; Disable tab expansion.
-    (if (string-match "BSD\\|Darwin" uname)
+    (if (string-match-p "BSD\\|Darwin" uname)
        (tramp-send-command vec "stty tabs" t)
       (tramp-send-command vec "stty tab0" t))
 
@@ -4397,7 +4408,7 @@ Goes through the list `tramp-local-coding-commands' and
                      (throw 'wont-work-remote nil)))
                  ;; Check if remote perl exists when necessary.
                  (when (and (symbolp rem-enc)
-                            (string-match "perl" (symbol-name rem-enc))
+                            (string-match-p "perl" (symbol-name rem-enc))
                             (not (tramp-get-remote-perl vec)))
                    (throw 'wont-work-remote nil))
                  ;; Check if remote encoding and decoding commands can be
@@ -4410,7 +4421,7 @@ Goes through the list `tramp-local-coding-commands' and
                  ;; it might change the permissions of /dev/null!
                  (when (not (stringp rem-enc))
                    (let ((name (symbol-name rem-enc)))
-                     (while (string-match (regexp-quote "-") name)
+                     (while (string-match "-" name)
                        (setq name (replace-match "_" nil t name)))
                      (tramp-maybe-send-script vec (symbol-value rem-enc) name)
                      (setq rem-enc name)))
@@ -4425,9 +4436,9 @@ Goes through the list `tramp-local-coding-commands' and
                    (let ((name (symbol-name rem-dec))
                          (value (symbol-value rem-dec))
                          tmpfile)
-                     (while (string-match (regexp-quote "-") name)
+                     (while (string-match "-" name)
                        (setq name (replace-match "_" nil t name)))
-                     (when (string-match "\\(^\\|[^%]\\)%t" value)
+                     (when (string-match-p "\\(^\\|[^%]\\)%t" value)
                        (setq tmpfile
                              (make-temp-name
                               (expand-file-name
@@ -4452,7 +4463,7 @@ Goes through the list `tramp-local-coding-commands' and
 
                  (with-current-buffer (tramp-get-buffer vec)
                    (goto-char (point-min))
-                   (unless (looking-at (regexp-quote magic))
+                   (unless (looking-at-p (regexp-quote magic))
                      (throw 'wont-work-remote nil)))
 
                  ;; `rem-enc' and `rem-dec' could be a string meanwhile.
@@ -4482,12 +4493,12 @@ means standard output and thus the current buffer), or 
nil (which
 means discard it)."
   (tramp-call-process
    nil tramp-encoding-shell
-   (when (and input (not (string-match "%s" cmd))) input)
+   (when (and input (not (string-match-p "%s" cmd))) input)
    (if (eq output t) t nil)
    nil
    tramp-encoding-command-switch
    (concat
-    (if (string-match "%s" cmd) (format cmd input) cmd)
+    (if (string-match-p "%s" cmd) (format cmd input) cmd)
     (if (stringp output) (concat " >" output) ""))))
 
 (defconst tramp-inline-compress-commands
@@ -4598,13 +4609,15 @@ Goes through the list `tramp-inline-compress-commands'."
            proxy (eval (nth 2 item)))
       (when (and
             ;; Host.
-            (string-match (or (eval (nth 0 item)) "")
-                          (or (tramp-file-name-host-port (car target-alist))
-                              ""))
+            (string-match-p
+             (or (eval (nth 0 item)) "")
+             (or (tramp-file-name-host-port (car target-alist))
+                 ""))
             ;; User.
-            (string-match (or (eval (nth 1 item)) "")
-                          (or (tramp-file-name-user-domain (car target-alist))
-                              "")))
+            (string-match-p
+             (or (eval (nth 1 item)) "")
+             (or (tramp-file-name-user-domain (car target-alist))
+                 "")))
        (if (null proxy)
            ;; No more hops needed.
            (setq choices nil)
@@ -4646,7 +4659,7 @@ Goes through the list `tramp-inline-compress-commands'."
               (member
                '("%h") (tramp-get-method-parameter item 'tramp-login-args))
               ;; The host name must match previous hop.
-              (string-match previous-host host))
+              (string-match-p previous-host host))
            (tramp-user-error
             item "Host name `%s' does not match `%s'" host previous-host))
          (setq previous-host (concat "^" (regexp-quote host) "$")))))
@@ -4879,7 +4892,7 @@ connection if a previous connection has died for some 
reason."
 
                    ;; Check, whether there is a restricted shell.
                    (dolist (elt tramp-restricted-shell-hosts-alist)
-                     (when (string-match elt current-host)
+                     (when (string-match-p elt current-host)
                        (setq r-shell t)))
                    (setq current-host l-host)
 
@@ -5121,82 +5134,85 @@ raises an error."
 Convert file mode bits to string and set virtual device number.
 Return ATTR."
   (when attr
-    ;; Remove color escape sequences from symlink.
-    (when (stringp (car attr))
-      (while (string-match tramp-display-escape-sequence-regexp (car attr))
-       (setcar attr (replace-match "" nil nil (car attr)))))
-    ;; Convert uid and gid.  Use `tramp-unknown-id-integer' as
-    ;; indication of unusable value.
-    (when (and (numberp (nth 2 attr)) (< (nth 2 attr) 0))
-      (setcar (nthcdr 2 attr) tramp-unknown-id-integer))
-    (when (and (floatp (nth 2 attr))
-               (<= (nth 2 attr) most-positive-fixnum))
-      (setcar (nthcdr 2 attr) (round (nth 2 attr))))
-    (when (and (numberp (nth 3 attr)) (< (nth 3 attr) 0))
-      (setcar (nthcdr 3 attr) tramp-unknown-id-integer))
-    (when (and (floatp (nth 3 attr))
-               (<= (nth 3 attr) most-positive-fixnum))
-      (setcar (nthcdr 3 attr) (round (nth 3 attr))))
-    ;; Convert last access time.
-    (unless (listp (nth 4 attr))
-      (setcar (nthcdr 4 attr) (seconds-to-time (nth 4 attr))))
-    ;; Convert last modification time.
-    (unless (listp (nth 5 attr))
-      (setcar (nthcdr 5 attr) (seconds-to-time (nth 5 attr))))
-    ;; Convert last status change time.
-    (unless (listp (nth 6 attr))
-      (setcar (nthcdr 6 attr) (seconds-to-time (nth 6 attr))))
-    ;; Convert file size.
-    (when (< (nth 7 attr) 0)
-      (setcar (nthcdr 7 attr) -1))
-    (when (and (floatp (nth 7 attr))
-               (<= (nth 7 attr) most-positive-fixnum))
-      (setcar (nthcdr 7 attr) (round (nth 7 attr))))
-    ;; Convert file mode bits to string.
-    (unless (stringp (nth 8 attr))
-      (setcar (nthcdr 8 attr) (tramp-file-mode-from-int (nth 8 attr)))
+    (save-match-data
+      ;; Remove color escape sequences from symlink.
       (when (stringp (car attr))
-        (aset (nth 8 attr) 0 ?l)))
-    ;; Convert directory indication bit.
-    (when (string-match "^d" (nth 8 attr))
-      (setcar attr t))
-    ;; Convert symlink from `tramp-do-file-attributes-with-stat'.
-    ;; Decode also multibyte string.
-    (when (consp (car attr))
-      (setcar attr
-             (and (stringp (caar attr))
-                  (string-match ".+ -> .\\(.+\\)." (caar attr))
-                  (decode-coding-string (match-string 1 (caar attr)) 'utf-8))))
-    ;; Set file's gid change bit.
-    (setcar (nthcdr 9 attr)
-            (if (numberp (nth 3 attr))
-                (not (= (nth 3 attr)
-                        (tramp-get-remote-gid vec 'integer)))
-              (not (string-equal
-                    (nth 3 attr)
-                    (tramp-get-remote-gid vec 'string)))))
-    ;; Convert inode.
-    (when (floatp (nth 10 attr))
-      (setcar (nthcdr 10 attr)
-              (condition-case nil
-                  (let ((high (nth 10 attr))
-                        middle low)
-                    (if (<= high most-positive-fixnum)
-                        (floor high)
-                      ;; The low 16 bits.
-                      (setq low (mod high #x10000)
-                            high (/ high #x10000))
+       (while (string-match tramp-display-escape-sequence-regexp (car attr))
+         (setcar attr (replace-match "" nil nil (car attr)))))
+      ;; Convert uid and gid.  Use `tramp-unknown-id-integer' as
+      ;; indication of unusable value.
+      (when (and (numberp (nth 2 attr)) (< (nth 2 attr) 0))
+       (setcar (nthcdr 2 attr) tramp-unknown-id-integer))
+      (when (and (floatp (nth 2 attr))
+                (<= (nth 2 attr) most-positive-fixnum))
+       (setcar (nthcdr 2 attr) (round (nth 2 attr))))
+      (when (and (numberp (nth 3 attr)) (< (nth 3 attr) 0))
+       (setcar (nthcdr 3 attr) tramp-unknown-id-integer))
+      (when (and (floatp (nth 3 attr))
+                (<= (nth 3 attr) most-positive-fixnum))
+       (setcar (nthcdr 3 attr) (round (nth 3 attr))))
+      ;; Convert last access time.
+      (unless (listp (nth 4 attr))
+       (setcar (nthcdr 4 attr) (seconds-to-time (nth 4 attr))))
+      ;; Convert last modification time.
+      (unless (listp (nth 5 attr))
+       (setcar (nthcdr 5 attr) (seconds-to-time (nth 5 attr))))
+      ;; Convert last status change time.
+      (unless (listp (nth 6 attr))
+       (setcar (nthcdr 6 attr) (seconds-to-time (nth 6 attr))))
+      ;; Convert file size.
+      (when (< (nth 7 attr) 0)
+       (setcar (nthcdr 7 attr) -1))
+      (when (and (floatp (nth 7 attr))
+                (<= (nth 7 attr) most-positive-fixnum))
+       (setcar (nthcdr 7 attr) (round (nth 7 attr))))
+      ;; Convert file mode bits to string.
+      (unless (stringp (nth 8 attr))
+       (setcar (nthcdr 8 attr) (tramp-file-mode-from-int (nth 8 attr)))
+       (when (stringp (car attr))
+          (aset (nth 8 attr) 0 ?l)))
+      ;; Convert directory indication bit.
+      (when (string-match-p "^d" (nth 8 attr))
+       (setcar attr t))
+      ;; Convert symlink from `tramp-do-file-attributes-with-stat'.
+      ;; Decode also multibyte string.
+      (when (consp (car attr))
+       (setcar attr
+               (and (stringp (caar attr))
+                    (string-match ".+ -> .\\(.+\\)." (caar attr))
+                    (decode-coding-string
+                     (match-string 1 (caar attr)) 'utf-8))))
+      ;; Set file's gid change bit.
+      (setcar (nthcdr 9 attr)
+              (if (numberp (nth 3 attr))
+                  (not (= (nth 3 attr)
+                          (tramp-get-remote-gid vec 'integer)))
+               (not (string-equal
+                      (nth 3 attr)
+                      (tramp-get-remote-gid vec 'string)))))
+      ;; Convert inode.
+      (when (floatp (nth 10 attr))
+       (setcar (nthcdr 10 attr)
+               (condition-case nil
+                    (let ((high (nth 10 attr))
+                          middle low)
                       (if (<= high most-positive-fixnum)
-                          (cons (floor high) (floor low))
-                        ;; The middle 24 bits.
-                        (setq middle (mod high #x1000000)
-                              high (/ high #x1000000))
-                        (cons (floor high) (cons (floor middle) (floor 
low))))))
-                ;; Inodes can be incredible huge.  We must hide this.
-                (error (tramp-get-inode vec)))))
-    ;; Set virtual device number.
-    (setcar (nthcdr 11 attr)
-            (tramp-get-device vec))
+                          (floor high)
+                       ;; The low 16 bits.
+                       (setq low (mod high #x10000)
+                              high (/ high #x10000))
+                       (if (<= high most-positive-fixnum)
+                            (cons (floor high) (floor low))
+                          ;; The middle 24 bits.
+                          (setq middle (mod high #x1000000)
+                               high (/ high #x1000000))
+                          (cons (floor high)
+                               (cons (floor middle) (floor low))))))
+                  ;; Inodes can be incredible huge.  We must hide this.
+                  (error (tramp-get-inode vec)))))
+      ;; Set virtual device number.
+      (setcar (nthcdr 11 attr)
+              (tramp-get-device vec)))
     attr))
 
 (defun tramp-shell-case-fold (string)
@@ -5216,9 +5232,9 @@ Return ATTR."
        (host (tramp-file-name-host vec))
        (localname
         (directory-file-name (tramp-file-name-unquote-localname vec))))
-    (when (string-match tramp-ipv6-regexp host)
+    (when (string-match-p tramp-ipv6-regexp host)
       (setq host (format "[%s]" host)))
-    (unless (string-match "ftp$" method)
+    (unless (string-match-p "ftp$" method)
       (setq localname (tramp-shell-quote-argument localname)))
     (cond
      ((tramp-get-method-parameter vec 'tramp-remote-copy-program)
@@ -5336,8 +5352,8 @@ Nonexistent directories are removed from spec."
       (with-current-buffer (tramp-get-connection-buffer vec)
        (while candidates
          (goto-char (point-min))
-         (if (string-match (format "^%s\r?$" (regexp-quote (car candidates)))
-                           (buffer-string))
+         (if (string-match-p (format "^%s\r?$" (regexp-quote (car candidates)))
+                             (buffer-string))
              (setq locale (car candidates)
                    candidates nil)
            (setq candidates (cdr candidates)))))
@@ -5408,7 +5424,7 @@ Nonexistent directories are removed from spec."
        vec (format "( %s / -nt / )" (tramp-get-test-command vec)))
        (with-current-buffer (tramp-get-buffer vec)
         (goto-char (point-min))
-        (when (looking-at (regexp-quote tramp-end-of-output))
+        (when (looking-at-p (regexp-quote tramp-end-of-output))
           (format "%s %%s -nt %%s" (tramp-get-test-command vec)))))
      (progn
        (tramp-send-command
@@ -5470,7 +5486,7 @@ Nonexistent directories are removed from spec."
              tmp (tramp-send-command-and-read
                   vec (format "%s -c '(\"%%N\" %%s)' /" result) 'noerror))
        (unless (and (listp tmp) (stringp (car tmp))
-                    (string-match "^\\(`/'\\|‘/’\\)$" (car tmp))
+                    (string-match-p "^\\(`/'\\|‘/’\\)$" (car tmp))
                     (integerp (cadr tmp)))
          (setq result nil)))
       result)))
@@ -5721,14 +5737,14 @@ function cell is returned to be applied on a buffer."
             (tramp-find-inline-encoding vec)
             (tramp-get-connection-property
              (tramp-get-connection-process vec) prop nil)))
-         (prop1 (if (string-match "encoding" prop)
+         (prop1 (if (string-match-p "encoding" prop)
                     "inline-compress" "inline-decompress"))
          compress)
       ;; The connection property might have been cached.  So we must
       ;; send the script to the remote side - maybe.
-      (when (and coding (symbolp coding) (string-match "remote" prop))
+      (when (and coding (symbolp coding) (string-match-p "remote" prop))
        (let ((name (symbol-name coding)))
-         (while (string-match (regexp-quote "-") name)
+         (while (string-match "-" name)
            (setq name (replace-match "_" nil t name)))
          (tramp-maybe-send-script vec (symbol-value coding) name)
          (setq coding name)))
@@ -5738,7 +5754,7 @@ function cell is returned to be applied on a buffer."
        ;; Return the value.
        (cond
         ((and compress (symbolp coding))
-         (if (string-match "decompress" prop1)
+         (if (string-match-p "decompress" prop1)
              `(lambda (beg end)
                 (,coding beg end)
                 (let ((coding-system-for-write 'binary)
@@ -5757,16 +5773,16 @@ function cell is returned to be applied on a buffer."
               (,coding (point-min) (point-max)))))
         ((symbolp coding)
          coding)
-        ((and compress (string-match "decoding" prop))
+        ((and compress (string-match-p "decoding" prop))
          (format
           ;; Windows shells need the program file name after
           ;; the pipe symbol be quoted if they use forward
           ;; slashes as directory separators.
           (cond
-           ((and (string-match "local" prop)
+           ((and (string-match-p "local" prop)
                  (memq system-type '(windows-nt)))
               "(%s | \"%s\")")
-           ((string-match "local" prop) "(%s | %s)")
+           ((string-match-p "local" prop) "(%s | %s)")
            (t "(%s | %s >%%s)"))
           coding compress))
         (compress
@@ -5774,14 +5790,14 @@ function cell is returned to be applied on a buffer."
           ;; Windows shells need the program file name after
           ;; the pipe symbol be quoted if they use forward
           ;; slashes as directory separators.
-          (if (and (string-match "local" prop)
+          (if (and (string-match-p "local" prop)
                    (memq system-type '(windows-nt)))
               "(%s <%%s | \"%s\")"
             "(%s <%%s | %s)")
           compress coding))
-        ((string-match "decoding" prop)
+        ((string-match-p "decoding" prop)
          (cond
-          ((string-match "local" prop) (format "%s" coding))
+          ((string-match-p "local" prop) (format "%s" coding))
           (t (format "%s >%%s" coding))))
         (t
          (format "%s <%%s" coding)))))))
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index d1a9228..5b7998a 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -677,7 +677,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
     (when match
       (setq result
            (delete nil
-                   (mapcar (lambda (x) (when (string-match match x) x))
+                   (mapcar (lambda (x) (when (string-match-p match x) x))
                            result))))
     ;; Append directory.
     (when full
@@ -728,10 +728,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       (widen)
       (tramp-message vec 10 "\n%s" (buffer-string))
       (goto-char (point-min))
-      (while (and (not (eobp)) (not (looking-at "^REVISION:")))
+      (while (and (not (eobp)) (not (looking-at-p "^REVISION:")))
        (forward-line)
        (delete-region (point-min) (point)))
-      (while (and (not (eobp)) (looking-at "^.+:.+"))
+      (while (and (not (eobp)) (looking-at-p "^.+:.+"))
        (forward-line))
       (delete-region (point) (point-max))
       (throw 'tramp-action 'ok))))
@@ -816,7 +816,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 
            ;; Check result.
            (when entry
-             (list (and (string-match "d" (nth 1 entry))
+             (list (and (string-match-p "d" (nth 1 entry))
                         t)              ;0 file type
                    -1                   ;1 link count
                    uid                  ;2 uid
@@ -933,15 +933,14 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
    filename
    (with-parsed-tramp-file-name (expand-file-name directory) nil
      (with-tramp-file-property v localname "file-name-all-completions"
-       (save-match-data
-        (delete-dups
-         (mapcar
-          (lambda (x)
-            (list
-             (if (string-match "d" (nth 1 x))
-                 (file-name-as-directory (nth 0 x))
-               (nth 0 x))))
-          (tramp-smb-get-file-entries directory))))))))
+       (delete-dups
+       (mapcar
+        (lambda (x)
+          (list
+           (if (string-match-p "d" (nth 1 x))
+               (file-name-as-directory (nth 0 x))
+             (nth 0 x))))
+        (tramp-smb-get-file-entries directory)))))))
 
 (defun tramp-smb-handle-file-system-info (filename)
   "Like `file-system-info' for Tramp files."
@@ -956,9 +955,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
          (goto-char (point-min))
          (forward-line)
          (when (looking-at
-                (concat "[[:space:]]*\\([[:digit:]]+\\)"
-                        " blocks of size \\([[:digit:]]+\\)"
-                        "\\. \\([[:digit:]]+\\) blocks available"))
+                (eval-when-compile
+                  (concat "[[:space:]]*\\([[:digit:]]+\\)"
+                          " blocks of size \\([[:digit:]]+\\)"
+                          "\\. \\([[:digit:]]+\\) blocks available")))
            (setq blocksize (string-to-number (match-string 2))
                  total (* blocksize (string-to-number (match-string 1)))
                  avail (* blocksize (string-to-number (match-string 3)))))
@@ -975,7 +975,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
 (defun tramp-smb-handle-file-writable-p (filename)
   "Like `file-writable-p' for Tramp files."
   (if (file-exists-p filename)
-      (string-match
+      (string-match-p
        "w"
        (or (tramp-compat-file-attribute-modes (file-attributes filename)) ""))
     (let ((dir (file-name-directory filename)))
@@ -1027,7 +1027,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
                     ;; Check for matching entries.
                     (mapcar
                      (lambda (x)
-                       (when (string-match
+                       (when (string-match-p
                               (format "^%s" base) (nth 0 x))
                          x))
                      entries)
@@ -1039,14 +1039,14 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
                (sort
                 entries
                 (lambda (x y)
-                  (if (string-match "t" switches)
+                  (if (string-match-p "t" switches)
                       ;; Sort by date.
                       (time-less-p (nth 3 y) (nth 3 x))
                     ;; Sort by name.
                     (string-lessp (nth 0 x) (nth 0 y))))))
 
          ;; Handle "-F" switch.
-         (when (string-match "F" switches)
+         (when (string-match-p "F" switches)
            (mapc
             (lambda (x)
               (when (not (zerop (length (car x))))
@@ -1075,7 +1075,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
                           (expand-file-name
                            (nth 0 x) (file-name-directory filename))
                           'string)))))
-                (when (string-match "l" switches)
+                (when (string-match-p "l" switches)
                   (insert
                    (format
                     "%10s %3d %-8s %-8s %8s %s "
@@ -1106,7 +1106,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
                   (put-text-property start (point) 'dired-filename t))
 
                 ;; Insert symlink.
-                (when (and (string-match "l" switches)
+                (when (and (string-match-p "l" switches)
                            (stringp (tramp-compat-file-attribute-type attr)))
                   (insert " -> " (tramp-compat-file-attribute-type attr))))
 
@@ -1121,18 +1121,17 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
   (unless (file-name-absolute-p dir)
     (setq dir (expand-file-name dir default-directory)))
   (with-parsed-tramp-file-name dir nil
-    (save-match-data
-      (let* ((ldir (file-name-directory dir)))
-       ;; Make missing directory parts.
-       (when (and parents
-                  (tramp-smb-get-share v)
-                  (not (file-directory-p ldir)))
-         (make-directory ldir parents))
-       ;; Just do it.
-       (when (file-directory-p ldir)
-         (make-directory-internal dir))
-       (unless (file-directory-p dir)
-         (tramp-error v 'file-error "Couldn't make directory %s" dir))))))
+    (let* ((ldir (file-name-directory dir)))
+      ;; Make missing directory parts.
+      (when (and parents
+                (tramp-smb-get-share v)
+                (not (file-directory-p ldir)))
+       (make-directory ldir parents))
+      ;; Just do it.
+      (when (file-directory-p ldir)
+       (make-directory-internal dir))
+      (unless (file-directory-p dir)
+       (tramp-error v 'file-error "Couldn't make directory %s" dir)))))
 
 (defun tramp-smb-handle-make-directory-internal (directory)
   "Like `make-directory-internal' for Tramp files."
@@ -1140,21 +1139,19 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
   (unless (file-name-absolute-p directory)
     (setq directory (expand-file-name directory default-directory)))
   (with-parsed-tramp-file-name directory nil
-    (save-match-data
-      (let* ((file (tramp-smb-get-localname v)))
-       (when (file-directory-p (file-name-directory directory))
-         (tramp-smb-send-command
-          v
-          (if (tramp-smb-get-cifs-capabilities v)
-              (format "posix_mkdir \"%s\" %o" file (default-file-modes))
-            (format "mkdir \"%s\"" file)))
-         ;; We must also flush the cache of the directory, because
-         ;; `file-attributes' reads the values from there.
-         (tramp-flush-file-properties v (file-name-directory localname))
-         (tramp-flush-file-properties v localname))
-       (unless (file-directory-p directory)
-         (tramp-error
-          v 'file-error "Couldn't make directory %s" directory))))))
+    (let* ((file (tramp-smb-get-localname v)))
+      (when (file-directory-p (file-name-directory directory))
+       (tramp-smb-send-command
+        v
+        (if (tramp-smb-get-cifs-capabilities v)
+            (format "posix_mkdir \"%s\" %o" file (default-file-modes))
+          (format "mkdir \"%s\"" file)))
+       ;; We must also flush the cache of the directory, because
+       ;; `file-attributes' reads the values from there.
+       (tramp-flush-file-properties v (file-name-directory localname))
+       (tramp-flush-file-properties v localname))
+      (unless (file-directory-p directory)
+       (tramp-error v 'file-error "Couldn't make directory %s" directory)))))
 
 (defun tramp-smb-handle-make-symbolic-link
   (target linkname &optional ok-if-already-exists)
@@ -1510,7 +1507,7 @@ component is used as the target of the symlink."
 
        ;; Save exit.
        (with-current-buffer (tramp-get-connection-buffer v)
-         (if (string-match tramp-temp-buffer-name (buffer-name))
+         (if (string-match-p tramp-temp-buffer-name (buffer-name))
              (progn
                (set-process-buffer (tramp-get-connection-process v) nil)
                (kill-buffer (current-buffer)))
@@ -1621,7 +1618,7 @@ If VEC has no cifs capabilities, exchange \"/\" by 
\"\\\\\"."
 
       ;; A period followed by a space, or trailing periods and spaces,
       ;; are not supported.
-      (when (string-match "\\. \\|\\.$\\| $" localname)
+      (when (string-match-p "\\. \\|\\.$\\| $" localname)
        (tramp-error
         vec 'file-error
         "Invalid file name %s" (tramp-make-tramp-file-name vec localname)))
@@ -1775,7 +1772,7 @@ Result is the list (LOCALNAME MODE SIZE MTIME)."
          (cl-return))
 
        ;; weekday.
-       (if (string-match "\\(\\w+\\)$" line)
+       (if (string-match-p "\\(\\w+\\)$" line)
            (setq line (substring line 0 -5))
          (cl-return))
 
@@ -2086,7 +2083,6 @@ Returns nil if an error message has appeared."
 
 (defun tramp-smb-call-winexe (vec)
   "Apply a remote command, if possible, using `tramp-smb-winexe-program'."
-
   ;; Check for program.
   (unless (executable-find tramp-smb-winexe-program)
     (tramp-error
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index ab30a43..02870fa 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -1290,8 +1290,8 @@ This is METHOD, if non-nil. Otherwise, do a lookup in
                   lmethod item)
               (while choices
                 (setq item (pop choices))
-                (when (and (string-match (or (nth 0 item) "") (or host ""))
-                           (string-match (or (nth 1 item) "") (or user "")))
+                (when (and (string-match-p (or (nth 0 item) "") (or host ""))
+                           (string-match-p (or (nth 1 item) "") (or user "")))
                   (setq lmethod (nth 2 item))
                   (setq choices nil)))
               lmethod)
@@ -1311,8 +1311,8 @@ This is USER, if non-nil. Otherwise, do a lookup in
                   luser item)
               (while choices
                 (setq item (pop choices))
-                (when (and (string-match (or (nth 0 item) "") (or method ""))
-                           (string-match (or (nth 1 item) "") (or host "")))
+                (when (and (string-match-p (or (nth 0 item) "") (or method ""))
+                           (string-match-p (or (nth 1 item) "") (or host "")))
                   (setq luser (nth 2 item))
                   (setq choices nil)))
               luser)
@@ -1332,8 +1332,8 @@ This is HOST, if non-nil. Otherwise, do a lookup in
                   lhost item)
               (while choices
                 (setq item (pop choices))
-                (when (and (string-match (or (nth 0 item) "") (or method ""))
-                           (string-match (or (nth 1 item) "") (or user "")))
+                (when (and (string-match-p (or (nth 0 item) "") (or method ""))
+                           (string-match-p (or (nth 1 item) "") (or user "")))
                   (setq lhost (nth 2 item))
                   (setq choices nil)))
               lhost)
@@ -1381,7 +1381,7 @@ default values are used."
            (setq v (tramp-dissect-hop-name hop)
                  hop (and hop (tramp-make-tramp-hop-name v))))
          (let ((tramp-default-host
-                (or (and v (not (string-match "%h" (tramp-file-name-host v)))
+                (or (and v (not (string-match-p "%h" (tramp-file-name-host v)))
                          (tramp-file-name-host v))
                     tramp-default-host)))
            (setq method (tramp-find-method method user host)
@@ -1481,7 +1481,7 @@ the form (METHOD USER DOMAIN HOST PORT LOCALNAME 
&optional HOP)."
            (unless (zerop (length user))
              tramp-postfix-user-format)
            (when host
-             (if (string-match tramp-ipv6-regexp host)
+             (if (string-match-p tramp-ipv6-regexp host)
                  (concat
                   tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
                host))
@@ -1510,7 +1510,7 @@ necessary only.  This function will be used in file name 
completion."
            (concat user tramp-postfix-user-format))
          (unless (zerop (length host))
            (concat
-            (if (string-match tramp-ipv6-regexp host)
+            (if (string-match-p tramp-ipv6-regexp host)
                 (concat
                  tramp-prefix-ipv6-format host tramp-postfix-ipv6-format)
               host)
@@ -1655,22 +1655,23 @@ ARGUMENTS to actually emit the message (if applicable)."
            (setq fn (symbol-name btf))
            (unless
                (and
-                (string-match "^tramp" fn)
+                (string-match-p "^tramp" fn)
                 (not
-                 (string-match
-                  (concat
-                   "^"
-                   (regexp-opt
-                    '("tramp-backtrace"
-                      "tramp-compat-funcall"
-                      "tramp-condition-case-unless-debug"
-                      "tramp-debug-message"
-                      "tramp-error"
-                      "tramp-error-with-buffer"
-                      "tramp-message"
-                      "tramp-user-error")
-                    t)
-                   "$")
+                 (string-match-p
+                  (eval-when-compile
+                    (concat
+                     "^"
+                     (regexp-opt
+                      '("tramp-backtrace"
+                        "tramp-compat-funcall"
+                        "tramp-condition-case-unless-debug"
+                        "tramp-debug-message"
+                        "tramp-error"
+                        "tramp-error-with-buffer"
+                        "tramp-message"
+                        "tramp-user-error")
+                      t)
+                     "$"))
                   fn)))
              (setq fn nil)))
          (setq btn (1+ btn))))
@@ -1708,39 +1709,37 @@ control string and the remaining ARGUMENTS to actually 
emit the message (if
 applicable)."
   (ignore-errors
     (when (<= level tramp-verbose)
-      ;; Match data must be preserved!
-      (save-match-data
-       ;; Display only when there is a minimum level.
-       (when (and tramp-message-show-message (<= level 3))
-         (apply 'message
-                (concat
-                 (cond
-                  ((= level 0) "")
-                  ((= level 1) "")
-                  ((= level 2) "Warning: ")
-                  (t           "Tramp: "))
-                 fmt-string)
-                arguments))
-       ;; Log only when there is a minimum level.
-       (when (>= tramp-verbose 4)
-         (let ((tramp-verbose 0))
-           ;; Append connection buffer for error messages.
-           (when (= level 1)
-             (with-current-buffer
-                 (if (processp vec-or-proc)
-                     (process-buffer vec-or-proc)
-                   (tramp-get-connection-buffer vec-or-proc))
-               (setq fmt-string (concat fmt-string "\n%s")
-                     arguments (append arguments (list (buffer-string))))))
-           ;; Translate proc to vec.
-           (when (processp vec-or-proc)
-             (setq vec-or-proc (process-get vec-or-proc 'vector))))
-         ;; Do it.
-         (when (tramp-file-name-p vec-or-proc)
-           (apply 'tramp-debug-message
-                  vec-or-proc
-                  (concat (format "(%d) # " level) fmt-string)
-                  arguments)))))))
+      ;; Display only when there is a minimum level.
+      (when (and tramp-message-show-message (<= level 3))
+       (apply 'message
+              (concat
+               (cond
+                ((= level 0) "")
+                ((= level 1) "")
+                ((= level 2) "Warning: ")
+                (t           "Tramp: "))
+               fmt-string)
+              arguments))
+      ;; Log only when there is a minimum level.
+      (when (>= tramp-verbose 4)
+       (let ((tramp-verbose 0))
+         ;; Append connection buffer for error messages.
+         (when (= level 1)
+           (with-current-buffer
+               (if (processp vec-or-proc)
+                   (process-buffer vec-or-proc)
+                 (tramp-get-connection-buffer vec-or-proc))
+             (setq fmt-string (concat fmt-string "\n%s")
+                   arguments (append arguments (list (buffer-string))))))
+         ;; Translate proc to vec.
+         (when (processp vec-or-proc)
+           (setq vec-or-proc (process-get vec-or-proc 'vector))))
+       ;; Do it.
+       (when (tramp-file-name-p vec-or-proc)
+         (apply 'tramp-debug-message
+                vec-or-proc
+                (concat (format "(%d) # " level) fmt-string)
+                arguments))))))
 
 (defsubst tramp-backtrace (&optional vec-or-proc)
   "Dump a backtrace into the debug buffer.
@@ -1884,7 +1883,7 @@ If VAR is nil, then we bind `v' to the structure and 
`method', `user',
   "Report progress of an operation for Tramp."
   (let* ((parameters (cdr reporter))
         (message (aref parameters 3)))
-    (when (string-match message (or (current-message) ""))
+    (when (string-match-p message (or (current-message) ""))
       (progress-reporter-update reporter value))))
 
 (defmacro with-tramp-progress-reporter (vec level message &rest body)
@@ -1979,7 +1978,6 @@ Example:
      \"ssh\"
      \\='((tramp-parse-sconfig \"/etc/ssh_config\")
        (tramp-parse-sconfig \"~/.ssh/config\")))"
-
   (let ((r function-list)
        (v function-list))
     (setq tramp-completion-function-alist
@@ -1994,13 +1992,13 @@ Example:
       (unless (and (functionp (nth 0 (car v)))
                   (cond
                    ;; Windows registry.
-                   ((string-match "^HKEY_CURRENT_USER" (nth 1 (car v)))
+                   ((string-match-p "^HKEY_CURRENT_USER" (nth 1 (car v)))
                     (and (memq system-type '(cygwin windows-nt))
                          (zerop
                           (tramp-call-process
                            v "reg" nil nil nil "query" (nth 1 (car v))))))
                    ;; Zeroconf service type.
-                   ((string-match
+                   ((string-match-p
                      "^_[[:alpha:]]+\\._[[:alpha:]]+$" (nth 1 (car v))))
                    ;; Configuration file.
                    (t (file-exists-p (nth 1 (car v))))))
@@ -2077,7 +2075,7 @@ been set up by `rfn-eshadow-setup-minibuffer'."
        (save-excursion
          (save-restriction
            (narrow-to-region
-            (1+ (or (string-match
+            (1+ (or (string-match-p
                      (tramp-rfn-eshadow-update-overlay-regexp)
                      (buffer-string) end)
                     end))
@@ -2145,7 +2143,7 @@ expression, which matches more than the file name suffix, 
the
 coding system might not be determined.  This function repairs it."
   (let (result)
     (dolist (elt file-coding-system-alist (nreverse result))
-      (when (and (consp elt) (string-match (car elt) filename))
+      (when (and (consp elt) (string-match-p (car elt) filename))
        ;; We found a matching entry in `file-coding-system-alist'.
        ;; So we add a similar entry, but with the temporary file name
        ;; as regexp.
@@ -2217,18 +2215,16 @@ ARGS are the arguments OPERATION has been called with."
              ;; file name to be checked.  Handled properly in
              ;; `tramp-handle-*-make-symbolic-link'.
              file-newer-than-file-p make-symbolic-link rename-file))
-    (save-match-data
-      (cond
-       ((tramp-tramp-file-p (nth 0 args)) (nth 0 args))
-       ((tramp-tramp-file-p (nth 1 args)) (nth 1 args))
-       (t default-directory))))
+    (cond
+     ((tramp-tramp-file-p (nth 0 args)) (nth 0 args))
+     ((tramp-tramp-file-p (nth 1 args)) (nth 1 args))
+     (t default-directory)))
    ;; FILE DIRECTORY resp FILE1 FILE2.
    ((eq operation 'expand-file-name)
-    (save-match-data
-      (cond
-       ((file-name-absolute-p (nth 0 args)) (nth 0 args))
-       ((tramp-tramp-file-p (nth 1 args)) (nth 1 args))
-       (t default-directory))))
+    (cond
+     ((file-name-absolute-p (nth 0 args)) (nth 0 args))
+     ((tramp-tramp-file-p (nth 1 args)) (nth 1 args))
+     (t default-directory)))
    ;; START END FILE.
    ((eq operation 'write-region)
     (if (file-name-absolute-p (nth 2 args))
@@ -2464,7 +2460,7 @@ remote file names."
      (lambda (atom)
        (when (and (functionp atom)
                  (autoloadp (symbol-function atom))
-                 (string-match files-regexp (cadr (symbol-function atom))))
+                 (string-match-p files-regexp (cadr (symbol-function atom))))
         (ignore-errors
           (setf (cadr (symbol-function atom))
                 (expand-file-name (cadr (symbol-function atom)) dir))))))))
@@ -2589,7 +2585,6 @@ not in completion mode."
 ;; completions.
 (defun tramp-completion-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for partial Tramp files."
-
   (let ((fullname
         (tramp-drop-volume-letter (expand-file-name filename directory)))
        hop result result1)
@@ -2686,7 +2681,6 @@ not in completion mode."
 (defun tramp-completion-dissect-file-name (name)
   "Returns a list of `tramp-file-name' structures.
 They are collected by `tramp-completion-dissect-file-name1'."
-
   (let* ((x-nil "\\|\\(\\)")
         (tramp-completion-ipv6-regexp
          (format
@@ -2761,7 +2755,6 @@ They are collected by 
`tramp-completion-dissect-file-name1'."
   "Returns a `tramp-file-name' structure matching STRUCTURE.
 The structure consists of remote method, remote user,
 remote host and localname (filename on remote host)."
-
   (save-match-data
     (when (string-match (nth 0 structure) name)
       (make-tramp-file-name
@@ -2779,7 +2772,7 @@ remote host and localname (filename on remote host)."
   (mapcar
    (lambda (method)
      (and method
-         (string-match (concat "^" (regexp-quote partial-method)) method)
+         (string-match-p (concat "^" (regexp-quote partial-method)) method)
          (tramp-completion-make-tramp-file-name method nil nil nil)))
    (mapcar 'car tramp-methods)))
 
@@ -2792,7 +2785,7 @@ PARTIAL-USER must match USER, PARTIAL-HOST must match 
HOST."
 
    ((and partial-user partial-host)
     (if        (and host
-            (string-match (concat "^" (regexp-quote partial-host)) host)
+            (string-match-p (concat "^" (regexp-quote partial-host)) host)
             (string-equal partial-user (or user partial-user)))
        (setq user partial-user)
       (setq user nil
@@ -2801,13 +2794,15 @@ PARTIAL-USER must match USER, PARTIAL-HOST must match 
HOST."
    (partial-user
     (setq host nil)
     (unless
-       (and user (string-match (concat "^" (regexp-quote partial-user)) user))
+       (and user
+            (string-match-p (concat "^" (regexp-quote partial-user)) user))
       (setq user nil)))
 
    (partial-host
     (setq user nil)
     (unless
-       (and host (string-match (concat "^" (regexp-quote partial-host)) host))
+       (and host
+            (string-match-p (concat "^" (regexp-quote partial-host)) host))
       (setq host nil)))
 
    (t (setq user nil
@@ -3086,7 +3081,7 @@ User is always nil."
 
       (while temp
        (setq item (directory-file-name (pop temp)))
-       (when (or (null match) (string-match match item))
+       (when (or (null match) (string-match-p match item))
          (push (if full (concat directory item) item)
                result)))
       (if nosort result (sort result 'string<)))))
@@ -3188,7 +3183,7 @@ User is always nil."
                  ;; Check, whether we find an existing file with
                  ;; lower case letters.  This avoids us to create a
                  ;; temporary file.
-                 (while (and (string-match
+                 (while (and (string-match-p
                               "[a-z]" (file-remote-p candidate 'localname))
                              (not (file-exists-p candidate)))
                    (setq candidate
@@ -3199,7 +3194,7 @@ User is always nil."
                  ;; to Emacs 26+ like `file-name-case-insensitive-p',
                  ;; so there is no compatibility problem calling it.
                  (unless
-                     (string-match
+                     (string-match-p
                       "[a-z]" (file-remote-p candidate 'localname))
                    (setq tmpfile
                          (let ((default-directory
@@ -3229,7 +3224,7 @@ User is always nil."
          (not
           (and
            completion-ignored-extensions
-           (string-match
+           (string-match-p
             (concat (regexp-opt completion-ignored-extensions 'paren) "$") x)
            ;; We remember the hit.
            (push x hits-ignored-extensions))))))
@@ -3346,7 +3341,7 @@ User is always nil."
              (tramp-error
               v1 'file-error
               "Maximum number (%d) of symlinks exceeded" numchase-limit)))
-         (file-local-name (directory-file-name result))))))))
+         (file-remote-p (directory-file-name result) 'localname)))))))
 
 (defun tramp-handle-find-backup-file-name (filename)
   "Like `find-backup-file-name' for Tramp files."
@@ -3383,7 +3378,7 @@ User is always nil."
         (list filename switches wildcard full-directory-p))
        ;; `ls-lisp' always returns full listings.  We must remove
        ;; superfluous parts.
-       (unless (string-match "l" switches)
+       (unless (string-match-p "l" switches)
          (save-excursion
            (goto-char (point-min))
            (while (setq start
@@ -3527,7 +3522,7 @@ User is always nil."
       ;; The first condition is always true for absolute file names.
       ;; Included for safety's sake.
       (unless (or (file-name-directory file)
-                 (string-match "\\.elc?\\'" file))
+                 (string-match-p "\\.elc?\\'" file))
        (tramp-error
         v 'file-error
         "File `%s' does not include a `.el' or `.elc' suffix" file)))
@@ -3562,7 +3557,7 @@ support symbolic links."
 (defun tramp-handle-shell-command
   (command &optional output-buffer error-buffer)
   "Like `shell-command' for Tramp files."
-  (let* ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command))
+  (let* ((asynchronous (string-match-p "[ \t]*&[ \t]*\\'" command))
         ;; We cannot use `shell-file-name' and `shell-command-switch',
         ;; they are variables of the local host.
         (args (append
@@ -3809,7 +3804,7 @@ Send \"yes\" to remote process on confirmation, abort 
otherwise.
 See also `tramp-action-yn'."
   (save-window-excursion
     (let ((enable-recursive-minibuffers t))
-      (save-match-data (pop-to-buffer (tramp-get-connection-buffer vec)))
+      (pop-to-buffer (tramp-get-connection-buffer vec))
       (unless (yes-or-no-p (match-string 0))
        (kill-process proc)
        (throw 'tramp-action 'permission-denied))
@@ -3823,7 +3818,7 @@ Send \"y\" to remote process on confirmation, abort 
otherwise.
 See also `tramp-action-yesno'."
   (save-window-excursion
     (let ((enable-recursive-minibuffers t))
-      (save-match-data (pop-to-buffer (tramp-get-connection-buffer vec)))
+      (pop-to-buffer (tramp-get-connection-buffer vec))
       (unless (y-or-n-p (match-string 0))
        (kill-process proc)
        (throw 'tramp-action 'permission-denied))
@@ -3933,9 +3928,10 @@ connection buffer."
              (tramp-get-connection-buffer vec)))
            ((eq exit 'process-died)
              (substitute-command-keys
-              (concat
-               "Tramp failed to connect.  If this happens repeatedly, try\n"
-               "    `\\[tramp-cleanup-this-connection]'")))
+             (eval-when-compile
+               (concat
+                "Tramp failed to connect.  If this happens repeatedly, try\n"
+                "    `\\[tramp-cleanup-this-connection]'"))))
            ((eq exit 'timeout)
             (format-message
              "Timeout reached, see buffer `%s' for details"
@@ -4119,53 +4115,52 @@ would yield t.  On the other hand, the following check 
results in nil:
          (other-read (aref mode-chars 7))
          (other-write (aref mode-chars 8))
          (other-execute-or-sticky (aref mode-chars 9)))
-    (save-match-data
-      (logior
-       (cond
-       ((char-equal owner-read ?r) (string-to-number "00400" 8))
-       ((char-equal owner-read ?-) 0)
-       (t (error "Second char `%c' must be one of `r-'" owner-read)))
-       (cond
-       ((char-equal owner-write ?w) (string-to-number "00200" 8))
-       ((char-equal owner-write ?-) 0)
-       (t (error "Third char `%c' must be one of `w-'" owner-write)))
-       (cond
-       ((char-equal owner-execute-or-setid ?x) (string-to-number "00100" 8))
-       ((char-equal owner-execute-or-setid ?S) (string-to-number "04000" 8))
-       ((char-equal owner-execute-or-setid ?s) (string-to-number "04100" 8))
-       ((char-equal owner-execute-or-setid ?-) 0)
-       (t (error "Fourth char `%c' must be one of `xsS-'"
-                 owner-execute-or-setid)))
-       (cond
-       ((char-equal group-read ?r) (string-to-number "00040" 8))
-       ((char-equal group-read ?-) 0)
-       (t (error "Fifth char `%c' must be one of `r-'" group-read)))
-       (cond
-       ((char-equal group-write ?w) (string-to-number "00020" 8))
-       ((char-equal group-write ?-) 0)
-       (t (error "Sixth char `%c' must be one of `w-'" group-write)))
-       (cond
-       ((char-equal group-execute-or-setid ?x) (string-to-number "00010" 8))
-       ((char-equal group-execute-or-setid ?S) (string-to-number "02000" 8))
-       ((char-equal group-execute-or-setid ?s) (string-to-number "02010" 8))
-       ((char-equal group-execute-or-setid ?-) 0)
-       (t (error "Seventh char `%c' must be one of `xsS-'"
-                 group-execute-or-setid)))
-       (cond
-       ((char-equal other-read ?r) (string-to-number "00004" 8))
-       ((char-equal other-read ?-) 0)
-       (t (error "Eighth char `%c' must be one of `r-'" other-read)))
-       (cond
-       ((char-equal other-write ?w) (string-to-number "00002" 8))
-       ((char-equal other-write ?-) 0)
-       (t (error "Ninth char `%c' must be one of `w-'" other-write)))
-       (cond
-       ((char-equal other-execute-or-sticky ?x) (string-to-number "00001" 8))
-       ((char-equal other-execute-or-sticky ?T) (string-to-number "01000" 8))
-       ((char-equal other-execute-or-sticky ?t) (string-to-number "01001" 8))
-       ((char-equal other-execute-or-sticky ?-) 0)
-       (t (error "Tenth char `%c' must be one of `xtT-'"
-                 other-execute-or-sticky)))))))
+    (logior
+     (cond
+      ((char-equal owner-read ?r) (string-to-number "00400" 8))
+      ((char-equal owner-read ?-) 0)
+      (t (error "Second char `%c' must be one of `r-'" owner-read)))
+     (cond
+      ((char-equal owner-write ?w) (string-to-number "00200" 8))
+      ((char-equal owner-write ?-) 0)
+      (t (error "Third char `%c' must be one of `w-'" owner-write)))
+     (cond
+      ((char-equal owner-execute-or-setid ?x) (string-to-number "00100" 8))
+      ((char-equal owner-execute-or-setid ?S) (string-to-number "04000" 8))
+      ((char-equal owner-execute-or-setid ?s) (string-to-number "04100" 8))
+      ((char-equal owner-execute-or-setid ?-) 0)
+      (t (error "Fourth char `%c' must be one of `xsS-'"
+               owner-execute-or-setid)))
+     (cond
+      ((char-equal group-read ?r) (string-to-number "00040" 8))
+      ((char-equal group-read ?-) 0)
+      (t (error "Fifth char `%c' must be one of `r-'" group-read)))
+     (cond
+      ((char-equal group-write ?w) (string-to-number "00020" 8))
+      ((char-equal group-write ?-) 0)
+      (t (error "Sixth char `%c' must be one of `w-'" group-write)))
+     (cond
+      ((char-equal group-execute-or-setid ?x) (string-to-number "00010" 8))
+      ((char-equal group-execute-or-setid ?S) (string-to-number "02000" 8))
+      ((char-equal group-execute-or-setid ?s) (string-to-number "02010" 8))
+      ((char-equal group-execute-or-setid ?-) 0)
+      (t (error "Seventh char `%c' must be one of `xsS-'"
+               group-execute-or-setid)))
+     (cond
+      ((char-equal other-read ?r) (string-to-number "00004" 8))
+      ((char-equal other-read ?-) 0)
+      (t (error "Eighth char `%c' must be one of `r-'" other-read)))
+     (cond
+      ((char-equal other-write ?w) (string-to-number "00002" 8))
+      ((char-equal other-write ?-) 0)
+      (t (error "Ninth char `%c' must be one of `w-'" other-write)))
+     (cond
+      ((char-equal other-execute-or-sticky ?x) (string-to-number "00001" 8))
+      ((char-equal other-execute-or-sticky ?T) (string-to-number "01000" 8))
+      ((char-equal other-execute-or-sticky ?t) (string-to-number "01001" 8))
+      ((char-equal other-execute-or-sticky ?-) 0)
+      (t (error "Tenth char `%c' must be one of `xtT-'"
+               other-execute-or-sticky))))))
 
 (defconst tramp-file-mode-type-map
   '((0  . "-")  ; Normal file (SVID-v2 and XPG2)
@@ -4246,8 +4241,9 @@ VEC is used for tracing."
                                  nil "locale" nil t nil "-a"))))
          (while candidates
            (goto-char (point-min))
-           (if (string-match (format "^%s\r?$" (regexp-quote (car candidates)))
-                             (buffer-string))
+           (if (string-match-p
+                (format "^%s\r?$" (regexp-quote (car candidates)))
+                (buffer-string))
                (setq locale (car candidates)
                      candidates nil)
              (setq candidates (cdr candidates))))))
@@ -4324,7 +4320,7 @@ This handles also chrooted environments, which are not 
regarded as local."
        (port (tramp-file-name-port vec)))
     (and
      (stringp tramp-local-host-regexp) (stringp host)
-     (string-match tramp-local-host-regexp host)
+     (string-match-p tramp-local-host-regexp host)
      ;; A port is an indication for an ssh tunnel or alike.
      (null port)
      ;; The method shall be applied to one of the shell file name



reply via email to

[Prev in Thread] Current Thread [Next in Thread]