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

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

Ответы на вопрос(10)

dired В режиме вы можете:

C-x d открыть заправилRET выбрать каталог текущего файлаC-x C-j (dired-jump на имя текущего файла, в Dired)R переименовать файл (илиdired-do-rename).q вернуться в (переименованный) файловый буфер

Переименование эквивалентно оболочкеmv, но это также обновит любые открытые буферы.

 Fernando Basso11 авг. 2016 г., 13:26
Еще одна альтернатива, еслиC-x C-j несвязанный просто сделатьM-x dired-jump в первый раз. Это автоматически загрузитdired-x (что также приведет кC-x C-j будет определено с этого момента).
 Francesco Napolitano16 июн. 2016 г., 16:17
Для меня это лучший ответ, так как концепция «прямого» действия становится довольно размытой, когда мы говорим о нескольких нажатиях клавиш. Обычноquit-window связан сq так что это просто вопросC-x C-j R [filename] RET q, Насколько это «косвенный» на практике?
 Yoo15 окт. 2010 г., 18:03
Относительно того, как пропустить поиск файла из буфера ожидания, см.stackoverflow.com/questions/3933484/...
 Chris Conway22 дек. 2008 г., 02:49
С-х б, и вы вернулись в исходный буфер. Вы могли бы написать функцию Elisp, но я сомневаюсь, что вы сэкономите много нажатий клавиш.
 titanofold08 авг. 2013 г., 14:30
Спасибо за этот ответ. Это проще, чем добавлять функции. Что касается «Это не напрямую переименовывает текущий файл», похоже, именно это и делает. Файл переименован на диск и в буфер.
 pupeno21 дек. 2008 г., 18:21
Это не напрямую переименовывает текущий файл.
 ntc231 окт. 2013 г., 18:17
C-x C-j по умолчанию не связан для меня. делаM-x load-library RET dired-x RET сначала связывает.
 Yoo14 окт. 2010 г., 14:55
Кроме того, вместо C-x b вы можете нажать C-x k, чтобы вернуться в исходный буфер.

М-х и чем типVC-Rename-файлПосле этого вам просто нужно выбрать текущий файл в каталоге, а затем выбрать новое имя. Бафф с измененным файлом будет обновлен.

Источник:https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html

 dinosaur28 авг. 2017 г., 02:43
Это имеет (не обязательно желательный) побочный эффект от добавления старых и новых файлов для фиксации в систему управления версиями. Но +1, потому что он использует встроенную функцию, чтобы (в основном) ответить на вопрос ОП.

;; 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))
 lawlist06 мая 2013 г., 21:30
Большое спасибо.
 dolzenko27 сент. 2012 г., 13:53
Переезд в новый каталог у меня не сработал :)
 Felix D.18 июн. 2014 г., 21:32
Хороший. Теперь отдыхаю в моих функциях.

и emacs попросит вас указать имя пути, включая имя файла, так что вы просто вводите новое имя и вводите ... конечно, вы должны удалить предыдущее.

 Davor Cubranic13 янв. 2015 г., 20:33
Вы, кажется, имеете в виду «С» в режиме Dired? Это копирует файл, а не переименовывает его, что (как заметил @ChrisConway) в dired выполняется с помощью «R». И, кроме того, OP попросил переименовать текущий буфер.

Emacs Rock Скринкасты Известность.)

В отличие от других альтернатив, вам не нужно вводить имя с нуля - вы можете изменить текущее имя.

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

Спасибо Джеймсу Яну за правильную версию.

 mythicalcoder23 мар. 2017 г., 19:57
Это НЕ работает должным образом. Этот добавляет "/" в конце файла.
 mythicalcoder23 мар. 2017 г., 19:58
 The Unfun Cat24 мар. 2017 г., 08:54
Спасибо за публикацию этого для меня. Таким способом можно исправить ответы, а не публиковать новые, слегка измененные.
Решение Вопроса

.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".

 Thomas11 сент. 2015 г., 14:04
Эта функция также (несколько раздражающе) спросит у вас новое имядо проверка, связан ли текущий буфер с файлом вообще (в этом случае он прерывается).
 roldugin11 июл. 2013 г., 09:19
(set-buffer-modified-p nil) кажется ненужным Если вы позвонилиrename-file-and-buffer в измененном буфере, а затем попытался уничтожить его, он с радостью сделает это, не предупредив вас о несохраненных изменениях
 Vladimir Panteleev28 апр. 2016 г., 20:17
@dolzenko исправлено
 dolzenko27 сент. 2012 г., 13:49
Примечание: этот метод не совместим с(setq uniquify-buffer-name-style 'forward) это означает, что если у вас есть буфер с именемusers\index.html (потому что у вас уже есть другой буфер дляposts\index.html) переименование не удастся

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

Вы можете прочитать больше об этомВот.

Spacemacs то вы получаете это поведение бесплатно, так как оно идет с реализациейrename-current-buffer-file (основанный на магнарах), который по умолчанию связан сSPC-f-R.

https://github.com/syl20bnr/spacemacs/blob/bd7ef98e4c35fd87538dd2a81356cc83f5fd02f3/layers/%2Bdistributions/spacemacs-base/funcs.el#L294

поскольку некоторые люди могут посещать эту страницу, думая, что они получат ответ на функцию «сохранить как» в Emacs, это C-x C-w для открытого файла.

 asmeurer22 июн. 2013 г., 00:31
Не совсем «сохранить как», так как файл, который вы редактируете, все равно будет исходным.
 Yoo14 окт. 2010 г., 15:21
C-x C-w или используйте менюFile > Save as...
 Joel G Mathew22 авг. 2013 г., 16:23
@asmeurer Вы не правы! После сохранения вы будете редактировать новый файл.
 Felipe21 июн. 2015 г., 06:28
А потом стереть старый?
 Brady Trainor19 мар. 2014 г., 05:47
Возможно, asmeurer имел в виду, что «файл, который вы [редактировали], все еще будет [существовать]». Тогда это правильно? Я бы проверил, но тогда вы не можете опустить мой комментарий, хахаха.
 bearfriend04 февр. 2014 г., 21:39
Опять же, почему нет возможности понизить комментарии ?!

я изменил, как показано ниже, исправил часть имени файла 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)))))))
 mythicalcoder23 мар. 2017 г., 19:57
Этот лучше. Приведенная выше версия магнаров НЕ работает должным образом. Добавьте символ «/» в конце

Ваш ответ на вопрос