Tampilkan blok waktu gratis dalam agenda mode-org

12

Saya ingin membuatnya mudah untuk menemukan di mana blok waktu bebas dalam agenda mode-org saya.

Misalnya, jika saya memiliki dua janji satu jam 9:30 pagi - 10:30 pagi dan 11:15 pagi - 12:30 malam, saya ingin melihat sekilas bahwa blok 10:30 pagi - 11:15 pagi gratis.

Dengan kata lain, saya ingin dapat membedakan waktu luang semudah dilakukan dalam agenda grafis seperti kalender Google.

Apakah ada cara untuk membuat blok waktu yang kosong mudah dilihat? Mungkin untuk mewarnai blok kosong yang lebih lama dari jumlah menit yang diberikan?

pengecut yg berlagak
sumber
2
Apakah ini org-agenda-time-gridtidak cukup untuk kebutuhan Anda? gnu.org/software/emacs/manual/html_node/org/…
lawlist
2
Kotak tidak cukup, karena muncul meskipun waktu sibuk (misalnya, jika ada rapat 9:30 pagi - 10:30 pagi, akan ada garis kotak pada pukul 10:00 pagi). Saya ingin waktu sibuk dan tidak sibuk mudah dibedakan.
scaramouche
1
Saya telah memikirkan sedikit lebih banyak tentang fungsi ini. Saya percaya yang paling berguna dan paling sederhana untuk diterapkan adalah mengubah warna blok waktu (hanya nama blok waktu, misalnya, 8: 00-9: 00) untuk blok waktu yang memiliki lebih dari jumlah tertentu waktu luang (misalnya, lebih dari 15 menit). Baik warna dan waktu luang minimum harus dapat dikonfigurasi pengguna.
scaramouche
3
@scaramouche, pengguna di milis mode-org ( orgmode.org/worg/org-mailing-list.html ) menanyakan apakah Anda sudah mencoba calfw( emacswiki.org/emacs/Calfw ).
daveloyall
2
@daveloyall, terima kasih banyak telah menunjukkan diskusi milis. Saya baru saja mencoba betis (dan itu indah!), Tetapi sepertinya tidak memiliki fungsi yang saya inginkan (untuk melihat secara visual waktu terbuka pada hari itu). Bagi mereka yang ingin mencoba betis + org (sangat disarankan): dapatkan betis dari Melpa, di init.el, sertakan (require 'calfw-org), dan untuk memanggil kalender lakukan M-x cfw:open-org-calendar.
scaramouche

Jawaban:

2

Karena pertanyaan saya sendiri, saya melihat fungsi org-agenda-add-time-grid-maybeyang menciptakan grid waktu. Kode yang diposting di sana (yang tidak ditulis oleh saya) tidak menghapus garis kisi jika waktu sibuk seperti yang diminta dalam komentar OP.

Seperti Anda, saya ingin membuat blok visual dalam beberapa cara. Dengan mencampur kode asli org-agenda-add-time-grid-maybedan defadvice oleh Michael Ekstrand diposting di utas lainnya saya datang dengan kode berikut untuk org-agenda-add-time-grid-maybe. Ini akan menampilkan garis grid dalam warna yang berbeda (untuk saat ini saya menggunakan wajah org-archived) dan waktu akan diikuti oleh string yang berbeda. Keduanya dapat diubah sesuai keinginan Anda.

(defun org-agenda-add-time-grid-maybe (list ndays todayp)
  "Add a time-grid for agenda items which need it.

LIST is the list of agenda items formatted by `org-agenda-list'.
NDAYS is the span of the current agenda view.
TODAYP is t when the current agenda view is on today."

  (catch 'exit
   (cond ((not org-agenda-use-time-grid) (throw 'exit list))
         ((and todayp (member 'today (car org-agenda-time-grid))))
         ((and (= ndays 1) (member 'daily (car org-agenda-time-grid))))
         ((member 'weekly (car org-agenda-time-grid)))
         (t (throw 'exit list)))
   (let* ((blocks (mapcar (lambda (x)
                            (let ((start (get-text-property 1 'time-of-day x))
                                  (dur (get-text-property 1 'duration x)))
                              (cond
                               ((and start dur) (cons start
                                                      (org-time-from-minutes
                                                       (truncate
                                                        (+ dur (org-time-to-minutes start))))))
                               (start start)
                               (t nil))))
                          list))
          (have (delq nil (mapcar
                           (lambda (x) (get-text-property 1 'time-of-day x))
                           list)))
          (string (nth 3 org-agenda-time-grid))
          (gridtimes (nth 1 org-agenda-time-grid))
          (req (car org-agenda-time-grid))
          (remove (member 'remove-match req))
          new time)
     (if (and (member 'require-timed req) (not have))
         ;; don't show empty grid
         (throw 'exit list))

     (while (setq time (pop gridtimes))
       (unless (and remove (member time have))
         (let* ((windows (delq nil blocks))
                (hit nil))
           (dolist (busy windows)
             (unless hit
               (when (and (>= time (car busy))
                          (< time (cdr busy)))
                 (setq hit t))))
           (setq time (replace-regexp-in-string " " "0" (format "%04s" time)))
           (if hit
               (progn
                 (push (org-agenda-format-item
                        (concat string " dito") string nil "" nil
                        (concat (substring time 0 -2) ":" (substring time -2)))
                       new)
                 (put-text-property 2 (length (car new)) 'face 'org-archived (car new)))
             (progn
               (push (org-agenda-format-item
                      nil string nil "" nil
                      (concat (substring time 0 -2) ":" (substring time -2)))
                     new)
               (put-text-property 2 (length (car new)) 'face 'org-time-grid (car new))))
           (setq hit nil))))

     (when (and todayp org-agenda-show-current-time-in-grid)
       (push (org-agenda-format-item
              nil org-agenda-current-time-string nil "" nil
              (format-time-string "%H:%M "))
             new)
       (put-text-property
        2 (length (car new)) 'face 'org-agenda-current-time (car new)))

     (if (member 'time-up org-agenda-sorting-strategy-selected)
         (append new list)
       (append list new)))))

(defun org-time-to-minutes (time)
  "Convert an HHMM TIME to minutes."
  (+ (* (/ time 100) 60) (% time 100)))

(defun org-time-from-minutes (minutes)
  "Convert a number of MINUTES to an HHMM time."
  (+ (* (/ minutes 60) 100) (% minutes 60)))

Jelas, akan lebih elegan untuk menggunakan defadvice, tetapi saya tidak bisa mencari tahu di mana tepatnya untuk campur tangan. Fungsi itu sendiri melewati setiap waktu kisi (ditetapkan org-agenda-time-grid) dan membuat daftar baru dengan kisi akhir termasuk wajah (baru).

Fabian
sumber
1
Berguna, tapi saya sangat berharap seseorang datang dengan solusi yang tidak melibatkan langsung mengesampingkan fungsi org-agenda.
holocronweaver
Saya sangat setuju! Sayangnya, pengetahuan saya tentang elisp dan kode mode-org tidak cukup untuk menghasilkan defadvice yang berfungsi. Mungkin, orang lain dapat membantu di sini, mungkin menggunakan beberapa kode "saya".
Fabian