emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] calfw-org, view single org file; very ugly hack


From: Brady Trainor
Subject: [O] calfw-org, view single org file; very ugly hack
Date: Sat, 19 Apr 2014 18:04:17 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0


I'm basically showing this horrible hack for any that might like how I setup a cloud calendar, and as a catalyst for the topic "will calfw for org find improvement?".

(Meta: also, a test to see if pics can be included on gmane, the graphviz source is at bottom. What's the best way to use graphics in discussion? Links?)

---

So I think I'm gravitating to the org-caldav package, with an easy to acquire owncloud calendar.

This will allow me to work on my use of orgmode sheltered from outside awkward apps in a convenient and effective way. For now I will probably just cut and paste between the org files I'm really working in, and the org-caldav result pulled in from a cloud calendar.

So I think of the owncloudcalendar.org file as being sandboxed from all my org-agenda-files that I'm really working in.

Further, I have a feeling having the calfw calendar framework view would be really nice to have as an option. Unfortunately, It doesn't seem to interact very natively with Org-modes multitudinous options and filters.

I wanted to be able to include calfw "sources" optionally from agenda files versus the owncloudcalendar.org file.

So I searched for what seems to be a linear string of functions between `cfw:org-create-source' and `org-agenda-files', and made these horrible modifications which do the trick for me.

Was there a better way (outside of joining development of calfw-org)?

my road map:

org-agenda-files (var) -> org-agenda-files (func) -> cfw:org-collect-schedules-period -> cfw:org-schedule-period-to-calendar -> cfw:org-create-source-> cfw:open-org-calendar

(Word search on sandbox and brady will reveal where I made edits below. For example, `cfw:org-collect-schedules-period' |--> `cfw:brady-org-collect-schedules-period'.)

 ____________
/

#+BEGIN_SRC emacs-lisp
(setq sandboxed-org-caldav-file '("/e/org/owndrivecalendar.org"))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun sandboxed-org-caldav-file (&optional unrestricted archives)
  "Get the list of agenda files.
Optional UNRESTRICTED means return the full list even if a restriction
is currently in place.
When ARCHIVES is t, include all archive files that are really being
used by the agenda files.  If ARCHIVE is `ifmode', do this only if
`org-agenda-archives-mode' is t."
  (let ((files
         (cond
          ((and (not unrestricted) (get 'sandboxed-org-caldav-file 
'org-restrict)))
          ((stringp sandboxed-org-caldav-file) (org-read-agenda-file-list))
          ((listp sandboxed-org-caldav-file) sandboxed-org-caldav-file)
          (t (error "Invalid value of `sandboxed-org-caldav-file'")))))
    (setq files (apply 'append
                       (mapcar (lambda (f)
                                 (if (file-directory-p f)
                                     (directory-files
                                      f t org-agenda-file-regexp)
                                   (list f)))
                               files)))
    (when org-agenda-skip-unavailable-files
      (setq files (delq nil
                        (mapcar (function
                                 (lambda (file)
                                   (and (file-readable-p file) file)))
                                files))))
    (when (or (eq archives t)
              (and (eq archives 'ifmode) (eq org-agenda-archives-mode t)))
      (setq files (org-add-archive-files files)))
    files))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-collect-schedules-period (begin end)
  "[internal] Return org schedule items between BEGIN and END."
  (let ((org-agenda-prefix-format " ")
        (span 'day))
    (setq org-agenda-buffer
      (when (buffer-live-p org-agenda-buffer)
        org-agenda-buffer))
    (org-compile-prefix-format nil)
    (loop for date in (cfw:enumerate-days begin end) append
(loop for file in (or cfw:org-icalendars (sandboxed-org-caldav-file nil 'ifmode))
                append
                (progn
                  (org-check-agenda-file file)
                  (apply 'org-agenda-get-day-entries
                         file date
                         cfw:org-agenda-schedule-args))))))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-schedule-period-to-calendar (begin end)
  "[internal] Return calfw calendar items between BEGIN and END
from the org schedule data."
  (loop
with cfw:org-todo-keywords-regexp = (regexp-opt org-todo-keywords-for-agenda) ; dynamic bind
   with contents = nil with periods = nil
   for i in (cfw:brady-org-collect-schedules-period begin end)
   for date = (cfw:org-tp i 'date)
   for line = (funcall cfw:org-schedule-summary-transformer i)
   for range = (cfw:org-get-timerange line)
   if range do
   (unless (member range periods)
     (push range periods))
   else do
   (setq contents (cfw:contents-add
                   (cfw:org-normalize-date date)
                   line contents))
   finally return (nconc contents (list (cons 'periods periods)))))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-create-source (&optional color)
  "Create org-agenda source."
  (make-cfw:source
   :name "org-agenda"
   :color (or color "Seagreen4")
   :data 'cfw:brady-org-schedule-period-to-calendar))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-open-org-calendar ()
  "Open an org schedule calendar in the new buffer."
  (interactive)
  (let* ((source1 (cfw:brady-org-create-source))
         (cp (cfw:create-calendar-component-buffer
              :view 'month
              :contents-sources (list source1)
              :custom-map cfw:org-schedule-map
              :sorter 'cfw:org-schedule-sorter)))
    (switch-to-buffer (cfw:cp-get-buffer cp))))
#+END_SRC

\____________
/

(defun my-calfw-both ()
  (interactive)
  (cfw:open-calendar-buffer
   :contents-sources
   (list (cfw:brady-org-create-source "Green")
         (cfw:org-create-source "Blue")
         )))

\____________
/

#+BEGIN_SRC dot :file ./gv/caldiagram.png :cache yes :cmdline -Tpng
digraph {
        { rank = same
                orgmode
                diary
        }
        gcal -> ics [ dir = "both" label = "GCALDaemon (sync)" ]
        owncloud -> ics2 [ dir = "both" ]
        ics2 -> orgmode [ dir = "both" label = "org-caldav" ]
        ics2 [ label = "ics" ]
        ics -> diary [ dir = "both"
                      // label = "icalendar.el (manual)"
                      ]
        diary -> agendaview
        orgmode -> ics [ constraint = false
// label = "org-export-icalendar-combine-agenda-files"
                        ]
        orgmode -> agendaview
        diary -> calendar
        diary -> calfw
        ics -> calfw
        orgmode -> calfw
}
#+END_SRC

\____________



Brady

















Attachment: caldiagram.png
Description: PNG image


reply via email to

[Prev in Thread] Current Thread [Next in Thread]