Salvar arquivo atual com um nome ligeiramente diferente

17

Meus arquivos têm nomes de arquivos longos e uma parte do nome do arquivo é uma data e um número de versão. Muitas vezes, eu gostaria de salvar o arquivo no buffer usando quase o mesmo nome, basta alterar o número da versão ou a data.

Isso seria muito mais fácil, se eu tivesse um comando que coloque o nome do arquivo do buffer atual no anel de interrupção, para que eu possa abrir um arquivo, digite C-x C-w(gravar arquivo), puxe o nome atual com Cy, altere-o e salve isto.

Estou usando o Emacs 24.3 no Windows e 24.4 no Linux. Eu tenho que usar nomes de arquivos diferentes e não git por várias razões. Ficaria feliz se este comando funcionasse com o AUCTeX / LaTeX como modo principal.


Editar 1:

Cometi um erro: não quero digitar C-x C-f(= localizar arquivo), mas C-x C-w(= escrever arquivo). Eu corrigi isso acima.

Edição 2:

Encontrou uma pergunta e resposta duplicadas: /unix//a/45381 Mas não há resposta melhor!

Edição 3:

Aqui: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html é uma função que seleciona a parte "não-diretório" do nome do arquivo:

Função: nome-do-arquivo-nome-do-subdiretório nome-do-arquivo

This function returns the nondirectory part of filename.

          (file-name-nondirectory "lewis/foo")
               ⇒ "foo"
          (file-name-nondirectory "foo")
               ⇒ "foo"
          (file-name-nondirectory "lewis/")
               ⇒ ""

Se eu soubesse cigano ...

Keks Dose
fonte
Oh, olá, Keks :) Na verdade, eu me perguntei isso muitas vezes ... boa pergunta. E Lisp é fácil ......
Sean Allred
Acabei de encontrar esta pergunta ... Por curiosidade: as "várias razões" estão relacionadas ao conselheiro / co-autor ...?
mbork
1
@mbork Sou advogado e escrevo cartas e contratos. Abrir uma carta recente para alguém, renomeá-lo, apagar o conteúdo e começar a escrever uma nova para a mesma pessoa é mais rápido do que começar do zero. Mas em relação aos contratos que os renomeiam é um substituto ruim para os cvs, mas nunca conheci outro advogado que use o LaTeX e o Git, por isso tenho que dar a uma nova versão do contrato um novo nome de arquivo ...
Keks Dose
Justo. E o YASnippet? Parece muito bem adequado ao seu caso de uso.
mbork
@mbork Sim, para meus modelos, estou usando o YASnippets, desde anos. LaTeX, Emacs, orgmode, YASnippets tornam meu PC muito mais confiável que o Word e o Outlook. OK, estou escrevendo isso em uma máquina Linux, mas isso é algo que você realmente não pode esperar do suporte técnico de TI usual: oferecer suporte ao Linux em vez do Windows.
perfil completo de Keks Dose

Respostas:

23

Não há necessidade de fazer tudo isso.

Simplesmente:

  1. Ainda no arquivo original, pressione C-x C-w. Você será solicitado a fornecer um novo nome de arquivo.
  2. Clique em Hit M-ne o nome do arquivo atual será inserido para você.
  3. Edite o que deseja e pressione RETpara salvar o arquivo com esse novo nome.

Você ainda terá o arquivo original. Se você quiser voltar, basta visitá-lo novamente com C-x C-f.

Malabarba
fonte
Dei uma olhada no manual do Emacs sobre Arquivos / Salvamento, mas não encontrei esse truque. Como você descobriu? Ótimo!
Keks Dose
4
Não tenho certeza. É uma coisa geral sobre os prompts do minibuffer. Atingir Mp percorre a história, e pressionar Mn fornece a opção "atual".
Malabarba 30/10
5
Se você estiver usando ido, faça C-fprimeiro e depois M-n.
precisa
1
Uau, eu nunca soube disso. Obrigado! (Desculpem a "obrigado, eu também" comentário, mas este é um grande exemplo de aprender algo simples, mas útil Viva la emacs.stackexchange!.
Mark Aufflick
3

Copiando o nome do arquivo no buffer atual

Aqui está uma função que eu uso no blog de Cameron Desautels que copia o nome do arquivo de buffer atual e o exibe em minibuffer.

 
;; Fonte: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  "Mostre o caminho completo para o arquivo atual no minibuffer e copie-o para o kill-ring."
  (interativo)
  (let ((nome do arquivo (nome do arquivo do buffer))))
    (se nome do arquivo
        (progn
          (nome do arquivo de mensagem)
          (kill-new file-name))
      (erro "Buffer não está visitando um arquivo"))))

Renomeando o nome do arquivo no buffer atual

Magnar Sveen implementou a função abaixo em um de seus blogs que renomeia convenientemente o buffer atual de uma só vez. Não foi o que você pediu, mas achei que poderia estar relacionado ao seu caso de uso.

;; Fonte: http://www.whattheemacsd.com/
(renomear renomear-atual-buffer-arquivo ()
  "Renomeia o buffer atual e o arquivo que está visitando."
  (interativo)
  (let ((nome (nome do buffer)))
        (nome do arquivo (nome do arquivo-buffer)))
    (if (not (e nome do arquivo (nome do arquivo existe-p-p))))
        (erro "Buffer '% s' não está visitando um arquivo!" nome)
      (let ((novo nome (nome do arquivo lido "Novo nome:" nome do arquivo))))
        (if (get-buffer new-name)
            (erro "Um buffer denominado '% s' já existe!" new-name)
          (renomear arquivo nome do arquivo novo nome 1)
          (renomear-buffer novo nome)
          (nome do arquivo visitado-conjunto nome-novo)
          (set-buffer-modificado-p nil)
          (mensagem "O arquivo '% s' foi renomeado com sucesso para '% s'."
                   nome (nome-do-arquivo-não-diretório-novo-nome))))))))
Kaushal Modi
fonte
A solução de Magnar Sveen exclui o arquivo original e só haverá o arquivo renomeado posteriormente. Isso é útil, mas preciso manter o arquivo antigo e o renomeado. A função de Cameron Desautel copia o nome do arquivo com o caminho inteiro. Isso é bem próximo da solução que eu preciso. Você sabe como alterar essa função, de forma que ela apenas solte o nome do arquivo sem o caminho? No entanto, muito obrigado.
Keks Dose
1
@KeksDose basta mudar (buffer-file-name)para (file-name-nondirectory (buffer-file-name))na primeira função para obter o nome do arquivo sans directory.
Nispio 30/10/2014