web-dev-qa-db-ja.com

Emacsで開いているファイルの名前を変更するにはどうすればよいですか?

Emacsで開いているファイルの名前を変更する方法はありますか?私がそれを見ている間?名前を付けて保存のようなものですが、元のものは消えるべきです。

231
pupeno

Steve Yeggeの.emacs からこの関数を試してください:

 ;;ソース:http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-file-and-buffer(new-name)
 "現在の両方のバッファーの名前を変更そして、それがNEW-NAMEにアクセスしていることをファイルします。 "
(インタラクティブな" sNew name: ")
(let((name(buffer-name))
(filename(buffer-file -name)))..____。](if(not filename)
(メッセージ「バッファ '%s'はファイルにアクセスしていません!」name)
(if(get-buffer new -name)
(メッセージ「 '%s'という名前のバッファは既に存在します!」new-name)
(progn 
(rename-file filename new-name 1)
(名前変更バッファの新しい名前)
(セット訪問ファイル名の新しい名前)
(セットバッファ変更p nil)))))).. ____。]

そのページを見てください。そこには、「move-buffer-file」と呼ばれる本当に便利な別の機能があります。

85
Matt Curtis

はい、diredモードでは、次のことができます。

  • C-x dはdiredを開きます
  • RETは現在のファイルのディレクトリを選択します
  • C-x C-jdired-jumpは、現在のファイルの名前(Dired内))
  • Rでファイルの名前を変更します(またはdired-do-rename)。
  • q(名前が変更された)ファイルバッファに戻る

名前の変更はシェルmvと同等ですが、開いているバッファーも更新され、mvとは異なり、ファイルシステム内のファイルのアクセス時間と変更時間は変更されません。

324
Chris Conway

完全を期すために、一部の人々はEmacsの「名前を付けて保存」機能、つまり開いているファイルのC-x C-wに対する答えが得られると考えてこのページにアクセスする場合があります。

119
Jim G

私のお気に入りはMagnarsのもの( emacs rocks screencasts fame。)

他の選択肢とは異なり、名前を最初から入力する必要はありません-変更する現在の名前を取得します。

(defun rename-current-buffer-file ()
  "Renames current buffer and file it is visiting."
  (interactive)
  (let* ((name (buffer-name))
        (filename (buffer-file-name))
        (basename (file-name-nondirectory filename)))
    (if (not (and filename (file-exists-p filename)))
        (error "Buffer '%s' is not visiting a file!" name)
      (let ((new-name (read-file-name "New name: " (file-name-directory filename) basename nil basename)))
        (if (get-buffer new-name)
            (error "A buffer named '%s' already exists!" new-name)
          (rename-file filename new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil)
          (message "File '%s' successfully renamed to '%s'"
                   name (file-name-nondirectory new-name)))))))

正しいバージョンを提供してくれたJames Yangに感謝します。

22
The Unfun Cat

これがsteveyからのより堅牢なバージョンです。

;; Originally from stevey, adapted to support moving to a new directory.
(defun rename-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive
   (progn
     (if (not (buffer-file-name))
         (error "Buffer '%s' is not visiting a file!" (buffer-name)))
     ;; Disable ido auto merge since it too frequently jumps back to the original
     ;; file name if you pause while typing. Reenable with C-z C-z in the Prompt.
     (let ((ido-auto-merge-work-directories-length -1))
       (list (read-file-name (format "Rename %s to: " (file-name-nondirectory
                                                       (buffer-file-name))))))))
  (if (equal new-name "")
      (error "Aborted rename"))
  (setq new-name (if (file-directory-p new-name)
                     (expand-file-name (file-name-nondirectory
                                        (buffer-file-name))
                                       new-name)
                   (expand-file-name new-name)))
  ;; Only rename if the file was saved before. Update the
  ;; buffer name and visited file in all cases.
  (if (file-exists-p (buffer-file-name))
      (rename-file (buffer-file-name) new-name 1))
  (let ((was-modified (buffer-modified-p)))
    ;; This also renames the buffer, and works with uniquify
    (set-visited-file-name new-name)
    (if was-modified
        (save-buffer)
      ;; Clear buffer-modified flag caused by set-visited-file-name
      (set-buffer-modified-p nil)))

  (setq default-directory (file-name-directory new-name))

  (message "Renamed to %s." new-name))
14
Shawn Hoover

これは別のバージョンです。これは非常に堅牢で、VCに対応しています。

(defun rename-file-and-buffer ()
  "Rename the current buffer and file it is visiting."
  (interactive)
  (let ((filename (buffer-file-name)))
    (if (not (and filename (file-exists-p filename)))
        (message "Buffer is not visiting a file!")
      (let ((new-name (read-file-name "New name: " filename)))
        (cond
         ((vc-backend filename) (vc-rename-file filename new-name))
         (t
          (rename-file filename new-name t)
          (set-visited-file-name new-name t t)))))))

詳しくは こちら をご覧ください。

10
Bozhidar Batsov

非常に簡単な方法があります。コマンドMxを押し、タイプvc-rename-file、その後、ディレクトリで現在のファイルを選択し、新しい名前を選択するだけです。変更されたファイルを持つバフが更新されます。

出典:https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html

4

magnarsバージョンに基づいて、以下のように変更し、INITファイル名の部分を修正しました。

(defun rename-current-buffer-file ()
  "Renames current buffer and file it is visiting."
  (interactive)
  (let* ((name (buffer-name))
        (filename (buffer-file-name))
        (basename (file-name-nondirectory filename)))
    (if (not (and filename (file-exists-p filename)))
        (error "Buffer '%s' is not visiting a file!" name)
      (let ((new-name (read-file-name "New name: " (file-name-directory filename) basename nil basename)))
        (if (get-buffer new-name)
            (error "A buffer named '%s' already exists!" new-name)
          (rename-file filename new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil)
          (message "File '%s' successfully renamed to '%s'"
                   name (file-name-nondirectory new-name)))))))
3
James Yang

Spacemacs を使用している場合、デフォルトでrename-current-buffer-fileにバインドされるSPC-f-R(magnarsに基づく)の実装が付属しているため、この動作は無料です。

https://github.com/syl20bnr/spacemacs/blob/bd7ef98e4c35fd87538dd2a81356cc83f5fd02f3/layers/%2Bdistributions/spacemacs-base/funcs.el#L294

1
Jason Axelson