--- /dev/null
+<!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 <<a href="mailto:steve@sxemacs.org">steve@sxemacs.org</a>>
+;; Maintainer: Steve Youngs <<a href="mailto:steve@sxemacs.org">steve@sxemacs.org</a>>
+;; Created: <2007-12-02>
+;; Time-stamp: <Thursday Apr 9, 2020 08:12:34 steve>
+;; Download: <<a href="https://downloads.sxemacs.org/SYinits">https://downloads.sxemacs.org/SYinits</a>>
+;; HTMLised: <<a href="https://www.sxemacs.org/SYinits/11-cal.html">https://www.sxemacs.org/SYinits/11-cal.html</a>>
+;; 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 "&%%(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 (> 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) (< 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">>>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">&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">>>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">^\\(>>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 © 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>