Réponses:
Essayez cette fonction du .emacs de Steve Yegge :
;; source: http://steve.yegge.googlepages.com/my-dot-emacs-file (defun rename-file-and-buffer (nouveau-nom) "Renomme à la fois le tampon actuel et le fichier visité par NEW-NAME." (interactif "sNouveau nom:") (let ((nom (nom-tampon)) (nom de fichier (nom-fichier-tampon))) (si (pas le nom de fichier) (message "Le tampon '% s' ne visite pas un fichier!" nom) (if (get-buffer new-name) (message "Un tampon nommé '% s' existe déjà!" nouveau-nom) (progn (rename-file nom de fichier nouveau-nom 1) (nouveau nom du tampon de renommage) (nom-de-fichier-ensemble-nouveau-nom) (set-buffer-modified-p nil))))))
Jetez un oeil à cette page, il y a une autre fonction connexe vraiment utile, appelée "move-buffer-file".
(set-buffer-modified-p nil)
semble inutile. Si vous avez appelé rename-file-and-buffer
un tampon modifié puis tenté de le tuer, il le ferait avec plaisir sans vous avertir des modifications non enregistrées.
Oui, avec le dired
mode, vous pouvez:
C-x d
ouvrir diredRET
pour sélectionner le répertoire du fichier actuelC-x C-j
( dired-jump
au nom du fichier actuel, en Dired)R
pour renommer le fichier (ou dired-do-rename
).q
pour revenir au tampon de fichiers (renommé)Le renommage équivaut à un shell mv
, mais il mettra également à jour tous les tampons ouverts, et contrairement à mv
cela, il ne changera pas les accès et les heures de modification du fichier dans le système de fichiers.
C-x C-j
n'est pas lié par défaut pour moi. Faire d' M-x load-library RET dired-x RET
abord le rend lié.
C-x C-j
non lié est de le faire M-x dired-jump
la première fois. Il se chargera automatiquement dired-x
(ce qui entraînera également C-x C-j
sa définition à partir de ce moment).
Juste pour être complet, puisque certaines personnes peuvent visiter cette page en pensant qu'elles obtiendront une réponse pour la fonction "enregistrer sous" d'Emacs, c'est Cx Cw pour un fichier ouvert.
File > Save as...
Mon préféré est celui de Magnars (of emacs rocks screencasts fame.)
Contrairement aux autres alternatives, vous n'avez pas à taper le nom à partir de zéro - vous obtenez le nom actuel à modifier.
(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)))))))
Merci à James Yang pour une version correcte.
Voici une version plus robuste adaptée 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))
Voici une autre version, assez robuste et compatible 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)))))))
Vous pouvez en lire plus ici .
Si vous utilisez Spacemacs, vous obtenez ce comportement gratuitement car il est livré avec une implémentation de rename-current-buffer-file
(basée sur magnars) qui, par défaut, est liée à SPC-f-R
.
Il existe un moyen très simple, vous appuyez sur la commande Mx et tapez vc-rename-file , après cela il vous suffit de sélectionner votre fichier actuel dans le répertoire, puis de choisir le nouveau nom. Le buff contenant le fichier modifié sera actualisé.
Source: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
basé sur la version de magnars, j'ai modifié comme ci-dessous, corrigé la partie du nom de fichier 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)))))))
Il peut être réalisé par copie. shift + c sur le fichier et emacs vous demandera d'indiquer un nom pour le chemin d'accès, y compris le nom du fichier, vous devez donc simplement fournir le nouveau nom et entrer ... bien sûr, vous devez supprimer l'ancien.
(setq uniquify-buffer-name-style 'forward)
sens si vous avez un tampon nomméusers\index.html
(car vous avez déjà un autre tampon pourposts\index.html
) le changement de nom échouera