Respostas:
Tente esta função no arquivo .emacs de Steve Yegge :
;; fonte: http://steve.yegge.googlepages.com/my-dot-emacs-file (renomear arquivo-renomear-e-buffer (novo nome) "Renomeia o buffer atual e o arquivo que está visitando para NEW-NAME." (interativo "sNew name:") (let ((nome (nome do buffer))) (nome do arquivo (nome do arquivo-buffer))) (se (não o nome do arquivo) (mensagem "Buffer '% s' não está visitando um arquivo!" nome) (if (get-buffer new-name) (mensagem "Um buffer denominado '% s' já existe!" new-name) (progn (renomeie o arquivo nome do arquivo novo nome 1) (renomear-buffer novo nome) (nome do arquivo visitado-conjunto nome-novo) (conjunto-tampão-modificado-p nil))))))
Dê uma olhada nessa página, há outra função relacionada realmente útil, chamada "move-buffer-file".
(set-buffer-modified-p nil)
parece desnecessário. Se você chamasse rename-file-and-buffer
um buffer modificado e tentasse matá-lo, ele o faria feliz sem avisar sobre alterações não salvas.
Sim, com o dired
modo, você pode:
C-x d
abrir diredRET
para selecionar o diretório do arquivo atualC-x C-j
( dired-jump
para o nome do arquivo atual, em Dired)R
renomear o arquivo (ou dired-do-rename
).q
para voltar ao buffer de arquivo (renomeado)A renomeação é equivalente a um shell mv
, mas também atualiza os buffers abertos e, ao contrário mv
, não altera os tempos de acesso e modificação no arquivo no sistema de arquivos.
C-x C-j
não está vinculado por padrão para mim. Fazer M-x load-library RET dired-x RET
primeiro o torna vinculado.
C-x C-j
não estiver ligada, é apenas fazer M-x dired-jump
na primeira vez. Ele será carregado automaticamente dired-x
(o que também fará C-x C-j
com que seja definido a partir deste ponto).
Apenas para completar, já que algumas pessoas podem visitar esta página pensando que receberão uma resposta para o recurso "salvar como" do Emacs, que é o Cx Cw para um arquivo aberto.
File > Save as...
O meu favorito é o de Magnars (da fama dos screencasts de rochas do emacs ).
Ao contrário das outras alternativas, você não precisa digitar o nome do zero - é necessário modificar o nome atual.
(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)))))))
Obrigado a James Yang pela versão correta.
Aqui está uma versão mais robusta adaptada 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))
Aqui está outra versão, bastante robusta e com conhecimento 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 t t)))))))
Você pode ler mais sobre isso aqui .
Se você estiver usando o Spacemacs , obterá esse comportamento gratuitamente, pois ele vem com uma implementação rename-current-buffer-file
(baseada em magnares) à qual, por padrão, está vinculada SPC-f-R
.
Existe uma maneira muito fácil: você pressiona o comando Mx e , em seguida, digite vc-rename-file , depois basta selecionar o arquivo atual no diretório e escolher o novo nome. O buff que possui o arquivo alterado será atualizado.
Fonte: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
com base na versão magnars, modifiquei como abaixo, corrigi a parte do nome do arquivo 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)))))))
Pode ser conseguido por cópia. shift + c no arquivo e o emacs solicitará que você indique um nome para o caminho, incluindo o nome do arquivo, para que você apenas forneça o novo nome e insira ... é claro, você deve excluir o antigo.
(setq uniquify-buffer-name-style 'forward)
significado se você tiver um buffer nomeadousers\index.html
(porque você já possui outro buffer paraposts\index.html
) a renomeação falhará