如何在Emacs中重命名已打开的文件?

278

在Emacs中,是否有一种方法可以在查看文件时重命名它?类似于另存为,但原始文件应该消失。

15个回答

5

优秀的crux软件包提供了crux-rename-file-and-buffer(以及许多其他有用的函数)。


2
我知道这篇文章已经很老了,但是在我找到的所有答案中,没有比Emacs教程中所说的更简单的方法:
M-x Dired(启动dired)
C-x C-q(在dired中切换只读模式)
像在文本文件中编辑一行一样更改文件名:
之前:

  /home/okiw4n/Documents/project/light_script:
  total used in directory 20 available 339.2 GiB
  drwxr-xr-x. 2 okiw4n okiw4n 4096 Sep  7 09:07 .
  drwxr-xr-x. 3 okiw4n okiw4n 4096 Sep  4 10:03 ..
  -rw-r--r--. 1 okiw4n okiw4n 3594 Sep  7 08:39 explication.org
  -rw-r--r--. 1 okiw4n okiw4n   85 Sep  4 10:09 script.sh
  -rw-r--r--. 1 okiw4n okiw4n 3594 Sep  5 20:08 tuc.org~

之后:

  /home/okiw4n/Documents/project/light_script:
  total used in directory 20 available 339.2 GiB
  drwxr-xr-x. 2 okiw4n okiw4n 4096 Sep  7 09:07 .
  drwxr-xr-x. 3 okiw4n okiw4n 4096 Sep  4 10:03 ..
  -rw-r--r--. 1 okiw4n okiw4n 3594 Sep  7 08:39 explication.org
  -rw-r--r--. 1 okiw4n okiw4n   85 Sep  4 10:09 script.sh
  -rw-r--r--. 1 okiw4n okiw4n 3594 Sep  5 20:08 TRUC.org~ (I have rewrite this file)

C-x C-s(用于保存更改)
C-x C-k(关闭当前缓冲区并返回文件)。


2

Emacs 29.1 添加了rename-visited-file命令,可以做到这一点,但没有默认的按键绑定。

根据其NEWS

** 新命令 'rename-visited-file'。 该命令通过将当前缓冲区访问的文件移动到一个新的名称或位置,并使缓冲区访问这个新文件来重命名文件。


0

我没有发现任何提出的解决方案能够满足我的需求(缓冲区选择、覆盖确认、快速响应、实际工作等),这是我正在使用的:

(defun rename-buffer-and-file (buffer newname)
  (interactive "bRename buffer and its visiting file: \nFNew name: ")
  (let ((oldname (buffer-file-name)))
    (if (not oldname)
        (message "Buffer '%s' is not visiting a file" buffer)
      (if (file-exists-p newname)
          (if (file-directory-p newname)
              ;; Signal an error if the user specified the name of an
              ;; existing directory.
              (error "%s is a directory" newname)
            (unless (y-or-n-p (format-message
                               "File `%s' exists; overwrite? "
                               newname))
              (error "Canceled"))))
      ;; Rename buffer and its visiting file
      (set-visited-file-name newname)
      ;; Delete old file
      (delete-file oldname)
      (save-buffer))))

为方便起见,绑定到C-x C-r

(global-set-key (kbd "C-x C-r") 'rename-buffer-and-file)

-2

可以通过复制来实现。在文件上按shift+c,emacs会要求您指定包括文件名在内的路径名称,因此您只需提供新名称并输入即可...当然,您必须删除以前的文件。


2
您似乎在Dired模式下提及了“C”?那是复制文件,而不是重命名文件,如@ChrisConway所指出的,在Dired中使用“R”进行重命名。此外,OP要求重命名当前缓冲区。 - Davor Cubranic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接