有没有办法在Emacs中重命名打开的文件?在我看的时候?像save-as之类的东西,但最初的东西应该消失.
是的,使用dired
模式,您可以:
C-x d
打开直接
RET
选择当前文件的目录
C-x C-j
(dired-jump
到当前文件的名称,在Dired中)
R
重命名文件(或dired-do-rename
).
q
返回(重命名)文件缓冲区
重命名等同于shell mv
,但它也会更新任何打开的缓冲区.
只是为了完整性,因为有些人可能会访问此页面,认为他们会得到Emacs的"另存为"功能的答案,那就是打开文件的Cx Cw.
试试Steve Yegge的.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 filename new-name 1) (rename-buffer new-name) (set-visited-file-name new-name) (set-buffer-modified-p nil))))))
看看那个页面,那里有另一个真正有用的相关函数,叫做"move-buffer-file".
我最喜欢的是来自Magnars的那个(emacs摇滚截屏名声.)
与其他替代方案不同,您不必从头开始输入名称 - 您将获得要修改的当前名称.
(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的正确版本.
这是一个更强大的版本改编自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))
这是另一个版本,非常强大且可识别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)))))))
你可以在这里阅读更多相关信息.