Add HTML versions of my init files
[website] / SYinits / 11-cal.html
diff --git a/SYinits/11-cal.html b/SYinits/11-cal.html
new file mode 100644 (file)
index 0000000..e8adbd7
--- /dev/null
@@ -0,0 +1,733 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- Created by htmlize-1.34 in css mode. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <title>11-cal.el</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta name="author" content="Steve Youngs" />
+    <meta name="owner" content="steve@sxemacs.org" />
+    <style type="text/css">
+    <!--
+      body {
+        color: #ffffff;
+        background-color: #000000;
+      }
+      .comment {
+        /* font-lock-comment-face */
+        color: #87ceeb;
+      }
+      .doc-string {
+        /* font-lock-doc-string-face */
+        color: #32cd32;
+      }
+      .function-name {
+        /* font-lock-function-name-face */
+        color: #ffff00;
+        font-weight: bold;
+      }
+      .keyword {
+        /* font-lock-keyword-face */
+        color: #fa8072;
+      }
+      .reference {
+        /* font-lock-reference-face */
+        color: #40e0d0;
+      }
+      .string {
+        /* font-lock-string-face */
+        color: #00cd00;
+      }
+      .type {
+        /* font-lock-type-face */
+        color: #1e90ff;
+      }
+      .variable-name {
+        /* font-lock-variable-name-face */
+        color: #ffdab9;
+      }
+
+      a {
+        color: #FF0000;
+        background-color: inherit;
+        font: inherit;
+        font-weight: bold;
+        text-decoration: underline;
+      }
+      a:hover {
+        color: #FFFFFF;
+        background-color: #FD00FD;
+        text-decoration: underline;
+      }
+      .img a:hover {
+        background-color: #000000;
+        text-decoration: none;
+      }
+    -->
+    </style>
+  </head>
+  <body>
+    <pre>
+<span class="comment">;; 11-cal.el --- Calendar Settings
+</span>
+<span class="comment">;; Copyright (C) 2007 - 2020 Steve Youngs
+</span>
+<span class="comment">;;     Author: Steve Youngs &lt;<a href="mailto:steve&#64;sxemacs.org">steve&#64;sxemacs.org</a>&gt;
+;; Maintainer: Steve Youngs &lt;<a href="mailto:steve&#64;sxemacs.org">steve&#64;sxemacs.org</a>&gt;
+;;    Created: &lt;2007-12-02&gt;
+;; Time-stamp: &lt;Thursday Apr  9, 2020 08:12:34 steve&gt;
+;;   Download: &lt;<a href="https://downloads.sxemacs.org/SYinits">https://downloads.sxemacs.org/SYinits</a>&gt;
+;;   HTMLised: &lt;<a href="https://www.sxemacs.org/SYinits/11-cal.html">https://www.sxemacs.org/SYinits/11-cal.html</a>&gt;
+;;   Git Repo: git clone https://git.sxemacs.org/syinit
+;;   Keywords: init, compile
+</span>
+<span class="comment">;; This file is part of SYinit
+</span>
+<span class="comment">;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions
+;; are met:
+;;
+;; 1. Redistributions of source code must retain the above copyright
+;;    notice, this list of conditions and the following disclaimer.
+;;
+;; 2. Redistributions in binary form must reproduce the above copyright
+;;    notice, this list of conditions and the following disclaimer in the
+;;    documentation and/or other materials provided with the distribution.
+;;
+;; 3. Neither the name of the author nor the names of any contributors
+;;    may be used to endorse or promote products derived from this
+;;    software without specific prior written permission.
+;;
+;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
+;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;; DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</span>
+<span class="comment">;;; Commentary:
+;;
+;;   My calendar/diary settings
+;;
+</span>
+<span class="comment">;;; Credits:
+;;
+;;   The HTML version of this file was created with Hrvoje Niksic's
+;;   htmlize.el which is part of the XEmacs "text-modes" package.
+;;
+</span>
+<span class="comment">;;; Todo:
+;;
+;;     
+</span>
+<span class="comment">;;; Code:
+;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Calendar
+</span>(<span class="keyword">require</span> '<span class="reference">cedet-compat</span>)
+(<span class="keyword">require</span> '<span class="reference">diary-lib</span>)
+<span class="comment">;(require 'calendar)
+</span>(setq 
+ calendar-latitude -27.47
+ calendar-longitude 153.02
+ calendar-location-name "<span class="doc-string">Brisbane</span>"
+ calendar-time-zone 600
+ cal-tex-diary t
+<span class="comment">; calendar-date-display-form ; see: "Howm Integration" below
+; '((if dayname (concat dayname ", ")) day " " monthname " " year)
+</span> calendar-time-display-form
+ '(24-hours "<span class="string">:</span>" minutes
+            (<span class="keyword">if</span> time-zone "<span class="string"> (</span>") time-zone (<span class="keyword">if</span> time-zone "<span class="string">)</span>"))
+ calendar-week-start-day 1
+ diary-file (expand-file-name "<span class="string">diary</span>" user-init-directory)
+ diary-mail-addr "<span class="doc-string">steve</span>"
+ diary-mail-days 7
+ european-calendar-style t
+ mark-diary-entries-in-calendar t
+ number-of-diary-entries 7
+ view-diary-entries-initially t)
+
+<span class="comment">;; Use a dedicated frame for my calendar
+</span>(setq calendar-and-diary-frame-parameters
+      '((name . "<span class="string">Calendar</span>")
+        (title . "<span class="string">Calendar</span>")
+        (height . 40)
+        (width . 80)
+        (minibuffer . t)
+        (default-toolbar-visible-p . nil)
+        (default-gutter-visible-p . nil)
+        (menubar-visible-p . t))
+      calendar-setup 'one-frame)
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Todo
+;; Turning this off for a while to see if I can get used to using Howm
+;; more.
+;;(autoload 'todo-mode "todo-mode"
+;;  "Major mode for editing TODO lists." t)
+;;(autoload 'todo-show "todo-mode"
+;;  "Show TODO items." t)
+;;(autoload 'todo-insert-item "todo-mode"
+;;  "Add TODO item." t)
+;;(global-set-key "\C-ct" 'todo-show) ;; switch to TODO buffer
+;;(global-set-key "\C-cn" 'todo-insert-item) ;; insert new item
+;; (setq
+;;  todo-prefix "&amp;%%(todo-cp)"
+;;  todo-file-do (expand-file-name "todo-do" (paths-construct-path
+;;                                         (list user-init-directory
+;;                                               "todo-mode")))
+;;  todo-file-done (expand-file-name "todo-done" (paths-construct-path
+;;                                             (list user-init-directory
+;;                                                   "todo-mode")))
+;;  todo-file-top (expand-file-name "todo-top" (paths-construct-path
+;;                                           (list user-init-directory
+;;                                                 "todo-mode")))
+;;  todo-time-string-format "%3b, %d")
+</span>
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Fancy Diary with perdy colours!
+</span>(<span class="keyword">defun</span> <span class="function-name">sy-hide-fancy-dashes</span> ()
+  "<span class="doc-string">Hides the long lines of dashes from todo-mode in fancy diary display.</span>"
+  (<span class="keyword">save-excursion</span>
+    (goto-char (point-min))
+    (<span class="keyword">while</span> (re-search-forward "<span class="string">-----</span>" nil t)
+      (set-extent-property
+       (make-extent (match-beginning 0) (1+ (match-end 0)))
+       'invisible t))))
+
+(<span class="keyword">define-derived-mode</span> <span class="function-name">fancy-diary-display-mode</span> fundamental-mode "<span class="doc-string">Diary</span>"
+  "<span class="doc-string">Minor mode for displaying Fancy Diary entries buffer.</span>"
+  (set (make-local-variable 'font-lock-defaults)
+       '(fancy-diary-font-lock-keywords t))
+  (sy-hide-fancy-dashes)
+  (font-lock-mode)
+  (define-key (current-local-map) "<span class="string">o</span>" 'other-window)
+  (define-key (current-local-map) [space] 'scroll-up-command)
+  (define-key (current-local-map) [backspace] 'scroll-down-command))
+
+(<span class="keyword">defadvice</span> <span class="function-name">fancy-diary-display</span> (after set-mode activate)
+  "<span class="doc-string">Give the Fancy Diary Entries buffer a mode of its own.
+
+It has the ever-so-original name of: `</span><span class="doc-string"><span class="reference">fancy-diary-display-mode</span></span><span class="doc-string">', adds
+a couple of motion keybindings, and lets you set up font lock keywords
+for a fontified Diary buffer.</span>"
+  (<span class="keyword">save-excursion</span>
+    (set-buffer (get-buffer-create fancy-diary-buffer))
+    (fancy-diary-display-mode)))
+
+(<span class="keyword">defun</span> <span class="function-name">fancy-diary-font-lock-keywords</span> ()
+  (<span class="keyword">let*</span> ((today (regexp-opt (list (calendar-date-string (calendar-current-date)))))
+         (keywords `(("<span class="string">^---\\s-\\(.*$\\)</span>" (1 font-lock-function-name-face))
+                     ("<span class="string">^.*SY:</span>" . font-lock-keyword-face)
+                     ("<span class="string">\"\\(.*\\)\"</span>" (1 font-lock-string-face))
+                     ("<span class="string">`\\(.*?\\)'</span>" (1 font-lock-reference-face))
+                     ("<span class="string">[0-9]+:[0-9]+</span>" . font-lock-warning-face)
+                     (,today . font-lock-warning-face)
+                     ("<span class="string">\\(^.*\\)\n=</span>" (1 font-lock-comment-face)))))
+    keywords))
+
+(<span class="keyword">defvar</span> <span class="variable-name">fancy-diary-font-lock-keywords</span> (fancy-diary-font-lock-keywords))
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Display ISO week numbers
+;;
+;; I saw this code mentioned on c.e.x.  I just snarfed what I needed
+;; and SXEmacserised it.
+</span>(<span class="keyword">require</span> '<span class="reference">cal-iso</span>)
+
+(<span class="keyword">defvar</span> <span class="variable-name">calendar-use-colours</span> t
+  "<span class="doc-string">Tries to fontify Calendar if non-nil.</span>")
+
+(<span class="keyword">defvar</span> <span class="variable-name">calendar-week-string</span> "<span class="doc-string">WK</span>"
+  "<span class="doc-string">String (up to three chars) used in calendar header to identify week numbers.</span>")
+
+(<span class="keyword">defun</span> <span class="function-name">sy-generate-calendar-month</span> (month year indent)
+  "<span class="doc-string">Produce a calendar for ISO-week, month, year on the Gregorian calendar.
+The calendar is inserted in the buffer starting at the line on which point
+is currently located, but indented INDENT spaces.  The indentation is done
+from the first character on the line and does not disturb the first INDENT
+characters on the line.</span>"
+  (<span class="keyword">let*</span> ((blank-days                    <span class="comment">; At start of month
+</span>          (mod
+           (- (calendar-day-of-week (list month 1 year))
+              calendar-week-start-day)
+           7))
+         (last (calendar-last-day-of-month month year)))
+    (goto-char (point-min))
+    (calendar-insert-indented
+     (calendar-string-spread
+      (list (format "<span class="string">%s %d</span>" (calendar-month-name month) year)) ?  20)
+     indent t)
+    <span class="comment">;; Add colour to month name
+</span>    (<span class="keyword">if</span> calendar-use-colours
+        (set-extent-property (make-extent (point-min) (1- (point)))
+                     'face 'calendar-header-face))
+    (calendar-insert-indented "" indent) <span class="comment">; Go to proper spot
+</span>    (calendar-for-loop
+     i from 0 to 6 do
+     (insert (substring (aref calendar-day-name-array
+                              (mod (+ calendar-week-start-day i) 7)) 0 2))
+     <span class="comment">;; Add colour to week day names and sundays
+</span>     (<span class="keyword">if</span> calendar-use-colours
+         (set-extent-property (make-extent  (- (point) 2) (point)) 'face
+                      (<span class="keyword">if</span> (= 0 (mod (+ calendar-week-start-day i) 7))
+                          'calendar-sunday-face
+                        'calendar-header-face)))
+     (insert "<span class="string"> </span>"))
+    <span class="comment">;; Add week-string after week dates
+</span>    (insert (concat calendar-week-string 
+                    (make-string (- 3 (length calendar-week-string)) ? )))
+    <span class="comment">;; Add colour to week-string
+</span>    (<span class="keyword">if</span> calendar-use-colours
+        (set-extent-property (make-extent  (- (point) 3) (point))
+                     'face 'calendar-week-face))
+    (calendar-insert-indented "" 0 t)<span class="comment">;; Force onto following line
+</span>    (calendar-insert-indented "" indent)<span class="comment">;; Go to proper spot
+</span>    <span class="comment">;; Add blank days before the first of the month
+</span>    (calendar-for-loop i from 1 to blank-days do (insert "<span class="string">   </span>"))
+    <span class="comment">;; Put in the days of the month
+</span>    (calendar-for-loop
+     i from 1 to last do
+     (insert (format "<span class="string">%2d </span>" i))
+     (<span class="keyword">if</span> (not calendar-use-colours)
+         nil
+       (put-text-property (- (point) 3) (1- (point)) 'mouse-face 'highlight)
+       <span class="comment">;; Add colour to sunday
+</span>       (<span class="keyword">if</span> (= 1 (mod (+ blank-days calendar-week-start-day i) 7))
+           (set-extent-property (make-extent  (- (point) 3) (1- (point)))
+                        'face 'calendar-sunday-face)))
+     (and (zerop (mod (+ i blank-days) 7))
+          <span class="comment">;; Add ISO-week # at the end each week entry
+</span>          (not (insert
+                (format "<span class="string">%2d </span>" (extract-calendar-month
+                                (calendar-iso-from-absolute
+                                 (calendar-absolute-from-gregorian
+                                  (list month i year)))))))
+          <span class="comment">;; Add colour to week #
+</span>          (<span class="keyword">if</span> calendar-use-colours
+              (set-extent-property (make-extent  (- (point) 3) (1- (point)))
+                           'face 'calendar-week-face)
+            t)
+          (/= i last)
+          (calendar-insert-indented "" 0 t)<span class="comment">;; Force onto following line
+</span>          (calendar-insert-indented "" indent)))))<span class="comment">;; Go to proper spot
+</span>
+(<span class="keyword">defalias</span> '<span class="function-name">generate-calendar-month</span> #'sy-generate-calendar-month)
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Hooks
+</span>(add-hook 'diary-display-hook #'fancy-diary-display)
+(add-hook 'diary-hook #'appt-make-list)
+(add-hook 'list-diary-entries-hook
+          #'(<span class="keyword">lambda</span> ()
+             (sort-diary-entries)
+             (include-other-diary-files)))
+(add-hook 'mark-diary-entries-hook #'mark-included-diary-files)
+(add-hook 'today-visible-calendar-hook #'calendar-mark-today)
+(add-hook 'calendar-move-hook #'(<span class="keyword">lambda</span> () (diary-view-entries 1)))
+(add-hook 'calendar-mode-hook
+          #'(<span class="keyword">lambda</span> ()
+              (setq fancy-diary-font-lock-keywords
+                    (fancy-diary-font-lock-keywords))))
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Holidays
+</span>(<span class="keyword">defvar</span> <span class="variable-name">displayed-month</span>)
+(<span class="keyword">defvar</span> <span class="variable-name">displayed-year</span>)
+(<span class="keyword">require</span> '<span class="reference">holidays</span>)
+
+<span class="comment">;; First up, a slightly re-written easter-holiday function
+</span>(<span class="keyword">defun</span> <span class="function-name">sy-easter-holidays</span> ()
+  "<span class="doc-string">List of dates related to Easter, as visible in calendar window.
+Ever-so-slightly modified to include the Easter Monday holiday.</span>"
+ (<span class="keyword">if</span> (and (&gt; displayed-month 5) (not all-christian-calendar-holidays))
+     nil<span class="comment">;; Ash Wednesday, Good Friday, and Easter are not visible.
+</span>   (<span class="keyword">let*</span> ((century (1+ (/ displayed-year 100)))
+          (shifted-epact        <span class="comment">;; Age of moon for April 5...
+</span>           (% (+ 14 (* 11 (% displayed-year 19))<span class="comment">;;     ...by Nicaean rule
+</span>                 (-           <span class="comment">;; ...corrected for the Gregorian century rule
+</span>                  (/ (* 3 century) 4))
+                 (/    <span class="comment">;; ...corrected for Metonic cycle inaccuracy.
+</span>                  (+ 5 (* 8 century)) 25)
+                 (* 30 century))<span class="comment">;;              Keeps value positive.
+</span>              30))
+          (adjusted-epact       <span class="comment">;;  Adjust for 29.5 day month.
+</span>           (<span class="keyword">if</span> (or (= shifted-epact 0)
+                   (and (= shifted-epact 1) (&lt; 10 (% displayed-year 19))))
+               (1+ shifted-epact)
+             shifted-epact))
+          (paschal-moon       <span class="comment">;; Day after the full moon on or after March 21.
+</span>           (- (calendar-absolute-from-gregorian (list 4 19 displayed-year))
+              adjusted-epact))
+          (abs-easter (calendar-dayname-on-or-before 0 (+ paschal-moon 7)))
+          (mandatory
+           (list
+            (list (calendar-gregorian-from-absolute abs-easter)
+                  "<span class="string">Easter Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 2))
+                  "<span class="string">Good Friday</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 1))
+                  "<span class="string">Easter Monday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 46))
+                  "<span class="string">Ash Wednesday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 47))
+                  "<span class="string">Shrove Tuesday \(Pancake Tuesday\)</span>")))
+          (optional
+           (list
+            (list (calendar-gregorian-from-absolute (- abs-easter 63))
+                  "<span class="string">Septuagesima Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 56))
+                  "<span class="string">Sexagesima Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 49))
+                  "<span class="string">Shrove Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 48))
+                  "<span class="string">Shrove Monday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 14))
+                  "<span class="string">Passion Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 7))
+                  "<span class="string">Palm Sunday</span>")
+            (list (calendar-gregorian-from-absolute (- abs-easter 3))
+                  "<span class="string">Maundy Thursday</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 35))
+                  "<span class="string">Rogation Sunday</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 39))
+                  "<span class="string">Ascension Day</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 49))
+                  "<span class="string">Pentecost (Whitsunday)</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 50))
+                  "<span class="string">Whitmonday</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 56))
+                  "<span class="string">Trinity Sunday</span>")
+            (list (calendar-gregorian-from-absolute (+ abs-easter 60))
+                  "<span class="string">Corpus Christi</span>")))
+          (output-list
+           (filter-visible-calendar-holidays mandatory)))
+     (<span class="keyword">if</span> all-christian-calendar-holidays
+         (setq output-list
+               (append 
+                (filter-visible-calendar-holidays optional)
+                output-list)))
+     output-list)))
+
+<span class="comment">;; Get rid of all the Americanised holidays
+</span>(setq
+ christian-holidays nil
+ hebrew-holidays nil
+ islamic-holidays nil
+ general-holidays nil
+ local-holidays nil
+ oriental-holidays nil
+ other-holidays nil)
+
+<span class="comment">;; Set up standard Aussie holidays
+</span>(setq calendar-holidays
+      '((holiday-fixed 1 1 "<span class="string">New Year's Day</span>")
+        <span class="comment">;; If New Year's day is on a weekend the public
+</span>        <span class="comment">;; holiday is the following Monday
+</span>        (<span class="keyword">if</span> (or (eq 0 (calendar-day-of-week (list 1 1 displayed-year)))
+                (eq 6 (calendar-day-of-week (list 1 1 displayed-year))))
+            (holiday-float 1 1 1 "<span class="string">New Year's Day Public Holiday</span>"))
+        (holiday-fixed 1 26 "<span class="string">Australia Day</span>")
+        <span class="comment">;; If Australia Day falls on a weekend, the
+</span>        <span class="comment">;; holiday is the following Monday
+</span>        (<span class="keyword">if</span> (eq 0 (calendar-day-of-week (list 1 26 displayed-year)))
+            (holiday-fixed 1 27 "<span class="string">Australia Day Public Holiday</span>"))
+        (<span class="keyword">if</span> (eq 6 (calendar-day-of-week (list 1 26 displayed-year)))
+            (holiday-fixed 1 28 "<span class="string">Australia Day Public Holiday</span>"))
+        (holiday-fixed 2 14 "<span class="string">Valentine's Day</span>")
+        (holiday-fixed 3 17 "<span class="string">St. Patrick's Day</span>")
+        (holiday-fixed 4 1 "<span class="string">April Fools' Day</span>")
+        (holiday-fixed 4 25 "<span class="string">Anzac Day</span>")
+        <span class="comment">;; If Anzac Day falls on a weekend, the holiday
+</span>        <span class="comment">;; is the following Monday
+</span>        (<span class="keyword">if</span> (eq 0 (calendar-day-of-week (list 4 25 displayed-year)))
+            (holiday-fixed 4 26 "<span class="string">Anzac Day Public Holiday</span>"))
+        (<span class="keyword">if</span> (eq 6 (calendar-day-of-week (list 4 25 displayed-year)))
+            (holiday-fixed 4 27 "<span class="string">Anzac Day Public Holiday</span>"))
+        (holiday-float 5 1 1 "<span class="string">Labour Day</span>")
+        (holiday-float 5 0 2 "<span class="string">Mother's Day</span>")
+        (holiday-float 6 1 2 "<span class="string">Queen's Birthday</span>")
+        <span class="comment">;; Brisbane Ekka holiday is on the 2nd Wednesday
+</span>        <span class="comment">;; in August, unless there are 5 Wednesdays in
+</span>        <span class="comment">;; August, then it is the 3rd Wednesday.
+</span>        (<span class="keyword">if</span> (eq 8 (car (calendar-nth-named-day 5 3 8 displayed-year)))
+            (holiday-float 8 3 3 "<span class="string">Brisbane Show Day</span>")
+          (holiday-float 8 3 2 "<span class="string">Brisbane Show Day</span>"))
+        (holiday-float 9 0 1 "<span class="string">Father's Day</span>")
+        (holiday-fixed 12 25 "<span class="string">Christmas Day</span>")
+        (holiday-fixed 12 26 "<span class="string">Boxing Day</span>")
+        <span class="comment">;; If Xmas falls on weekend, the public holiday
+</span>        <span class="comment">;; is the following Mon/Tue
+</span>        (<span class="keyword">if</span> (or (eq 0 (calendar-day-of-week (list 12 25 displayed-year)))
+                (eq 6 (calendar-day-of-week (list 12 25 displayed-year))))
+            (holiday-fixed 12 27 "<span class="string">Xmas Day Public Holiday</span>"))
+        (<span class="keyword">if</span> (or (eq 0 (calendar-day-of-week (list 12 26 displayed-year)))
+                (eq 6 (calendar-day-of-week (list 12 26 displayed-year))))
+            (holiday-fixed 12 28 "<span class="string">Boxing Day Public Holiday</span>"))
+        (solar-equinoxes-solstices)
+        (sy-easter-holidays)))
+(setq mark-holidays-in-calendar t)
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Appointments
+</span>(<span class="keyword">require</span> '<span class="reference">appt</span>)
+(<span class="keyword">require</span> '<span class="reference">balloon-help</span>)
+(balloon-help-mode 1)
+(setq 
+ balloon-help-background "<span class="doc-string">BlanchedAlmond</span>"
+ balloon-help-foreground "<span class="doc-string">Black</span>"
+ display-time-24hr-format t
+ display-time-day-and-date t
+ display-time-no-mail-balloon "<span class="doc-string">What! No mail? That can't be right.</span>"
+ display-time-mail-balloon-show-gnus-group t
+ display-time-mail-balloon-max-displayed 20
+ display-time-mail-balloon-gnus-split-width 19
+ display-time-mail-balloon-enhance-gnus-group
+ '("<span class="string">private.*</span>")
+ display-time-mail-balloon-suppress-gnus-group
+ '("<span class="string">\\(SPAM.*\\|returned\\.mail\\)</span>"))
+(display-time)
+(appt-activate 1)
+(setq 
+ appt-message-warning-time 30
+ appt-display-format 'echo
+ appt-audible t
+ appt-display-mode-line t
+ appt-announce-method 'appt-persistent-message-announce)
+(add-hook 'appt-make-list-hook #'appt-included-diary-entries)
+(appt-activate 1)
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Howm integration
+</span>(setq
+ calendar-date-display-form
+ '("<span class="string">[</span>" year "<span class="string">-</span>" (format "<span class="string">%02d</span>" (string-to-int month))
+   "<span class="string">-</span>" (format "<span class="string">%02d</span>" (string-to-int day)) "<span class="string">] </span>"
+   (<span class="keyword">if</span> dayname (concat dayname "<span class="string">, </span>")) day "<span class="string"> </span>" monthname "<span class="string"> </span>" year))
+
+(<span class="keyword">defun</span> <span class="function-name">howm-mark-calendar-date</span> ()
+  (interactive)
+  (<span class="keyword">let*</span> ((howm-schedule-types
+          howm-schedule-menu-types)
+         (raw (howm-reminder-search
+               howm-schedule-types))
+         (str nil) (yy nil) (mm nil) (dd nil))
+    (<span class="keyword">while</span> raw
+      (setq str (nth 1 (car raw)))
+      (<span class="keyword">when</span>
+          (string-match
+           "<span class="string">\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)</span>"
+           str)
+        (setq yy (match-string 1 str))
+        (setq mm (match-string 2 str))
+        (setq dd (match-string 3 str)))
+      (<span class="keyword">when</span> (and yy mm dd)
+        (mark-calendar-date-pattern
+         (string-to-int mm)
+         (string-to-int dd)
+         (string-to-int yy)))
+      (setq mm nil)
+      (setq dd nil)
+      (setq yy nil)
+      (setq raw (cdr raw)))))
+
+(<span class="keyword">defadvice</span> <span class="function-name">mark-diary-entries</span>
+  (after mark-howm-entry activate)
+  (howm-mark-calendar-date))
+
+(and-boundp 'howm-menu-display-rules
+  (setq
+   howm-menu-display-rules
+   (cons
+    (cons "<span class="string">%hdiary[\n]?</span>" 'howm-menu-diary)
+    howm-menu-display-rules)))
+
+(<span class="keyword">defun</span> <span class="function-name">howm-menu-diary</span> ()
+  (message "<span class="string">scanning diary...</span>")
+  (delete-region
+   (match-beginning 0) (match-end 0))
+  (<span class="keyword">let*</span> ((now (decode-time (current-time)))
+         (diary-date
+          (list (nth 4 now) (nth 3 now) (nth 5 now)))
+         (diary-display-hook 'ignore)
+         (howm-diary-entry nil)
+         (howm-diary-entry-day nil)
+         (str nil)
+         yy mm dd)
+    (<span class="keyword">unwind-protect</span>
+        (setq howm-diary-entry
+              (diary-list-entries
+               diary-date howm-menu-schedule-days))
+      (<span class="keyword">save-excursion</span>
+        (set-buffer
+         (find-buffer-visiting diary-file))
+        (subst-char-in-region
+         (point-min) (point-max) ?\^M ?\n t)
+        (setq selective-display nil)))
+    (<span class="keyword">while</span> howm-diary-entry
+      (setq howm-diary-entry-day (car howm-diary-entry))
+      (setq mm (nth 0 (car howm-diary-entry-day)))
+      (setq dd (nth 1 (car howm-diary-entry-day)))
+      (setq yy (nth 2 (car howm-diary-entry-day)))
+      (setq str (nth 1 howm-diary-entry-day))
+      (setq howm-diary-entry (cdr howm-diary-entry))
+      (insert
+       (format
+        "<span class="string">&gt;&gt;d [%04d-%02d-%02d] %s\n</span>" yy mm dd str))))
+  (message "<span class="string">scanning diary...done</span>"))
+
+(setq diary-date-forms
+      '((month "<span class="string">/</span>" day "<span class="string">[^/0-9]</span>")
+        (month "<span class="string">/</span>" day "<span class="string">/</span>" year "<span class="string">[^0-9]</span>")
+        ("<span class="string">\\[</span>" year "<span class="string">-</span>" month "<span class="string">-</span>" day "<span class="string">\\]</span>" "<span class="string">[^0-9]</span>")
+        (monthname "<span class="string"> *</span>" day "<span class="string">[^,0-9]</span>")
+        (monthname "<span class="string"> *</span>" day "<span class="string">, *</span>" year "<span class="string">[^0-9]</span>")
+        (dayname "<span class="string">\\W</span>")))
+
+(<span class="keyword">defun</span> <span class="function-name">howm-open-diary</span> (<span class="type">&amp;optional</span> dummy)
+  (interactive)
+  (<span class="keyword">let</span> ((date-str nil) (str nil))
+    (<span class="keyword">save-excursion</span>
+      (beginning-of-line)
+      (<span class="keyword">when</span> (re-search-forward
+             "<span class="string">&gt;&gt;d \\(\\[[-0-9]+\\]\\) </span>" nil t)
+        (setq str
+              (concat
+               "<span class="string">^.+</span>"
+               (buffer-substring-no-properties
+                (point) (line-end-position))))
+        (setq date-str
+              (concat
+               "<span class="string">^.+</span>"
+               (buffer-substring-no-properties
+                (match-beginning 1)
+                (match-end 1))
+               "<span class="string"> </span>" str))
+        (find-file
+         (substitute-in-file-name diary-file))
+        (howm-mode t)
+        (goto-char (point-min))
+        (<span class="keyword">if</span> (re-search-forward date-str nil t)
+            ()
+          (re-search-forward str nil t))))))
+
+(<span class="keyword">defun</span> <span class="function-name">add-diary-action-lock-rule</span> ()
+  (<span class="keyword">let</span> ((rule
+         (action-lock-general
+          'howm-open-diary
+          "<span class="string">^\\(&gt;&gt;d\\) </span>"
+          1 1)))
+    (<span class="keyword">if</span> (not (member rule action-lock-default-rules))
+        (<span class="keyword">progn</span>
+          (setq action-lock-default-rules
+                (cons rule action-lock-default-rules))
+          (action-lock-set-rules
+           action-lock-default-rules)))))
+
+(add-hook 'action-lock-mode-on-hook
+          'add-diary-action-lock-rule)
+
+(<span class="keyword">defadvice</span> <span class="function-name">make-diary-entry</span>
+  (after howm-mode activate)
+  (text-mode)
+  (howm-mode t))
+
+<span class="comment">;;; ;;;;;;;;;;
+</span>
+<span class="comment">;;; ;; M-x calendar, move cursor to a certain date, and
+;;; ;; M-x howm-from-calendar to search that date in howm notes.
+</span>(<span class="keyword">defun</span> <span class="function-name">howm-from-calendar</span> ()
+  (interactive)
+  (<span class="keyword">let*</span> ((mdy (calendar-cursor-to-date t))
+         (m (car mdy))
+         (d (second mdy))
+         (y (third mdy))
+         (key (format-time-string
+               howm-date-format
+               (encode-time 0 0 0 d m y))))
+    (howm-keyword-search key)))
+
+<span class="comment">;; Bind howm-from-calendar to "H-d" key.
+</span>(add-hook 'initial-calendar-window-hook
+          #'(<span class="keyword">lambda</span> ()
+            (local-set-key [(hyper ?d)] 'howm-from-calendar)))
+
+       
+
+<span class="comment">;; Type "H-d" in howm menu to open calendar.
+</span>(add-hook 'howm-menu-hook
+          #'(<span class="keyword">lambda</span> ()
+            (local-set-key [(hyper ?d)] 'calendar)))
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> timeclock
+;;  I tried using it for a while but I found that because it wasn't
+;;  automated I never remembered to "clock-in" or "clock-out" and
+;;  change tasks.  I would probably use it if it were a lot more like
+;;  xwem-worklog.
+;;
+;; Track time spent doing certain things
+;; (require 'timeclock)
+;; (setq timeclock-file (expand-file-name "timelog" user-init-directory))
+;; (setq timeclock-relative nil)
+;; (add-hook 'kill-emacs-query-functions 'timeclock-query-out)
+;; (timeclock-modeline-display)
+</span>
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">ti</span>" 'timeclock-in)
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">to</span>" 'timeclock-out)
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">tc</span>" 'timeclock-change)
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">tr</span>" 'timeclock-reread-log)
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">tu</span>" 'timeclock-update-modeline)
+(<span class="keyword">define-key</span> <span class="variable-name">ctl-x-map</span> "<span class="doc-string">tw</span>" 'timeclock-when-to-leave-string)
+
+
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Start itimer to refresh just after midnight
+;; This needs my `</span><span class="comment"><span class="reference">future-run-at-time</span></span><span class="comment">' advice.
+</span>(run-at-time "<span class="doc-string">00:01</span>" 86400 #'redraw-calendar)
+
+<span class="comment">;</span><span class="comment"><span class="reference">:*=======================</span></span><span class="comment">
+;</span><span class="comment"><span class="reference">:*</span></span><span class="comment"> Get the show on the road
+</span>(<span class="keyword">defun</span> <span class="function-name">sy-calendar-setup</span> ()
+  (mark-diary-entries)
+  (mark-calendar-holidays)
+  (diary-show-all-entries))
+
+(add-hook 'calendar-load-hook 'sy-calendar-setup)
+<span class="comment">;</span><span class="comment"><span class="reference">:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*</span></span><span class="comment">
+</span>(message "<span class="doc-string">Calendar settings loaded</span>")
+</pre>
+  <!--  SXEmacs Logo -->
+    <div class="img">
+      <a href="https://www.sxemacs.org/" target="_parent">
+       <img style="padding:0px 5px 0px 0px;border:0;width:88px;height:31px"
+         src="/Images/cbsx.png"
+         title="This page was created entirely in SXEmacs"
+         alt="Created with SXEmacs" />
+      </a>
+<!--  End SXEmacs Logo -->
+<!--  Valid XHTML 1.0 -->
+      <a href="http://validator.w3.org/check?uri=https%3a%2f%2fwww.sxemacs.org%2fSYinits%2f11-cal.html" target="_blank">
+       <img style="padding:0px 5px 0px 10px;border:0;width:88px;height:31px"
+         src="/Images/valid-xhtml10.png"
+         title="Valid XHTML 1.0 Transitional!"
+         alt="Valid XHTML 1.0 Transitional!" />
+      </a>
+    </div>
+<!--  End Valid XHTML 1.0 -->
+
+    <h6>Copyright &#169; 2020 Steve Youngs<br />
+     Verbatim copying and distribution is permitted in any medium,
+    providing this notice is preserved.<br />
+<!-- hhmts start -->
+Last modified: Wed Apr 15 18:14:11 AEST 2020
+<!-- hhmts end -->
+   </h6>
+
+</body>
+</html>