Mostrar blocos de tempo gratuitos na agenda do org-mode

12

Gostaria de facilitar a localização de quais blocos de tempo são gratuitos na minha agenda do modo organizacional.

Por exemplo, se eu tiver dois compromissos, um das 9h30 às 10h30 e outro das 11h15 às 12h30, gostaria de ver rapidamente que o bloco das 10h30 às 11h15 é gratuito.

Em outras palavras, desejo distinguir o tempo livre tão facilmente quanto em uma agenda gráfica, como o calendário do Google.

Existe uma maneira de facilitar a visualização dos blocos vazios de tempo? Talvez para colorir os blocos vazios com mais de um determinado número de minutos?

scaramouche
fonte
2
Isso org-agenda-time-gridnão é suficiente para suas necessidades? gnu.org/software/emacs/manual/html_node/org/…
lawlist
2
A grade não é suficiente, pois é exibida mesmo quando o tempo está ocupado (por exemplo, se houver uma reunião das 9h30 às 10h30, haverá uma linha de grade às 10h). Gostaria que os horários de ocupado e não ocupado fossem fáceis de distinguir.
scaramouche
1
Eu pensei um pouco mais sobre essa funcionalidade. Acredito que o mais útil e mais simples de implementar seria alterar a cor do bloco de tempo (apenas o nome do bloco de tempo, por exemplo, 8: 00-9: 00) para os blocos de tempo com mais de uma quantidade determinada de tempo livre (por exemplo, mais de 15 minutos). A cor e o tempo livre mínimo devem ser configuráveis ​​pelo usuário.
scaramouche
3
@scaramouche, um usuário da lista de discussão em modo organizacional ( orgmode.org/worg/org-mailing-list.html ) pergunta se você já tentou calfw( emacswiki.org/emacs/Calfw ).
precisa saber é o seguinte
2
@daveloyall, muito obrigado por apontar para a discussão da lista de discussão. Eu apenas tentei o bezerro (e é lindo!), Mas parece não ter a função que eu quero (detectar visualmente os horários de abertura do dia). Para aqueles que querem experimentar o calfw + org (altamente recomendado): obtenha o bezerro de Melpa init.el, inclua (require 'calfw-org), inclua e ligue para o calendário M-x cfw:open-org-calendar.
precisa saber é o seguinte

Respostas:

2

Por causa dessa questão, observei a função org-agenda-add-time-grid-maybeque cria a grade do tempo. O código postado lá (que não foi escrito por mim) remove uma linha de grade se o tempo estiver ocupado, conforme solicitado no comentário do OP.

Como você, eu queria criar um bloco visual de alguma forma. Ao misturar o código original org-agenda-add-time-grid-maybee o defadvice de Michael Ekstrand postado no outro segmento, vim com o seguinte código para org-agenda-add-time-grid-maybe. Ele exibirá as linhas de grade em uma cor diferente (no momento em que uso a face org-archived) e os tempos serão seguidos por uma sequência diferente. Ambos podem ser alterados ao seu gosto.

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

Obviamente, seria mais elegante usar o defadvice, mas não consegui descobrir exatamente onde intervir. A função em si passa por todos os tempos da grade (configurada org-agenda-time-grid) e cria uma nova lista com a grade final, incluindo as faces (novas).

Fabian
fonte
1
Útil, mas realmente espero que alguém encontre uma solução que não envolva a substituição direta de uma função org-agenda.
precisa
Eu concordo absolutamente! Infelizmente, meu conhecimento do elisp e do código do modo organizacional não é suficiente para obter um problema de funcionamento. Talvez alguém possa ajudar aqui, possivelmente usando parte do código "meu".
Fabian