Làm cách nào để tạo dấu nhắc org cho dấu thời gian, khi thay đổi trạng thái của TODO?


7

Tôi có rất nhiều nhiệm vụ tôi làm cách xa máy tính của mình bằng emacs. Bây giờ, khi tôi thay đổi trạng thái của TODO, nó chỉ ghi lại thời gian hiện tại vào ngăn kéo. Nhưng sự khác biệt với thời gian thực tế của sự kiện có thể là nhiều giờ, nếu không phải là ngày.

Có cách nào để làm cho dấu nhắc về dấu thời gian tôi muốn đăng nhập không?

Câu trả lời:


6

Tôi đã muốn chính xác hành vi "Tôi đã làm điều này ngày hôm qua" trong một thời gian và không bao giờ có ý định thực hiện nó. Nhưng bây giờ nếu tôi có thể nhận được điểm cho nó ....

Hành vi này dường như được mã hóa cứng vào org-todo. Dòng trong org.elđó đặt dấu thời gian ĐÓNG là (org-add-planning-info 'closed (org-current-effective-time))và ghi chú LOGBOOK được thêm vào org-add-log-setup, theo đó lần lượt gọi org-effective-current-time. org-effective-current-timelàm những gì nó nghe như và trả lại thời gian hiệu quả.

Giải pháp rõ ràng là tạm thời thay đổi org-effective-current-timethành thứ gì đó nhắc nhở một ngày. Nhưng sau đó chúng tôi được nhắc hẹn nhiều lần với mỗi cuộc gọi, điều này thật khó chịu. Tôi không biết một cách tốt để tránh nó, nhưng bạn chỉ có thể lưu giá trị đầu vào của người dùng và giữ nó cho đến khi kết thúc chức năng.

Mã này dường như hoạt động và chỉ nhắc một lần khi thay đổi trạng thái sẽ được ghi lại.

(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)
    )) 

Cảm ơn rất nhiều. Tôi tái cấu trúc mã của bạn một chút. Xin vui lòng dán câu này vào câu trả lời của bạn: gist.github.com/koddo/aa6d497e0d1df4023915
koddo

1
Có vẻ như sự xuất hiện tiếp theo của một nhiệm vụ lặp lại (ví dụ .+7d) sẽ không được lên lịch chính xác với chức năng này (nó được lên lịch như thể nhiệm vụ đã kết thúc ngày hôm nay).
xji

@xji Tôi cũng thấy khó chịu vì hành vi đó, nhưng không có giải pháp. Những loại hack này đều rất dễ vỡ.
erikstokes

@erikstokes Vâng, bây giờ tôi đang nghĩ đến việc từ bỏ chế độ org như là công cụ để quản lý các nhiệm vụ / thói quen định kỳ. Một số ứng dụng di động làm điều đó tốt hơn. Tôi sẽ cố gắng chỉ sử dụng nó để tạo danh sách các nhiệm vụ một lần được ưu tiên đính kèm, xem xét chúng mỗi ngày và đặt dấu thời gian lên chúng để lên lịch cho chương trình nghị sự hàng ngày của tôi.
xji

2

Bạn có thể thêm nhiều bản hack vào đầu câu trả lời đầu tiên để giải quyết vấn đề với các bộ lặp lập lịch không cập nhật chính xác như vậy. Lưu ý rằng nếu LAST_REPEATđược đặt, nó sẽ được đặt thành ngày thực tế, không phải ngày đã chọn. Tôi ước Org sẽ thêm tính năng này như một tính năng hạng nhất; ngày rò rỉ thực tế org-todoở nhiều nơi; Tôi chắc chắn câu trả lời này vẫn còn thiếu một số:

    (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

Và đây là một lớp khác để sửa trường hợp 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)))

hy vọng format-time-stringchỉ được gọi từ org-auto-repeat-maybetrong org-todongữ cảnh và chỉ để LAST_REPEATchèn.

Dù sao, bạn luôn có thể sao chép org-tododefun vào tệp init emacs.el của mình và sửa đổi nó ở đó thay vì các chức năng chọn cherry bằng cl-letf(mặc dù nó rất tuyệt để làm điều đó)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.