commands - emacs ubuntu
¿Cómo cambio el nombre de un archivo abierto en Emacs? (10)
¿Hay una manera de cambiar el nombre de un archivo abierto en Emacs? Mientras lo estoy viendo? Algo así como guardar como, pero el original debería desaparecer.
Aquí hay otra versión, que es bastante robusta y consciente de 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)))))))
Puedes leer más sobre esto here .
Aquí hay una versión más robusta adaptada de 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))
Hay una manera muy fácil, presione el comando Mx y luego escriba vc-rename-file , después de eso solo necesita seleccionar su archivo actual en el directorio, y luego elegir el nuevo nombre. El buff que tiene el archivo modificado se actualizará.
Fuente: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
Mi favorito es el de Magnars (de emacs rocks screencasts fama.)
A diferencia de las otras alternativas, no tiene que escribir el nombre desde cero, puede modificar el nombre actual.
(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)))))))
Gracias a James Yang por una versión correcta.
Prueba esta función de .emacs de Steve Yegge :
;; 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))))))
Eche un vistazo a esa página, hay otra función relacionada realmente útil allí, llamada "move-buffer-file".
Sí, con el modo dired
, puedes:
-
Cx Cj
(dired-jump
al nombre del archivo actual, en Dired) -
R
para cambiar el nombre del archivo (odired-do-rename
). -
Cx k RET
para volver al búfer del archivo (renombrado)
El cambio de nombre es equivalente a un shell mv
, pero también actualizará los buffers abiertos.
Se puede lograr por copia. Mayús + c en el archivo y emacs le pedirá que indique un nombre para la ruta que incluye el nombre del archivo, así que solo debe proporcionar el nuevo nombre y, por supuesto, debe borrar el anterior.
Según la versión de Magnars, modifiqué la siguiente forma y arreglé la parte del nombre del archivo 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)))))))
Si está utilizando Spacemacs , obtendrá este comportamiento de forma gratuita, ya que viene con una implementación de rename-current-buffer-file
(basado en magnars) que, de forma predeterminada, está vinculado a SPC-fR
.
Solo para completar, ya que algunas personas pueden visitar esta página pensando que obtendrán una respuesta para la función "guardar como" de Emacs, eso es Cx Cw para un archivo abierto.