Como fazer com que a org solicite um carimbo de data / hora, ao alterar o estado de um TODO?

7

Tenho tantas tarefas que faço longe do meu computador com o emacs. Agora, quando mudo o estado de um TODO, ele apenas registra a hora atual na gaveta. Mas a diferença com a hora real do evento pode levar muitas horas, se não dias.

Existe uma maneira de solicitar um registro de data e hora que eu gostaria que ele registrasse?

koddo
fonte

Respostas:

6

Eu queria o mesmo comportamento "eu fiz isso ontem" por um tempo e nunca tentei implementá-lo. Mas agora, se eu conseguir pontos por isso ...

Esse comportamento parece estar embutido no código org-todo. A linha org.elque define o carimbo de data / hora FECHADO é (org-add-planning-info 'closed (org-current-effective-time))e as notas do LOGBOOK são adicionadas por org-add-log-setup, que, por sua vez, chama org-effective-current-time. org-effective-current-timefaz o que parece e retorna o tempo efetivo.

A solução óbvia é mudar temporariamente org-effective-current-timepara algo que solicite uma data. Porém, a data é solicitada várias vezes a cada chamada, o que é irritante. Não conheço uma boa maneira de evitá-lo, mas você pode salvar o valor inserido pelo usuário e mantê-lo por perto até o final da função.

Esse código parece funcionar e solicita apenas uma vez quando uma alteração de estado seria registrada.

(defun org-todo-with-date (&optional arg)
  (interactive "P")
  (cl-letf* ((org-read-date-prefer-future nil)
             (my-current-time (org-read-date t t nil "when:" nil nil nil))
            ((symbol-function #'org-current-effective-time)
             #'(lambda () my-current-time)))
    (org-todo arg)
    )) 
erikstokes
fonte
Ótimo, obrigado. Eu refatorei seu código um pouco. Sinta-se à vontade para colar isso na sua resposta: gist.github.com/koddo/aa6d497e0d1df4023915
koddo
11
Parece que a próxima ocorrência de uma tarefa repetida (por exemplo .+7d) não seria agendada corretamente com esta função (é agendada como se a tarefa tivesse sido concluída hoje).
xji
@ xji Também fiquei chateado com esse comportamento, mas não tenho uma solução. Esses tipos de hacks são muito frágeis.
precisa saber é o seguinte
@erikstokes Sim, agora estou pensando em desistir do modo organizacional como a ferramenta para gerenciar tarefas / hábitos recorrentes. Alguns aplicativos móveis fazem isso melhor. Vou tentar usá-lo para produzir uma lista de tarefas únicas com prioridade anexada, revisá-las todos os dias e colocar registros de data e hora para agendar minha agenda diária.
Xji 22/04/19
2

Você pode colocar mais hacks sobre a primeira resposta para resolver o problema com o agendamento de repetidores que não são atualizados corretamente. Observe que se LAST_REPEATestiver definido, será definido como a data real, não a data escolhida. Eu gostaria que a Org adicionasse isso como um recurso de primeira classe; a data real vaza org-todoem muitos lugares; Tenho certeza de que essa resposta ainda falta alguns:

    (defun org-todo-with-date (&optional arg)
      (interactive "P")
      (cl-letf* ((org-read-date-prefer-future nil)
                 (my-current-time (org-read-date t t nil "when:" nil nil nil))
                 ((symbol-function #'current-time)
                  #'(lambda () my-current-time))
                 ((symbol-function #'org-today)
                  #'(lambda () (time-to-days my-current-time)))
                 ((symbol-function #'org-current-effective-time)
                  #'(lambda () my-current-time)))
        (org-todo arg)))
Alex
fonte
0

E aqui está outra camada para corrigir o caso LAST_REPEAT:

(defun org-todo-with-date (&optional arg)
  (interactive "P")
  (cl-letf* ((org-read-date-prefer-future nil)
             (my-current-time (org-read-date t t nil "when:" nil nil nil))
             ((symbol-function 'current-time)
              #'(lambda () my-current-time))
             ((symbol-function 'org-today)
              #'(lambda () (time-to-days my-current-time)))
             ((symbol-function 'org-current-effective-time)
              #'(lambda () my-current-time))
             (super (symbol-function 'format-time-string))
             ((symbol-function 'format-time-string)
              #'(lambda (fmt &optional time time-zone)
                  (funcall super fmt my-current-time time-zone))))
    (org-todo arg)))

espero que format-time-stringseja chamado apenas org-auto-repeat-maybeno org-todocontexto e apenas para LAST_REPEATinserção.

De qualquer forma, você sempre pode copiar o org-tododefun para o arquivo init do emacs.el e modificá-lo lá, em vez das funções de seleção de cereja com cl-letf(embora seja legal fazê-lo)

Nosferatu
fonte