[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
caldiagram.png
Description: PNG image
- [O] calfw-org, view single org file; very ugly hack,
Brady Trainor <=