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 dired
kunt u:
C-x d
om dired te openenRET
om de map van het huidige bestand te selecterenC-x C-j
(dired-jump
naar de naam van het huidige bestand, in Dired)R
om het bestand te hernoemen (ofdired-do-rename
).q
om 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 mv
zal 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
.