6

我想重命名 Emacs 中绑定当前缓冲区的文件。

我从这篇文章中找到了以下 elisp: 如何在 Emacs 中重命名打开的文件?

;; source: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive "sNew name: ")
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (if (not filename)
        (message "Buffer '%s' is not visiting a file!" name)
      (if (get-buffer new-name)
          (message "A buffer named '%s' already exists!" new-name)
        (progn
          (rename-file name new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil))))))

它工作正常,但如果可能的话,我想将当前文件名设置为默认值。我怎么写这个?

4

3 回答 3

5

您能否详细说明为什么需要这样做?条件是什么?因为自从我开始使用 Emacs 以来,从未出现过这种情况。

但有时当我想重命名某些东西时,我会这样做:

  1. 假设我正在编辑 spam-spom-spam.cc。我想修正这个名字。
  2. C-x d
  3. C-s spo
  4. C-x C-q
  5. DEL a
  6. C-c C-c

这可能看起来像很多命令,但它们很自然地流动。作为奖励,您可以大致了解您的目录以及新重命名的文件在那里的外观。

于 2013-07-24T09:29:28.623 回答
5

最近在 Emacs Redux 博客上有 一篇 关于这个主题的文章。

基本上它是在Prelude 配置(由同一作者)中实现的,您可以安装它来获得这种行为和大量其他有趣的东西。否则,您可以只在配置文件中放入相关片段(取自上面的博客文章):

(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)))))))

(global-set-key (kbd "C-c r")  'rename-file-and-buffer)
于 2013-07-24T13:08:05.280 回答
4

为此不需要外部工具。看

http://www.gnu.org/software/emacs/manual/html_node/emacs/Wdired.html

更改 dired-buffer 中的文件名后,缓冲区名也会更改。

于 2013-07-25T05:19:17.200 回答