回答:
私はしばらくの間、まったく同じ「私はこれを昨日行いました」の動作を望んでおり、それを実装しようとすることはありませんでした。でもポイントがもらえたら…
この動作はにハードコードされているようorg-todo
です。org.el
CLOSEDタイムスタンプを設定する行はで(org-add-planning-info 'closed (org-current-effective-time))
あり、LOGBOOKのメモはによって追加されorg-add-log-setup
ますorg-effective-current-time
。org-effective-current-time
それがどのように聞こえるかを行い、有効時間を返します。
明白な解決策はorg-effective-current-time
、日付を求めるプロンプトに一時的に変更することです。しかし、それから、すべての呼び出しで日付を複数回要求されます。これは煩わしいことです。それを回避する良い方法はわかりませんが、ユーザーが入力した値を保存して、関数が終了するまで保持することができます。
このコードは機能するようで、状態の変更がログに記録されるときに一度だけプロンプトを出します。
(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)
))
.+7d
:)がこの関数で正しくスケジュールされないようです(タスクが今日終了したかのようにスケジュールされています)。
最初の回答の上にさらにハックを重ねると、リピーターのスケジュールが正しく更新されないという問題に対処できます。LAST_REPEAT
が設定されている場合、選択された日付ではなく、実際の日付に設定されることに注意してください。Orgがこれをファーストクラスの機能として追加してくれることを願っています。実際の日付org-todo
は多くの場所に漏れます。この答えはまだいくつかを逃していると確信しています:
(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)))
そして、ここに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)))
うまくいけば、コンテキスト内からのみ挿入のためにformat-time-string
呼び出さorg-auto-repeat-maybe
れorg-todo
ますLAST_REPEAT
。
とにかく、あなたは常にコピーすることができorg-todo
、あなたに関数定義をemacs.elのinitファイルとして代わりに桜pickifying機能の存在、それを修正するcl-letf
(それを行うにはクールなのalthoughtそれのようなもの)