Hoe hernoem ik een geopend bestand in Emacs?

Is er een manier om een ​​geopend bestand in Emacs te hernoemen? Terwijl ik ernaar kijk? Iets als opslaan-als, maar de originele zou moeten verdwijnen.


Antwoord 1, autoriteit 100%

Ja, met de modus diredkunt u:

  • C-x dom dired te openen
  • RETom de map van het huidige bestand te selecteren
  • C-x C-j(dired-jumpnaar de naam van het huidige bestand, in Dired)
  • Rom het bestand te hernoemen (of dired-do-rename).
  • qom terug te gaan naar de (hernoemde) bestandsbuffer

De hernoeming is gelijk aan een shell mv, maar het zal ook alle open buffers bijwerken, en in tegenstelling tot mvzal het de toegangs- en wijzigingstijden van het bestand niet veranderen in het bestandssysteem.


Antwoord 2, autoriteit 35%

Voor de volledigheid, aangezien sommige mensen deze pagina bezoeken en denken dat ze een antwoord zullen krijgen voor de “opslaan als”-functie van Emacs, is dat C-x C-w voor een open bestand.


Antwoord 3, autoriteit 25%

Probeer deze functie van Steve Yegge’s .emacs:

;; bron: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun hernoem-bestand-en-buffer (nieuwe-naam)
 "Hernoemt zowel de huidige buffer als het bestand dat het bezoekt naar NEW-NAME."
 (interactieve "sNieuwe naam: ")
 (let ((naam (buffernaam))
    (bestandsnaam (bufferbestandsnaam)))
  (if (niet bestandsnaam)
    (bericht "Buffer '%s' bezoekt geen bestand!" naam)
   (if (get-buffer nieuwe naam)
     (bericht "Er bestaat al een buffer met de naam '%s'!" nieuwe naam)
    (prog
     (hernoem-bestand bestandsnaam nieuwe-naam 1)
     (hernoem-buffer nieuwe-naam)
     (set-bezocht-bestandsnaam nieuwe-naam)
     (set-buffer-gemodificeerd-p nihil))))))

Kijk eens naar die pagina, er is daar nog een heel nuttige gerelateerde functie, genaamd “move-buffer-file”.


Antwoord 4, autoriteit 9%

Mijn favoriet is die van Magnars (van emacs rockt screencastsfame.)

In tegenstelling tot de andere alternatieven, hoeft u de naam niet helemaal opnieuw te typen – u krijgt de huidige naam om te wijzigen.

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

Met dank aan James Yang voor een correcte versie.


Antwoord 5, autoriteit 4%

Hier is een robuustere versie aangepast van 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))

6, Autoriteit 2%

Als u spacemacs dan krijgt, krijgt u dit gedrag gratis omdat het wordt geleverd met een implementatie van rename-current-buffer-file(op basis van magnives) die standaard gebonden aan SPC-f-R.

HTTPS: // GitHub .com / SYL20BNR / SPACEMACS / BLOB / BD7EF98E4C35FD87538DD2A81356CC83F5FD02F3 / Lagen /% 2BDistributies / Spacemacs-Base / Funcs.el # L294

Other episodes