Как переименовать открытый файл в Emacs?

Есть ли способ переименовать открытый файл в Emacs? Пока я это просматриваю? Что-то вроде save-as, но оригинальное должно исчезнуть.

Ответ 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)))))))

Ответ 10

Это может быть достигнуто путем копирования. shift + c в файле, и emacs попросит вас указать имя пути, включая имя файла, поэтому вы просто указываете новое имя и вводите... конечно, вам нужно удалить прежний.