]> git.eshelyaron.com Git - emacs.git/commitdiff
(recode-file-name): New function.
authorKenichi Handa <handa@m17n.org>
Wed, 26 Mar 2003 04:42:29 +0000 (04:42 +0000)
committerKenichi Handa <handa@m17n.org>
Wed, 26 Mar 2003 04:42:29 +0000 (04:42 +0000)
lisp/files.el

index acfea07992f5c46d5351a23e9308776bbbca2972..9216a6b2bf1c238dfff3354339db3f45d4a867cc 100644 (file)
@@ -766,6 +766,58 @@ unlike `file-truename'."
        (setq newname (expand-file-name tem (file-name-directory newname)))
        (setq count (1- count))))
     newname))
+
+(defun recode-file-name (file coding new-coding &optional ok-if-already-exists)
+  "Change the encoding of FILE's name from CODING to NEW-CODING.
+The value is a new name of FILE.
+Signals a `file-already-exists' error if a file of the new name
+already exists unless optional third argument OK-IF-ALREADY-EXISTS
+is non-nil.  A number as third arg means request confirmation if
+the new name already exists.  This is what happens in interactive
+use with M-x."
+  (interactive
+   (let ((default-coding (or file-name-coding-system
+                            default-file-name-coding-system))
+        (filename (read-file-name "Recode filename: " nil nil t))
+        from-coding to-coding)
+     (if (and default-coding
+             ;; We provide the default coding only when it seems that
+             ;; the filename is correctly decoded by the default
+             ;; coding.
+             (let ((charsets (find-charset-string filename)))
+               (and (not (memq 'eight-bit-control charsets))
+                    (not (memq 'eight-bit-graphic charsets)))))
+        (setq from-coding (read-coding-system
+                           (format "Recode filename %s from (default %s): "
+                                   filename default-coding)
+                           default-coding))
+       (setq from-coding (read-coding-system
+                         (format "Recode filename %s from: " filename))))
+     
+     ;; We provide the default coding only when a user is going to
+     ;; change the encoding not from the default coding.
+     (if (eq from-coding default-coding)
+        (setq to-coding (read-coding-system
+                         (format "Recode filename %s from %s to: "
+                                 filename from-coding)))
+       (setq to-coding (read-coding-system
+                       (format "Recode filename %s from %s to (default %s): "
+                               filename from-coding default-coding)
+                       default-coding)))
+     (list filename from-coding to-coding)))
+
+  (let* ((default-coding (or file-name-coding-system
+                            default-file-name-coding-system))
+        ;; FILE should have been decoded by DEFAULT-CODING.
+        (encoded (encode-coding-string file default-coding))
+        (newname (decode-coding-string encoded coding))
+        (new-encoded (encode-coding-string newname new-coding))
+        ;; Suppress further encoding.
+        (file-name-coding-system nil)
+        (default-file-name-coding-system nil)
+        (locale-coding-system nil))
+    (rename-file encoded new-encoded ok-if-already-exists)
+    newname))
 \f
 (defun switch-to-buffer-other-window (buffer &optional norecord)
   "Select buffer BUFFER in another window.