Вопрос

Intro:

Based on the existing code for Emacs' diary-sunrise-sunset, I attempted to create two new functions diary-sunrise and diary-sunset.

My reasons for this are included below under the heading "XY-description".

I have code below which seems to work, except when I restart with a new Emacs. I can fix this by momentarily using the original built-in diary-sunrise-sunset. From then on, my functions perform beautifully.

In other words, I have to use the built-in %%(diary-sunrise-sunset) just a one time before my %%(diary-sunrise) and %%(diary-sunset) will work.

Question:

Can you help me fix my use of these functions so that I do not have to take the awkward step of first getting the built-in function called?

The lines of code that seem suspicious to me are the ones that go

;;;###diary-autoload

While I have some idea of the necessity of loading programs, I am not sure what's going on here, or if this is where the issue lies. (I've never seen that particular syntax.)

I have tried M-: (require 'solar) and M-: (require 'diary), but neither have worked (and just now calendar). I have tried putting my code both in my .emacs and in the built-in .../lisp/calendar/solar.el (and byte-recompiling), but neither have worked.

My functions:

(They are each slight modifications of solar-sunrise-sunset-string and diary-sunrise-sunset, which are both defined in .../lisp/calendar/solar.el).

Sunrise:

(defun solar-sunrise-string (date &optional nolocation)
  "String of *local* time of sunrise and daylight on Gregorian DATE."
  (let ((l (solar-sunrise-sunset date)))
    (format
     "%s (%s hours daylight)"
     (if (car l)
     (concat "Sunset " (apply 'solar-time-string (car l)))
       "no sunset")
     (nth 2 l)
     )))
;; To be called from diary-list-sexp-entries, where DATE is bound.
;;;###diary-autoload
(defun diary-sunrise ()
  "Local time of sunrise as a diary entry.
  Accurate to a few seconds."
  (or (and calendar-latitude calendar-longitude calendar-time-zone)
      (solar-setup))
  (solar-sunrise-string date))

Sunset:

(defun solar-sunset-string (date &optional nolocation)
  "String of *local* time of sunset and daylight on Gregorian DATE."
  (let ((l (solar-sunrise-sunset date)))
    (format
     "%s (%s hours daylight)"
     (if (cadr l)
     (concat "Sunset " (apply 'solar-time-string (cadr l)))
       "no sunset")
     (nth 2 l)
     )))
;; To be called from diary-list-sexp-entries, where DATE is bound.
;;;###diary-autoload
(defun diary-sunset ()
  "Local time of sunset as a diary entry.
  Accurate to a few seconds."
  (or (and calendar-latitude calendar-longitude calendar-time-zone)
      (solar-setup))
  (solar-sunset-string date))

XY description:

I am using Emacs' Org-mode, and just starting to use agenda views. I like the builtin diary-sunrise-sunset function, but wanted to make some minor tweaks to make it more to my liking.

Basically, Org-mode's agenda view will extract the first time it sees from the diary sexp %%(diary-sunrise-sunset), for instance

Sat, Apr 5, 2014
Sunrise 6:43am (PDT), sunset 7:42pm (PDT) at Springfield, OH (12:59 hours daylight)

and thus make an entry of

6:43am........  Sunrise (PDT), sunset 7:42pm (PDT) at Springfield, OH (12:59 hours daylight)

in the agenda view.

What I would like it to do is something more like,

 6:43am........  Sunrise (PDT) (12:59 hours daylight)
 8:00am........  ----------------
10:00am........  ----------------
12:00pm........  ----------------
 2:00pm........  ----------------
 4:00pm........  ----------------
 5:51pm........  now - - - - - - - - - - - - - - - - - - - - - - - - -
 6:00pm........  ----------------
 7:42pm........  Sunset (PDT) (12:59 hours daylight)

Where the data is split into the two times, rather than all written only at the sunrise time.

Bonus:

a snippet so that C-c a d will give you a nice day agenda view:

(setq org-agenda-custom-commands 
      '(("d" "day's agenda"
         agenda ""
         (
          (org-agenda-files '("/e/org/agendatest.org"))
          (org-agenda-prefix-format "%t %s")
          (org-agenda-span 'day)
          (org-agenda-timegrid-use-ampm t)
          )
         )
        ))
Это было полезно?

Решение

In the last paragraph of my question (eighth paragraph?), I lied, (require 'solar) was the answer... I did not try it hard enough as it didn't respond to auto-completion.

The scenic route to the answer took me to these distractions:

I did some Edebugging wondering if anything I was using had an autoload cookie (not completely understanding it yet), but then noticed there was a (provide 'solar) at the end of solar.el, so then I figured (require 'solar) had to work. It did and that was that.

From the code in my question, I remove the autoload cookies (not sure if that's necessary), and add (require 'solar), and it works! Enjoy!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top