org-time-stamp-this-week.el

タスク管理に関しては、OrgファイルとOrg Agendaを使い週次で管理しています。そしてOrgファイルが混沌化するにつれて、タイムスタンプの更新がめんどくさくなるのために一部コマンド化しました。

例えば、<2018-05-22 Tue>--<2018-05-27 Sun>を入力するには、[C-c .]して「ポップアップカレンダーから日付を選択」を二度繰り返さなければなりませんが、今週の始まりと終わりの日付は入力せずともわかるので、ひとつのコマンドにできます。

デフォルトでは今日から週の終わりまでとなりますが、[C-u]をつけると週の始まりからとなります。またタイムスタンプ上では、それを上書きします。

(defun org-time-stamp-this-week (&optional from-start-on-weekday)
  "Insert a date stamp between a week like a command `org-time-stamp`.
By default, a week start from today to a weekend defined by Org Agenda.
When called with a prefix argument, the start day is the day
`org-agenda-start-on-weekday` on this week."
  (interactive "P")
  (let* ((ts-range (when (or (org-at-date-range-p)
                             (org-at-timestamp-p 'lax))
                     (cons (match-beginning 0) (match-end 0))))
         (now (current-time))
         (current-dow (nth 6 (decode-time now)))
         (start-time (if (>= current-dow org-agenda-start-on-weekday)
                         (time-add now (* 86400 (- org-agenda-start-on-weekday current-dow)))
                       (time-add now (* 86400 (- (- org-agenda-start-on-weekday current-dow) 7)))))
         (end-time (time-add start-time (* 86400 6)))
         (stamp-format "<%Y-%m-%d %a>"))
    (unless from-start-on-weekday
      (setq start-time now))
    (when ts-range
      (goto-char (min (car ts-range) (cdr ts-range)))
      (delete-region (car ts-range) (cdr ts-range)))
    (insert
     (if (> 86400 (float-time (time-subtract end-time start-time)))
         (format-time-string stamp-format end-time)
       (format "%s--%s"
               (format-time-string stamp-format start-time)
               (format-time-string stamp-format end-time))))))

(gist)