Respuestas:
Pruebe esta función de .emacs de Steve Yegge :
;; fuente: http://steve.yegge.googlepages.com/my-dot-emacs-file (defun rename-file-and-buffer (nombre-nuevo) "Renombra tanto el búfer actual como el archivo que está visitando a NEW-NAME". (interactivo "sNuevo nombre:") (let ((nombre (nombre del búfer)) (nombre de archivo (nombre-archivo-búfer))) (if (no nombre de archivo) (mensaje "Buffer '% s' no está visitando un archivo!" nombre) (if (get-buffer new-name) (mensaje "¡Ya existe un buffer llamado '% s'!" new-name) (progn (renombrar-archivo nombrearchivo nuevo-nombre 1) (rename-buffer new-name) (nombre-archivo-visitado-nuevo nombre-nuevo) (set-buffer-modified-p nil))))))
Eche un vistazo a esa página, hay otra función relacionada realmente útil allí, llamada "move-buffer-file".
(set-buffer-modified-p nil)
Parece innecesario Si solicitó rename-file-and-buffer
un búfer modificado y luego intentó matarlo, lo haría felizmente sin advertirle sobre cambios no guardados.
Sí, con el dired
modo, puedes:
C-x d
abrir diredRET
para seleccionar el directorio del archivo actualC-x C-j
( dired-jump
al nombre del archivo actual, en Dired)R
cambiar el nombre del archivo (o dired-do-rename
).q
para volver al búfer de archivo (renombrado)El cambio de nombre es equivalente a un shell mv
, pero también actualizará cualquier búfer abierto y, a diferencia de mv
esto, no cambiará el acceso ni modificará los tiempos del archivo en el sistema de archivos.
C-x C-j
no está vinculado por defecto para mí. Hacer M-x load-library RET dired-x RET
primero lo obliga.
C-x C-j
no está consolidada es simplemente hacerlo M-x dired-jump
por primera vez. Se cargará automáticamente dired-x
(lo que también hará C-x C-j
que se defina a partir de este punto).
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.
File > Save as...
Mi favorito es el de Magnars (de emacs rocks screencasts fame).
A diferencia de las otras alternativas, no tiene que escribir el nombre desde cero: obtiene el nombre actual para modificar.
(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.
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))
Aquí hay otra versión, que es bastante robusta y 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 aquí .
Si está utilizando Spacemacs , obtiene este comportamiento de forma gratuita, ya que viene con una implementación de rename-current-buffer-file
(basada en magnars) que de forma predeterminada está vinculada SPC-f-R
.
Hay una manera muy fácil, presionas el comando Mx y luego escribes vc-rename-file , después de eso solo necesitas seleccionar tu archivo actual en el directorio, y luego elegir el nuevo nombre. El beneficio que tiene el archivo modificado se actualizará.
Fuente: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
basado en la versión de Magnars, modifiqué como a continuación, 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)))))))
Se puede lograr mediante copia. shift + c en el archivo y emacs le pedirá que denote un nombre para la ruta, incluido el nombre del archivo, por lo que solo debe proporcionar el nuevo nombre e ingresar ... por supuesto, debe eliminar el anterior.
(setq uniquify-buffer-name-style 'forward)
significado si tiene un búfer llamadousers\index.html
(porque ya tiene otro búfer paraposts\index.html
), el cambio de nombre fallará