Data da organização da planilha

7

Eu sou capaz de calcular datas assim:

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
#+TBLFM: $4=$2+$3;D

mas o que eu quero fazer é fazer com que essa data apareça como uma data da agenda, algo como:

DEADLINE: $remote(mytbl,@1$4)

mas isso não funciona. Não consigo encontrar nenhuma sintaxe, nem mesmo uma macro, que permita nada além de uma data literal para uma entrada na agenda.

Alguma ideia?

jtgd
fonte
Existe uma função de sobreposição usada para fazer com que o carimbo de data e hora pareça algo diferente do que realmente é. Provavelmente seria mais fácil ajustar essa funcionalidade e torná-la sobreposta ao seu próprio formato - por baixo da sobreposição, estará o carimbo de data / hora padrão usado por inúmeras funções org-modee que não pode ser facilmente alterado (na minha opinião) - existe até um observe na sequência de documentos a variável timestamp que desaconselha ajustes.
lawlist
org-time-stamp-formatsé uma variável definida em org.el. Seu valor é ("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")Esta variável pode ser arriscada se usada como uma variável local do arquivo. Documentação: Formatos format-time-stringusados ​​para carimbos de data e hora. Não é recomendável alterar essa constante. Veja também, o costume tempo formato de carimbo: orgmode.org/manual/Custom-time-format.html#Custom-time-format
lawlist
Eu acho que não expliquei corretamente. Não estou tentando alterar a aparência do carimbo de data e hora. Estou bem com o formulário normal <% Y-% m-% d% a>. O que eu quero terminar é o equivalente a "PRAZO: <2015-01-13 ter>", mas, em vez de digitá-lo, quero que ele venha da planilha, que foi calculada. Existe uma maneira de transportar essa informação? Ou existe outra maneira de fornecer algo depois de "PRAZO:" (como talvez elisp, onde eu possa calcular a data) em que ela será interpretada como uma data?
Jtgd
Não tenho uma resposta, mas gostaria de lançar algumas idéias. Em geral, o buffer da agenda organizacional é apenas uma bonita cópia e colagem dos arquivos org-agenda-primas. Em um tópico recente, eu percorro os arquivos da agenda organizacional para trás e paro no título de cada entrada para tratar o carimbo de data e hora como se fosse x número de dias AD para fazer alguns cálculos adicionais (por exemplo, se algo é devido hoje ou em atraso). emacs.stackexchange.com/a/5700/2287 Em teoria, você pode parar em cada cabeçalho, fazer seus cálculos e gerar um buffer de agenda personalizado. Isso não é trivial, mas interessante.
Lawlist)
Bem, obrigado por sua resposta na lista de leis, achei que havia uma maneira de obter uma data na agenda, além de digitar uma string literal. Talvez eu possa descobrir as funções usadas quando a agenda estiver sendo gerada. Eu gostaria que houvesse algo como uma função 'eval' que examinasse novamente a saída de uma função.
Jtgd

Respostas:

4

Tente o seguinte:

Calcule o prazo em uma planilha, também conhecida como tabela .

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
| # | [2014-12-15 Mon] | 10 | <2014-12-25 Thu> |
#+TBLFM: $4=$2+$3;D

Crie uma nova tabela 1x1 que faça referência ao prazo calculado da primeira tabela usando a remote(NAME-OR-ID,REF)função

#+NAME: mydeadline
| <2015-01-13 Tue> |
#+TBLFM: $1=remote(mytbl,@1$4)

Passe a tabela de prazo 1x1 como variável via cabeçalho :var name=value para o SRC bloco nomeado , por exemplo, set_deadline elisp code block abaixo.

#+NAME: set_deadline
#+HEADER: :var the_date=mydeadline
#+HEADER: :results  raw replace output 
#+begin_src elisp
   (princ (format "DEADLINE: %s" ( car (car the_date))))
#+end_src

Avalie o bloco SRC usando C-c C-ce o prazo será adicionado ao arquivo de modo organizacional em um #+RESULTS:bloco.

Adicionar o :results raw cabeçalho ao bloco de código força a saída para o formato org-mode, que será reconhecido como uma instrução org regular.

#+RESULTS: set_deadline
DEADLINE: <2015-01-13 Tue>

Como um bônus adicional, o uso de um bloco src nomeado também incentiva a reutilização de código por meio de chamadas de função em linha.

Como antes, avalie cada função embutida usando C-c C-ce um novo prazo será adicionado ao arquivo de modo organizacional.

#+NAME: first-deadline
call_set_deadline(the_date=mydeadline)[ :results raw ]

#+RESULTS: first-deadline
DEADLINE: <2015-01-13 Tue>

#+NAME: my-other-deadline
| <2014-12-25 Thu> |
#+TBLFM: $1=remote(mytbl,@2$4)

#+NAME: second-deadline
call_set_deadline(the_date=my-other-deadline)[ :results raw ]

#+RESULTS: second-deadline
DEADLINE: <2014-12-25 Thu>

Espero que tenha ajudado!

Nota: Esse código foi testado usando as seguintes versões do emacs e org-mode.

GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)
Org-mode version 8.2.10 (8.2.10-29-g89a0ac-elpa)
Melioratus
fonte
@jtgd, esta resposta ajudou?
Melioratus
Sim, muito. Ver abaixo.
jtgd
@jtgd Obrigado! Você fez meu dia! No que diz respeito ao replacenão se comportar conforme o esperado, tente atualizar o rawcabeçalho com o drawercabeçalho. Depois que troquei, tudo funcionou como esperado. Espero que ajudei! Obrigado por fazer sua pergunta e seu código elisp!
Melioratus
@jtgd - Acabei de publicar outro exemplo que usa pequenos blocos de código escritos em eLisp, Perl, bash, Python e Ruby para transformar texto em uma lista de caixas de seleção.
Melioratus
Oh, obrigado novamente! A drawercoisa funciona perfeita agora. Tanto para aprender sobre o modo organizacional, é bom ter assistentes como você por perto. Quanto aos outros exemplos publicados, tentei um e funciona rawsem anexar. Mas meu aplicativo funciona, então estou feliz.
Jtgd
1

Muito obrigado Melioratus, que resposta excelente! É incrível como você usou os vários mecanismos do modo Org para fazer isso. A parte mais significativa disso para mim foi o :results rawtexto produzido a ser verificado novamente na criação da agenda. Essa foi a chave.

Quando examinei como expandir isso para lidar com muitas datas, me perguntei se não poderia simplesmente fazer os cálculos de datas no elisp. Ainda sou muito novo para elisp, mas tentei um pouco e descobri isso.

Minha tarefa é calcular a data em que meus medicamentos acabam adicionando 30 dias ao dia em que inicio a garrafa. O que eu fiz foi isso.

No meu .emacs, escrevi algumas funções:

(defun date-high-low (secs)
  "Split int into high-low words"
  (list (/ secs 65536) (% secs 65536)))

(defun date-plus-days (datestr days)
  "Generate org-style date string from date + days offset"
  (format-time-string "<%Y-%m-%d %a>" (date-high-low (truncate (+ (org-time-string-to-seconds datestr) (* days 86400))))))

(defun org-header-date-plus-days (fmt datestr days)
  "Use above to build final org header entry from format string"
  (princ (format fmt (date-plus-days datestr days))))

Tentei manter essas funções genéricas e não focadas nos remédios para reutilização. Pode haver maneiras melhores de fazer isso, como eu disse que sou novato.

Então, no meu arquivo .org, faço o seguinte:

#+HEADER: :results raw output replace
#+begin_src elisp
    (org-header-date-plus-days "** MED LAST DAY Med-1\nDEADLINE: %s\n" "[2014-12-14 Sun]" 30)
    (org-header-date-plus-days "** MED LAST DAY Med-2\nDEADLINE: %s\n" "[2014-12-22 Mon]" 54)
    (org-header-date-plus-days "** MED LAST DAY Med-3\nDEADLINE: %s\n" "[2015-01-02 Fri]" 60)
#+end_src

Bonito e arrumado, uma linha por instância. Fazer Cc Cc no bloco gera a manchete e DEADLINE com a data e aparece perfeitamente na agenda. Funciona bem e estou feliz com os resultados. Mais uma vez obrigado pela dica para você e lista de advogados.

ps A única coisa que não funciona é a replace. Ele sempre é anexado ao bloco # + RESULTS, então eu tenho que excluí-lo antes de gerá-lo. É menor, mas não entendo o porquê.

jtgd
fonte