* net/tramp.el (tramp-find-file-name-coding-system-alist): New

defun.
(tramp-handle-insert-file-contents, tramp-handle-write-region):
Use it.
This commit is contained in:
Michael Albinus 2008-04-09 20:17:27 +00:00
parent c7ffd3f84e
commit 9116dfe647

View file

@ -3888,6 +3888,21 @@ This will break if COMMAND prints a newline, followed by the value of
(t (tramp-make-tramp-file-name
multi-method method user host "")))))))
(defun tramp-find-file-name-coding-system-alist (filename tmpname)
"Like `find-operation-coding-system' for Tramp filenames.
Tramp's `insert-file-contents' and `write-region' work over
temporary file names. If `file-coding-system-alist' contains an
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 result)
(when (and (consp elt) (string-match (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.
(add-to-list
'result (cons (regexp-quote tmpname) (cdr elt)) 'append)))))
(defun tramp-handle-insert-file-contents
(filename &optional visit beg end replace)
"Like `insert-file-contents' for tramp files."
@ -3916,14 +3931,18 @@ This will break if COMMAND prints a newline, followed by the value of
(tramp-message-for-buffer
multi-method method user host
9 "Inserting local temp file `%s'..." local-copy)
(setq result (insert-file-contents local-copy nil beg end replace))
(when visit
(setq buffer-file-name filename)
(set-visited-file-modtime)
(set-buffer-modified-p nil))
;; Now `last-coding-system-used' has right value. Remember it.
(when (boundp 'last-coding-system-used)
(setq coding-system-used (symbol-value 'last-coding-system-used)))
;; We must ensure that `file-coding-system-alist' matches
;; `local-copy'.
(let ((file-coding-system-alist
(tramp-find-file-name-coding-system-alist filename local-copy)))
(setq result (insert-file-contents local-copy nil beg end replace))
(when visit
(setq buffer-file-name filename)
(set-visited-file-modtime)
(set-buffer-modified-p nil))
;; Now `last-coding-system-used' has right value. Remember it.
(when (boundp 'last-coding-system-used)
(setq coding-system-used (symbol-value 'last-coding-system-used))))
(tramp-message-for-buffer
multi-method method user host
9 "Inserting local temp file `%s'...done" local-copy)
@ -4072,17 +4091,20 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
;; Set current buffer. If connection wasn't open, `file-modes' has
;; changed it accidently.
(set-buffer curbuf)
;; We say `no-message' here because we don't want the visited file
;; modtime data to be clobbered from the temp file. We call
;; `set-visited-file-modtime' ourselves later on.
(tramp-run-real-handler
'write-region
(if confirm ; don't pass this arg unless defined for backward compat.
(list start end tmpfil append 'no-message lockname confirm)
(list start end tmpfil append 'no-message lockname)))
;; Now, `last-coding-system-used' has the right value. Remember it.
(when (boundp 'last-coding-system-used)
(setq coding-system-used (symbol-value 'last-coding-system-used)))
;; We say `no-message' here because we don't want the visited
;; file modtime data to be clobbered from the temp file. We
;; call `set-visited-file-modtime' ourselves later on. We must
;; ensure that `file-coding-system-alist' matches `tmpfil'.
(let ((file-coding-system-alist
(tramp-find-file-name-coding-system-alist filename tmpfil)))
(tramp-run-real-handler
'write-region
(if confirm ; don't pass this arg unless defined for backward compat.
(list start end tmpfil append 'no-message lockname confirm)
(list start end tmpfil append 'no-message lockname)))
;; Now, `last-coding-system-used' has the right value. Remember it.
(when (boundp 'last-coding-system-used)
(setq coding-system-used (symbol-value 'last-coding-system-used))))
;; The permissions of the temporary file should be set. If
;; filename does not exist (eq modes nil) it has been renamed to
;; the backup file. This case `save-buffer' handles