Есть ли способ переименовать открытый файл в Emacs? Пока я это просматриваю? Что-то вроде save-as, но оригинальное должно исчезнуть.
Как переименовать открытый файл в Emacs?
Ответ 1
Попробуйте эту функцию из 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 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".
Ответ 2
Да, в режиме dired
вы можете:
-
Cx d
чтобы открыть Dired -
RET
чтобы выбрать каталог текущего файла -
Cx Cj
(dired-jump
к названию текущего файла в Dired) -
R
чтобы переименовать файл (илиdired-do-rename
). -
q
чтобы вернуться в (переименованный) файловый буфер
Переименование эквивалентно оболочке mv
, но оно также обновит все открытые буферы и, в отличие от mv
, не изменит доступ и время изменения файла в файловой системе.
Ответ 3
Просто для полноты, так как некоторые люди могут посетить эту страницу, думая, что они получат ответ для функции "сохранить как" Emacs, C-x C-w для открытого файла.
Ответ 4
Мой фаворит - тот из 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)))))))
Спасибо Джеймсу Яну за правильную версию.
Ответ 5
Здесь более надежная версия, адаптированная из 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 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))
Ответ 6
Здесь другая версия, которая довольно надежна и осведомлена о 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)))))))
Вы можете прочитать об этом здесь.
Ответ 7
Существует очень простой способ: нажмите Mx и введите vc-rename-file, после чего вам просто нужно выбрать текущий файл на и выберите новое имя. Бафф, который имеет измененный файл, будет обновлен.
Источник: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
Ответ 8
на основе версии магнаров, измененной, как показано ниже, исправлена часть имени файла 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)))))))
Ответ 9
Если вы используете Spacemacs, то вы получаете это поведение бесплатно, так как оно поставляется с реализацией rename-current-buffer-file
(основанной на магнарах), которая по умолчанию привязана к SPC-fR
.
Ответ 10
Это может быть достигнуто путем копирования. shift + c в файле, и emacs попросит вас указать имя пути, включая имя файла, поэтому вы просто указываете новое имя и вводите... конечно, вам нужно удалить прежний.