Emacs: função para criar um arquivo com data / hora como nome do arquivo e um atalho para ele

8

Eu preciso gerar arquivos de texto com o seguinte formato de nome: YYYYY-MM-DD--hh-mm-ss.org. Como posso usar a funcionalidade de captura para isso? Ou seja, em vez de fazer uma entrada por captura em um único arquivo, a função deve criar um único arquivo por captura e, esperançosamente, com todas as possibilidades do mecanismo de captura.

myotis
fonte
Desculpe, esqueci o contexto da minha pergunta. "capture" faz parte do emacs org-mode
myotis

Respostas:

6

Você deve poder usar o functionformulário de destino para fazer isso:

(defun my/org-file-by-date ()
  "Create an Org file with current time as name."
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))

(add-to-list 'org-capture-templates
             '("x" "Template Name" plain
              (function my/org-file-by-date)
              "Capture template contents"))

Edição 2 : o código passado para um fileformulário ou similar não é avaliado até o tempo de captura, portanto, há uma maneira mais compacta de fazer isso. Veja a resposta de Erik Sjöstrand para um exemplo.

Editar 1 : para obter funcionalidades semelhantes sem passar pela interface de captura, você pode usar funções semelhantes a estas.

(defun my/org-file-by-date-with-inline-skeleton ()
  "Create Org file from skeleton with current time as name."
  (interactive)
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org"))
  (insert "Skeleton contents"))

(defun my/org-file-by-date-with-file-skeleton ()
  "Create Org file from skeleton file with current time as name."
  (interactive)
  (let ((filename (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (copy-file "path/to/skeleton/file" filename)
    (find-file filename)))
Aaron Harris
fonte
Direita. Eu editei minha resposta para apontar para a sua.
JCH
Obrigado ! Vejo, testando o código, que talvez não seja necessário usar a funcionalidade de captura. Porque eu escrevo muito em cada um desses arquivos e preciso fechar com Cc c. Eu preferiria escrever diretamente no arquivo criado e salvar normalmente. Como posso criar um arquivo chamado% Y-% m-% d -% H-% M-% S.org e conter algum texto fixo (talvez de um esqueleto?) E abri-lo para escrever?
myotis
Acabei de adicionar duas funções que evitam capturar completamente. Eu acho que é isso que você está procurando.
Aaron Harris
1

Não parece haver nenhuma funcionalidade interna para fazer isso ( editar : sim, veja abaixo). A solução mais simples, que não requer aprofundamento nas funcionalidades internas de captura, é vincular o valor org-default-notes-fileno momento da captura:

(defun my-org-capture-advice (func &rest args)
   (let ((org-default-notes-file
         (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (apply func args)))

(advice-add 'org-capture :around #'my-org-capture-advice)

Esse conselho acontece muito cedo, por isso ainda não sabemos qual modelo você usará. Se o nome do arquivo depender do modelo de captura, provavelmente você precisará aconselhar org-capture-set-target-location.

Editar : o functionalvo do modelo é a melhor maneira de conseguir isso. Veja a resposta de Aaron para um exemplo.

jch
fonte
Obrigado! Não sei como usar seu código. Eu o adicionei ao meu arquivo init.el. O que eu faço mais?
Myotis
Faça o que você costuma fazer para invocar a org-capturefunção - C-c cse você seguiu o conselho no manual da organização.
JCH
Eu ainda não entendo. Se eu digitar "Mx my-org-capture-conselho", nada acontece. Quando digito meu Cc c normal, recebo minha lista de capturas conforme as defini. Então, de onde vem o seu código?
myotis
Se você org-capture-templatesnão especificar um arquivo para capturar, o arquivo escolhido será formatado conforme desejado.
JCH
então eu preciso criar um novo arquivo de captura sem um arquivo para capturar e, em seguida, seu código fará seu trabalho?
myotis
1

Aqui está uma maneira de manter tudo na org-capture-templateslista, sem definir outras funções. org-directorypode ser alterado para qualquer diretório em que você deseja armazenar os arquivos.

(add-to-list 'org-capture-templates
             '("x" "Template name" plain
               (file (expand-file-name
                      (format-time-string "%Y-%m-%d--%H-%M-%S.org")
                      org-directory))
               "This string is inserted in the capture"))
Erik Sjöstrand
fonte