TODOの状態を変更するときに、組織がタイムスタンプを要求するようにするにはどうすればよいですか?


7

emacsを使用すると、コンピュータから離れた場所で実行するタスクがたくさんあります。TODOの状態を変更すると、現在の時刻がドロワーに記録されるだけです。ただし、イベントの実際の時間との差は、数日ではないにしても、数時間になる場合があります。

ログに記録したいタイムスタンプを要求する方法はありますか?

回答:


6

私はしばらくの間、まったく同じ「私はこれを昨日行いました」の動作を望んでおり、それを実装しようとすることはありませんでした。でもポイントがもらえたら…

この動作はにハードコードされているようorg-todoです。org.elCLOSEDタイムスタンプを設定する行はで(org-add-planning-info 'closed (org-current-effective-time))あり、LOGBOOKのメモはによって追加されorg-add-log-setupますorg-effective-current-timeorg-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)
    )) 

まことにありがとうございます。私はあなたのコードを少しリファクタリングしました。これを回答に自由に貼り付けてください:gist.github.com/koddo/aa6d497e0d1df4023915
koddo

1
次の繰り返しタスク(例.+7d:)がこの関数で正しくスケジュールされないようです(タスクが今日終了したかのようにスケジュールされています)。
xji

@xji私もその振る舞いに悩まされてきましたが、解決策がありません。これらの種類のハックはすべて非常に壊れやすいものです。
erikstokes

@erikstokesええ、私は繰り返しのタスク/習慣を管理するためのツールとして組織モードをあきらめることを考えています。一部のモバイルアプリはそれをよりよく行います。優先順位を付けた1回限りのタスクのリストを作成し、毎日それらを確認し、タイムスタンプを付けて毎日の予定をスケジュールするために、それを使用してみます。
xji

2

最初の回答の上にさらにハックを重ねると、リピーターのスケジュールが正しく更新されないという問題に対処できます。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)))

0

そして、ここに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-maybeorg-todoますLAST_REPEAT

とにかく、あなたは常にコピーすることができorg-todo、あなたに関数定義をemacs.elのinitファイルとして代わりに桜pickifying機能の存在、それを修正するcl-letf(それを行うにはクールなのalthoughtそれのようなもの)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.