Comment renommer un fichier ouvert dans Emacs?

Est-il possible de renommer un fichier ouvert dans Emacs? Pendant que je le regarde? Quelque chose comme save-as, mais l’original devrait disparaître.

Essayez cette fonction à partir des fichiers .emac de Steve Yegge :

 ;;  source: http://steve.yegge.googlepages.com/my-dot-emacs-file
 (désélectionnez rename-file-and-buffer (new-name))
   "Renomme à la fois le tampon courant et le fichier qu'il visite sur NEW-NAME."
   (interactif "sNew name:")
   (let (nom (nom-tampon))
         (nomfichier (nom-fichier-tampon)))
     (if (not filename)
         (le message "Buffer '% s' ne visite pas un fichier!")
       (if (get-buffer new-name)
           (message "Un tampon nommé '% s' existe déjà!" nouveau-nom)
         (progn
           (renommer le fichier nom-fichier nouveau-nom 1)
           (renommer-tampon-nouveau-nom)
           (nom-du-fichier-visité-nom-nouveau)
           (set-buffer-modified-p nil))))))

Jetez un coup d’oeil à cette page, il y a une autre fonction associée très utile, appelée “move-buffer-file”.

Oui, avec le mode dired , vous pouvez:

  • Cx Cj ( dired-jump au nom du fichier en cours, dans Dired)
  • R pour renommer le fichier (ou dired-do-rename ).
  • Cx k RET pour revenir au tampon de fichier (renommé)

Le renommage est équivalent à un shell mv , mais il mettra également à jour tous les tampons ouverts.

Pour plus de précision, puisque certaines personnes peuvent visiter cette page en pensant obtenir une réponse à la fonctionnalité “Enregistrer sous” d’Emacs, il s’agit de Cx Cw pour un fichier ouvert.

Mon préféré est celui de magnars (de roches emacs screencasts renommée.)

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 la 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 Cz Cz 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 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 tt))))))) 

Vous pouvez en savoir plus à ce sujet ici .

Il y a un moyen très facile, vous appuyez sur la commande Mx et que vous tapez vc-rename-file , après cela il vous suffit de sélectionner votre fichier actuel dans le répertoire, et de choisir le nouveau nom. Le buff qui a le fichier modifié sera rafraîchi.

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

Si vous utilisez Spacemacs, vous obtenez ce comportement gratuitement car il est livré avec une implémentation de rename-current-buffer-file (basé sur magnars) lié par défaut à SPC-fR .

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

Cela peut être réalisé par copie. shift + c sur le fichier et emacs vous demandera d’indiquer un nom pour le chemin, y compris le nom du fichier, de sorte que vous fournissiez simplement le nouveau nom et entrez … bien sûr, vous devez supprimer l’ancien.