web-dev-qa-db-fra.com

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 partir.

231
pupeno

Essayez cette fonction à partir de .emacs de Steve Yegge :

 ;; source: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun renommer fichier-et-tampon (nouveau nom) 
 "Renomme le tampon actuel et enregistrez ses visites dans NEW-NAME. "
 (interactif" sNew name: ") 
 (let ((name (nom-tampon))) 
 (nomfichier (fichier-tampon -name))) 
 (si (pas un nom de fichier) 
 (message "Le tampon '% s' ne visite pas un fichier!" nom) 
 (si (get-buffer new -name) 
 (message "Un tampon nommé '% s' existe déjà!" nouveau nom) 
 (progn 
 (nom du fichier renommé nom_fichier nouveau nom 1) 
 (renommer-tampon nouveau-nom) 
 (nom-fichier-visité-set-visité) nouveau nom 
 (set-buffer-modified-p nil))))))). ____.]

Regardez cette page, il y a une autre fonction connexe vraiment utile, appelée "move-buffer-file".

85
Matt Curtis

Oui, avec le mode dired, vous pouvez:

  • C-x d ouvrir ouvert
  • RET pour sélectionner le répertoire du fichier actuel
  • C-x C-j (dired-jump au nom du fichier en cours, dans Dired)
  • R pour renommer le fichier (ou dired-do-rename).
  • q pour revenir au tampon de fichier (renommé)

Le changement de nom équivaut à un shell mv, mais il mettra également à jour tous les tampons ouverts. Contrairement à mv, il ne modifiera pas les temps d'accès et de modification du fichier dans le système de fichiers.

324
Chris Conway

Par souci d’exhaustivité, étant donné que certaines personnes peuvent consulter cette page en pensant qu’elles obtiendront une réponse à la fonction "Enregistrer sous" d’Emacs, il s’agit de C-x C-w pour un fichier ouvert.

119
Jim G

Mon préféré est celui de Magnars (de screencasts emacs rock gloire.)

Contrairement aux autres alternatives, vous n'avez pas à taper le nom à partir de zéro - vous devez modifier le nom actuel.

(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.

22
The Unfun Cat

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))
14
Shawn Hoover

Voici une autre version, assez robuste et consciente 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 à ce sujet ici .

10
Bozhidar Batsov

Il existe un moyen très simple, 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, 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

4
Rafael Nascimento

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)))))))
3
James Yang

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

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

1
Jason Axelson