# HG changeset patch # User Michael Albinus # Date 1207772247 0 # Node ID 1b9faa405c59d5bd61a3c74fc4fb02095e472c5f # Parent 2d8979bd10ffc9b585e43a2155783c6a949d8840 * net/tramp.el (tramp-find-file-name-coding-system-alist): New defun. (tramp-handle-insert-file-contents, tramp-handle-write-region): Use it. diff -r 2d8979bd10ff -r 1b9faa405c59 lisp/net/tramp.el --- a/lisp/net/tramp.el Wed Apr 09 08:11:58 2008 +0000 +++ b/lisp/net/tramp.el Wed Apr 09 20:17:27 2008 +0000 @@ -3888,6 +3888,21 @@ (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 @@ (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 @@ ;; 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