Khalid Rafi <[email protected]> writes:
> Can I track Org habits with an alternate calendar instead of Gregorian,
> such as Islamic calendar? Emacs already supports it. I want to set
> timestamps and repeaters according to that calendar.
Not out of the box and not easily, I think. Here is an attempt to
outline some possible approaches and considerations. Corrections and
other ideas are very welcome.
Emacs support for the Islamic calendar is limited. The Emacs calendar
displays Gregorian time, but includes functions for converting specific
dates to and from the Islamic calendar via "absolute" Julian days
according to one method of the several that exist. For example, to find
out that the upcoming Ramadan starts on February 18:
#+begin_example
(let ((fast-begins '(9 1 1447)))
(calendar-gregorian-from-absolute
(calendar-islamic-to-absolute fast-begins)))
=> (2 18 2026)
#+end_example
As Panayotis Manganaris observed elsewhere in this thread, the fact
that Org-mode allows putting Emacs diary sexps in timestamps suggests
some ways to access those calendar functions, but I think practical
use would require some kind of simplifying macro.
As for Org timestamps proper, they are based on Gregorian time and the
ISO-8601 format.
Assuming that one want to select, view, export, set repeaters for and
operate on Org timestamps according to the Islamic calendar, support
would be needed for:
1. Repeaters and operations on timestamps
Let's take that first, since it strikes me as the main stumbling
block. Everything one does to the timestamp will operate on the
underlying Gregorian representation. For repeaters such as =+1d= or
=+1w=, and operations such as adjusting the date one day
back/forward, this should not matter. For repeaters/adjustments like
=+1m= or =+1y=, results would probably differ from what the user
would expect based on the displayed Islamic date. For example, =[1
Ramadan 1447 +1y]= will not result in 1 Ramadan 1448 but in the date
one Gregorian year hence).
To overcome this would require new Org features to make timestamps
and repeaters work according to the logic of non-Gregorian calendars,
which sounds like a complex undertaking.
Unless and until someone takes on that project, I think people
wanting to use the Islamic calendar in Org as much as possible are
best served by mixed solutions where timestamps can be /entered/ and
/exported/ in Islamic-calendar form, but where Emacs transparently
/displays/ them as Gregorian.
(While display and export of custom timestamps are controlled by the
same variables, as discussed below, on a per-document basis they can
be controlled separately because =Local Variables:= is needed for
display and =#+BIND:= for export.)
2. Entering/selecting Islamic-calendar dates
This only requires an interactive function to read a date via
`calendar-islamic-read-date' from cal-islam.el, which is part of
Emacs, and insert its Gregorian equivalent as an Org timestamp,
which sounds doable.
3. Exporting (and maybe displaying) dates in a custom Islamic-calendar format
The recommended way of changing how timestamps are displayed and
exported (see [[info:org#Custom time format]]) is to customize the variables
`org-display-custom-times' and `org-timestamp-custom-formats'. The
latter uses a format understood by `format-time-string'
([[help:format-time-string]]), which does not include any way to access
Emacs calendar conversions as far as I can see.
It can use the locale's rendering via the ~%x~ and ~%c~ specifiers,
however, so this might work if there exists a variant of your system
locale with Islamic calendar, e.g. an imaginary variant US English
locale "en-US.utf8@islamic" or similar. I don't have one, and I'm not
quite sure where to find one and install it, but if you do (check
your /usr/share/i18n/SUPPORTED), I can walk you through the steps to
test it. (Note that locales may implement other ways of calculating
the Islamic calendar with results that differ from the Emacs
calendar; I believe there are ar-SA locales with an "umalqura"
calendar using astronomical calculations).
Otherwise, one way to go would be a feature request to allow a custom
function as the value of `org-timestamp-custom-formats', so we could
use the calendar functions for conversion. This might also be
preferable to the custom-format/locale approach because the results
would be compatible with those of the Emacs calendar.
Regards,
Christian