Ответы:
Попробуйте эту функцию из .emacs Стива Йегге :
;; источник: http://steve.yegge.googlepages.com/my-dot-emacs-file (defun переименовать файл-и-буфер (новое имя) Msgstr "Переименовывает текущий буфер и файл, который он посещает, в NEW-NAME." (интерактивное "sNew name:") (пусть ((имя (имя буфера)) (имя файла (имя-буфера-файла))) (если (не имя файла) (имя сообщения "Буфер"% s "не посещает файл!") (if (get-buffer new-name) (сообщение «Буфер с именем«% s »уже существует!» new-name) (progn (переименовать файл имя файла new-name 1) (переименовать буфер новое имя) (set-посещения-имя-файла новое-имя) (set-buffer-updated-p nil))))))
Взгляните на эту страницу, там есть еще одна очень полезная связанная функция, которая называется "move-buffer-file".
(set-buffer-modified-p nil)
кажется ненужным Если вы вызываете rename-file-and-buffer
измененный буфер и затем пытаетесь его уничтожить, он с радостью сделает это, не предупредив вас о несохраненных изменениях.
Да, с помощью dired
режима вы можете:
C-x d
открыть заправилRET
выбрать каталог текущего файлаC-x C-j
( dired-jump
к названию текущего файла, в Dired)R
переименовать файл (или dired-do-rename
).q
вернуться в (переименованный) файловый буферПереименование эквивалентно оболочке mv
, но оно также обновит все открытые буферы и, в отличие от mv
него, не изменит доступ и время изменения файла в файловой системе.
C-x C-j
умолчанию это не связано для меня. Делать M-x load-library RET dired-x RET
первым делает это связанным.
C-x C-j
он не связан, это просто сделать M-x dired-jump
в первый раз. Он автоматически загрузится dired-x
(что также приведет C-x C-j
к определению с этого момента).
Просто для полноты, поскольку некоторые люди могут посещать эту страницу, думая, что они получат ответ на функцию «сохранить как» в Emacs, это Cx Cw для открытого файла.
File > Save as...
Мой фаворит - тот из 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)))))))
Спасибо Джеймсу Яну за правильную версию.
Вот более надежная версия, адаптированная от 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)))))))
Вы можете прочитать больше об этом здесь .
Если вы используете Spacemacs, то вы получаете это поведение бесплатно, поскольку оно поставляется с реализацией rename-current-buffer-file
(основанной на магнарах), к которой по умолчанию привязано SPC-f-R
.
Есть очень простой способ, вы нажимаете команду Mx и затем набираете vc-rename-file , после чего вам просто нужно выбрать ваш текущий файл в каталоге, а затем выбрать новое имя. Бафф с измененным файлом будет обновлен.
Источник: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
в зависимости от версии Magnars, я изменил, как показано ниже, исправил часть имени файла 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)))))))
Это может быть достигнуто путем копирования. shift + c для файла, и emacs попросит вас указать имя пути, включая имя файла, поэтому вы просто указываете новое имя и вводите ... конечно, вы должны удалить предыдущее.
(setq uniquify-buffer-name-style 'forward)
значением, если у вас есть буфер с именемusers\index.html
(потому что у вас уже есть другой буфер дляposts\index.html
), переименование завершится неудачей