Risposte:
Prova questa funzione dai .emacs di Steve Yegge :
;; fonte: http://steve.yegge.googlepages.com/my-dot-emacs-file (defunenome-file-e-buffer rinominare (nuovo-nome) "Rinomina sia il buffer corrente sia il file che sta visitando NEW-NAME." (interattivo "sNew name:") (let ((name (buffer-name)) (nome file (nome file buffer))) (if (non nome file) (messaggio "Buffer '% s' non sta visitando un file!") (if (get-buffer new-name) (messaggio "Un buffer chiamato '% s' esiste già!" new-name) (progn (rinomina file nome nuovo nome 1) (rinomina buffer nuovo nome) (set-visitato-nome-file-nome-nuovo) (set-buffer-modificato-p nil))))))
Dai un'occhiata a quella pagina, c'è un'altra funzione correlata davvero utile lì, chiamata "move-buffer-file".
(set-buffer-modified-p nil)
sembra inutile. Se avessi richiamato rename-file-and-buffer
un buffer modificato e avessi tentato di eliminarlo, lo farebbe felicemente senza avvisarti delle modifiche non salvate.
Sì, con la dired
modalità puoi:
C-x d
per aprire direttoRET
per selezionare la directory del file correnteC-x C-j
( dired-jump
al nome del file corrente, in Dired)R
per rinominare il file (o dired-do-rename
).q
per tornare al buffer di file (rinominato)La ridenominazione equivale a una shell mv
, ma aggiornerà anche eventuali buffer aperti e, diversamente da mv
ciò, non cambierà l'accesso e i tempi di modifica sul file nel filesystem.
C-x C-j
è vincolato per impostazione predefinita per me. Fare M-x load-library RET dired-x RET
prima lo rende vincolato.
C-x C-j
non è associata è M-x dired-jump
la prima volta. Si caricherà automaticamente dired-x
(il che farà sì C-x C-j
che sia definito da questo punto in poi).
Solo per completezza, poiché alcune persone potrebbero visitare questa pagina pensando di ottenere una risposta per la funzione "salva con nome" di Emacs, questo è Cx Cw per un file aperto.
File > Save as...
Il mio preferito è quello di Magnars (di fama di screencast .)
A differenza delle altre alternative, non è necessario digitare il nome da zero: si ottiene il nome corrente da modificare.
(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)))))))
Grazie a James Yang per una versione corretta.
Ecco una versione più robusta adattata da 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))
Ecco un'altra versione, abbastanza robusta e consapevole di 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)))))))
Puoi leggere di più qui .
Se stai usando Spacemacs , ottieni questo comportamento gratuitamente poiché viene fornito con un'implementazione di rename-current-buffer-file
(basata sui magnari) a cui di default è associato SPC-f-R
.
C'è un modo molto semplice, premi il comando Mx e poi digita vc-rename-file , dopodiché devi solo selezionare il tuo file corrente nella directory e scegliere il nuovo nome. Il buff che ha il file modificato verrà aggiornato.
Fonte: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
in base alla versione dei magnari, ho modificato come di seguito, risolto il nome del file 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)))))))
Può essere ottenuto tramite copia. shift + c sul file ed emacs ti chiederà di indicare un nome per il percorso incluso il nome del file, quindi devi solo fornire il nuovo nome e inserire ... ovviamente, devi eliminare quello precedente.
(setq uniquify-buffer-name-style 'forward)
significato se si dispone di un buffer denominatousers\index.html
(poiché si dispone già di un altro buffer perposts\index.html
) la ridenominazione non riuscirà