--- /dev/null
+;; 11-cal.el --- Calendar Settings
+
+;; Copyright (C) 2007 - 2020 Steve Youngs
+
+;; Author: Steve Youngs <steve@sxemacs.org>
+;; Maintainer: Steve Youngs <steve@sxemacs.org>
+;; Created: <2007-12-02>
+;; Time-stamp: <Thursday Apr 9, 2020 08:12:34 steve>
+;; Download: <https://downloads.sxemacs.org/SYinits>
+;; HTMLised: <https://www.sxemacs.org/SYinits/11-cal.html>
+;; Git Repo: git clone https://git.sxemacs.org/syinit
+;; Keywords: init, compile
+
+;; This file is part of SYinit
+
+;; 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.
+
+;;; Commentary:
+;;
+;; My calendar/diary settings
+;;
+
+;;; Credits:
+;;
+;; The HTML version of this file was created with Hrvoje Niksic's
+;; htmlize.el which is part of the XEmacs "text-modes" package.
+;;
+
+;;; Todo:
+;;
+;;
+
+;;; Code:
+;:*=======================
+;:* Calendar
+(require 'cedet-compat)
+(require 'diary-lib)
+;(require 'calendar)
+(setq
+ calendar-latitude -27.47
+ calendar-longitude 153.02
+ calendar-location-name "Brisbane"
+ calendar-time-zone 600
+ cal-tex-diary t
+; calendar-date-display-form ; see: "Howm Integration" below
+; '((if dayname (concat dayname ", ")) day " " monthname " " year)
+ calendar-time-display-form
+ '(24-hours ":" minutes
+ (if time-zone " (") time-zone (if time-zone ")"))
+ calendar-week-start-day 1
+ diary-file (expand-file-name "diary" user-init-directory)
+ diary-mail-addr "steve"
+ diary-mail-days 7
+ european-calendar-style t
+ mark-diary-entries-in-calendar t
+ number-of-diary-entries 7
+ view-diary-entries-initially t)
+
+;; Use a dedicated frame for my calendar
+(setq calendar-and-diary-frame-parameters
+ '((name . "Calendar")
+ (title . "Calendar")
+ (height . 40)
+ (width . 80)
+ (minibuffer . t)
+ (default-toolbar-visible-p . nil)
+ (default-gutter-visible-p . nil)
+ (menubar-visible-p . t))
+ calendar-setup 'one-frame)
+
+;:*=======================
+;:* 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")
+
+;:*=======================
+;:* Fancy Diary with perdy colours!
+(defun sy-hide-fancy-dashes ()
+ "Hides the long lines of dashes from todo-mode in fancy diary display."
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "-----" nil t)
+ (set-extent-property
+ (make-extent (match-beginning 0) (1+ (match-end 0)))
+ 'invisible t))))
+
+(define-derived-mode fancy-diary-display-mode fundamental-mode "Diary"
+ "Minor mode for displaying Fancy Diary entries buffer."
+ (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) "o" 'other-window)
+ (define-key (current-local-map) [space] 'scroll-up-command)
+ (define-key (current-local-map) [backspace] 'scroll-down-command))
+
+(defadvice fancy-diary-display (after set-mode activate)
+ "Give the Fancy Diary Entries buffer a mode of its own.
+
+It has the ever-so-original name of: `fancy-diary-display-mode', adds
+a couple of motion keybindings, and lets you set up font lock keywords
+for a fontified Diary buffer."
+ (save-excursion
+ (set-buffer (get-buffer-create fancy-diary-buffer))
+ (fancy-diary-display-mode)))
+
+(defun fancy-diary-font-lock-keywords ()
+ (let* ((today (regexp-opt (list (calendar-date-string (calendar-current-date)))))
+ (keywords `(("^---\\s-\\(.*$\\)" (1 font-lock-function-name-face))
+ ("^.*SY:" . font-lock-keyword-face)
+ ("\"\\(.*\\)\"" (1 font-lock-string-face))
+ ("`\\(.*?\\)'" (1 font-lock-reference-face))
+ ("[0-9]+:[0-9]+" . font-lock-warning-face)
+ (,today . font-lock-warning-face)
+ ("\\(^.*\\)\n=" (1 font-lock-comment-face)))))
+ keywords))
+
+(defvar fancy-diary-font-lock-keywords (fancy-diary-font-lock-keywords))
+
+;:*=======================
+;:* Display ISO week numbers
+;;
+;; I saw this code mentioned on c.e.x. I just snarfed what I needed
+;; and SXEmacserised it.
+(require 'cal-iso)
+
+(defvar calendar-use-colours t
+ "Tries to fontify Calendar if non-nil.")
+
+(defvar calendar-week-string "WK"
+ "String (up to three chars) used in calendar header to identify week numbers.")
+
+(defun sy-generate-calendar-month (month year indent)
+ "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."
+ (let* ((blank-days ; At start of month
+ (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 "%s %d" (calendar-month-name month) year)) ? 20)
+ indent t)
+ ;; Add colour to month name
+ (if calendar-use-colours
+ (set-extent-property (make-extent (point-min) (1- (point)))
+ 'face 'calendar-header-face))
+ (calendar-insert-indented "" indent) ; Go to proper spot
+ (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))
+ ;; Add colour to week day names and sundays
+ (if calendar-use-colours
+ (set-extent-property (make-extent (- (point) 2) (point)) 'face
+ (if (= 0 (mod (+ calendar-week-start-day i) 7))
+ 'calendar-sunday-face
+ 'calendar-header-face)))
+ (insert " "))
+ ;; Add week-string after week dates
+ (insert (concat calendar-week-string
+ (make-string (- 3 (length calendar-week-string)) ? )))
+ ;; Add colour to week-string
+ (if calendar-use-colours
+ (set-extent-property (make-extent (- (point) 3) (point))
+ 'face 'calendar-week-face))
+ (calendar-insert-indented "" 0 t);; Force onto following line
+ (calendar-insert-indented "" indent);; Go to proper spot
+ ;; Add blank days before the first of the month
+ (calendar-for-loop i from 1 to blank-days do (insert " "))
+ ;; Put in the days of the month
+ (calendar-for-loop
+ i from 1 to last do
+ (insert (format "%2d " i))
+ (if (not calendar-use-colours)
+ nil
+ (put-text-property (- (point) 3) (1- (point)) 'mouse-face 'highlight)
+ ;; Add colour to sunday
+ (if (= 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))
+ ;; Add ISO-week # at the end each week entry
+ (not (insert
+ (format "%2d " (extract-calendar-month
+ (calendar-iso-from-absolute
+ (calendar-absolute-from-gregorian
+ (list month i year)))))))
+ ;; Add colour to week #
+ (if calendar-use-colours
+ (set-extent-property (make-extent (- (point) 3) (1- (point)))
+ 'face 'calendar-week-face)
+ t)
+ (/= i last)
+ (calendar-insert-indented "" 0 t);; Force onto following line
+ (calendar-insert-indented "" indent)))));; Go to proper spot
+
+(defalias 'generate-calendar-month #'sy-generate-calendar-month)
+
+;:*=======================
+;:* Hooks
+(add-hook 'diary-display-hook #'fancy-diary-display)
+(add-hook 'diary-hook #'appt-make-list)
+(add-hook 'list-diary-entries-hook
+ #'(lambda ()
+ (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 #'(lambda () (diary-view-entries 1)))
+(add-hook 'calendar-mode-hook
+ #'(lambda ()
+ (setq fancy-diary-font-lock-keywords
+ (fancy-diary-font-lock-keywords))))
+
+;:*=======================
+;:* Holidays
+(defvar displayed-month)
+(defvar displayed-year)
+(require 'holidays)
+
+;; First up, a slightly re-written easter-holiday function
+(defun sy-easter-holidays ()
+ "List of dates related to Easter, as visible in calendar window.
+Ever-so-slightly modified to include the Easter Monday holiday."
+ (if (and (> displayed-month 5) (not all-christian-calendar-holidays))
+ nil;; Ash Wednesday, Good Friday, and Easter are not visible.
+ (let* ((century (1+ (/ displayed-year 100)))
+ (shifted-epact ;; Age of moon for April 5...
+ (% (+ 14 (* 11 (% displayed-year 19));; ...by Nicaean rule
+ (- ;; ...corrected for the Gregorian century rule
+ (/ (* 3 century) 4))
+ (/ ;; ...corrected for Metonic cycle inaccuracy.
+ (+ 5 (* 8 century)) 25)
+ (* 30 century));; Keeps value positive.
+ 30))
+ (adjusted-epact ;; Adjust for 29.5 day month.
+ (if (or (= shifted-epact 0)
+ (and (= shifted-epact 1) (< 10 (% displayed-year 19))))
+ (1+ shifted-epact)
+ shifted-epact))
+ (paschal-moon ;; Day after the full moon on or after March 21.
+ (- (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)
+ "Easter Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 2))
+ "Good Friday")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 1))
+ "Easter Monday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 46))
+ "Ash Wednesday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 47))
+ "Shrove Tuesday \(Pancake Tuesday\)")))
+ (optional
+ (list
+ (list (calendar-gregorian-from-absolute (- abs-easter 63))
+ "Septuagesima Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 56))
+ "Sexagesima Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 49))
+ "Shrove Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 48))
+ "Shrove Monday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 14))
+ "Passion Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 7))
+ "Palm Sunday")
+ (list (calendar-gregorian-from-absolute (- abs-easter 3))
+ "Maundy Thursday")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 35))
+ "Rogation Sunday")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 39))
+ "Ascension Day")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 49))
+ "Pentecost (Whitsunday)")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 50))
+ "Whitmonday")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 56))
+ "Trinity Sunday")
+ (list (calendar-gregorian-from-absolute (+ abs-easter 60))
+ "Corpus Christi")))
+ (output-list
+ (filter-visible-calendar-holidays mandatory)))
+ (if all-christian-calendar-holidays
+ (setq output-list
+ (append
+ (filter-visible-calendar-holidays optional)
+ output-list)))
+ output-list)))
+
+;; Get rid of all the Americanised holidays
+(setq
+ christian-holidays nil
+ hebrew-holidays nil
+ islamic-holidays nil
+ general-holidays nil
+ local-holidays nil
+ oriental-holidays nil
+ other-holidays nil)
+
+;; Set up standard Aussie holidays
+(setq calendar-holidays
+ '((holiday-fixed 1 1 "New Year's Day")
+ ;; If New Year's day is on a weekend the public
+ ;; holiday is the following Monday
+ (if (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 "New Year's Day Public Holiday"))
+ (holiday-fixed 1 26 "Australia Day")
+ ;; If Australia Day falls on a weekend, the
+ ;; holiday is the following Monday
+ (if (eq 0 (calendar-day-of-week (list 1 26 displayed-year)))
+ (holiday-fixed 1 27 "Australia Day Public Holiday"))
+ (if (eq 6 (calendar-day-of-week (list 1 26 displayed-year)))
+ (holiday-fixed 1 28 "Australia Day Public Holiday"))
+ (holiday-fixed 2 14 "Valentine's Day")
+ (holiday-fixed 3 17 "St. Patrick's Day")
+ (holiday-fixed 4 1 "April Fools' Day")
+ (holiday-fixed 4 25 "Anzac Day")
+ ;; If Anzac Day falls on a weekend, the holiday
+ ;; is the following Monday
+ (if (eq 0 (calendar-day-of-week (list 4 25 displayed-year)))
+ (holiday-fixed 4 26 "Anzac Day Public Holiday"))
+ (if (eq 6 (calendar-day-of-week (list 4 25 displayed-year)))
+ (holiday-fixed 4 27 "Anzac Day Public Holiday"))
+ (holiday-float 5 1 1 "Labour Day")
+ (holiday-float 5 0 2 "Mother's Day")
+ (holiday-float 6 1 2 "Queen's Birthday")
+ ;; Brisbane Ekka holiday is on the 2nd Wednesday
+ ;; in August, unless there are 5 Wednesdays in
+ ;; August, then it is the 3rd Wednesday.
+ (if (eq 8 (car (calendar-nth-named-day 5 3 8 displayed-year)))
+ (holiday-float 8 3 3 "Brisbane Show Day")
+ (holiday-float 8 3 2 "Brisbane Show Day"))
+ (holiday-float 9 0 1 "Father's Day")
+ (holiday-fixed 12 25 "Christmas Day")
+ (holiday-fixed 12 26 "Boxing Day")
+ ;; If Xmas falls on weekend, the public holiday
+ ;; is the following Mon/Tue
+ (if (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 "Xmas Day Public Holiday"))
+ (if (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 "Boxing Day Public Holiday"))
+ (solar-equinoxes-solstices)
+ (sy-easter-holidays)))
+(setq mark-holidays-in-calendar t)
+
+;:*=======================
+;:* Appointments
+(require 'appt)
+(require 'balloon-help)
+(balloon-help-mode 1)
+(setq
+ balloon-help-background "BlanchedAlmond"
+ balloon-help-foreground "Black"
+ display-time-24hr-format t
+ display-time-day-and-date t
+ display-time-no-mail-balloon "What! No mail? That can't be right."
+ 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
+ '("private.*")
+ display-time-mail-balloon-suppress-gnus-group
+ '("\\(SPAM.*\\|returned\\.mail\\)"))
+(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)
+
+;:*=======================
+;:* Howm integration
+(setq
+ calendar-date-display-form
+ '("[" year "-" (format "%02d" (string-to-int month))
+ "-" (format "%02d" (string-to-int day)) "] "
+ (if dayname (concat dayname ", ")) day " " monthname " " year))
+
+(defun howm-mark-calendar-date ()
+ (interactive)
+ (let* ((howm-schedule-types
+ howm-schedule-menu-types)
+ (raw (howm-reminder-search
+ howm-schedule-types))
+ (str nil) (yy nil) (mm nil) (dd nil))
+ (while raw
+ (setq str (nth 1 (car raw)))
+ (when
+ (string-match
+ "\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)"
+ str)
+ (setq yy (match-string 1 str))
+ (setq mm (match-string 2 str))
+ (setq dd (match-string 3 str)))
+ (when (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)))))
+
+(defadvice mark-diary-entries
+ (after mark-howm-entry activate)
+ (howm-mark-calendar-date))
+
+(and-boundp 'howm-menu-display-rules
+ (setq
+ howm-menu-display-rules
+ (cons
+ (cons "%hdiary[\n]?" 'howm-menu-diary)
+ howm-menu-display-rules)))
+
+(defun howm-menu-diary ()
+ (message "scanning diary...")
+ (delete-region
+ (match-beginning 0) (match-end 0))
+ (let* ((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)
+ (unwind-protect
+ (setq howm-diary-entry
+ (diary-list-entries
+ diary-date howm-menu-schedule-days))
+ (save-excursion
+ (set-buffer
+ (find-buffer-visiting diary-file))
+ (subst-char-in-region
+ (point-min) (point-max) ?\^M ?\n t)
+ (setq selective-display nil)))
+ (while 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
+ ">>d [%04d-%02d-%02d] %s\n" yy mm dd str))))
+ (message "scanning diary...done"))
+
+(setq diary-date-forms
+ '((month "/" day "[^/0-9]")
+ (month "/" day "/" year "[^0-9]")
+ ("\\[" year "-" month "-" day "\\]" "[^0-9]")
+ (monthname " *" day "[^,0-9]")
+ (monthname " *" day ", *" year "[^0-9]")
+ (dayname "\\W")))
+
+(defun howm-open-diary (&optional dummy)
+ (interactive)
+ (let ((date-str nil) (str nil))
+ (save-excursion
+ (beginning-of-line)
+ (when (re-search-forward
+ ">>d \\(\\[[-0-9]+\\]\\) " nil t)
+ (setq str
+ (concat
+ "^.+"
+ (buffer-substring-no-properties
+ (point) (line-end-position))))
+ (setq date-str
+ (concat
+ "^.+"
+ (buffer-substring-no-properties
+ (match-beginning 1)
+ (match-end 1))
+ " " str))
+ (find-file
+ (substitute-in-file-name diary-file))
+ (howm-mode t)
+ (goto-char (point-min))
+ (if (re-search-forward date-str nil t)
+ ()
+ (re-search-forward str nil t))))))
+
+(defun add-diary-action-lock-rule ()
+ (let ((rule
+ (action-lock-general
+ 'howm-open-diary
+ "^\\(>>d\\) "
+ 1 1)))
+ (if (not (member rule action-lock-default-rules))
+ (progn
+ (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)
+
+(defadvice make-diary-entry
+ (after howm-mode activate)
+ (text-mode)
+ (howm-mode t))
+
+;;; ;;;;;;;;;;
+
+;;; ;; M-x calendar, move cursor to a certain date, and
+;;; ;; M-x howm-from-calendar to search that date in howm notes.
+(defun howm-from-calendar ()
+ (interactive)
+ (let* ((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)))
+
+;; Bind howm-from-calendar to "H-d" key.
+(add-hook 'initial-calendar-window-hook
+ #'(lambda ()
+ (local-set-key [(hyper ?d)] 'howm-from-calendar)))
+
+
+
+;; Type "H-d" in howm menu to open calendar.
+(add-hook 'howm-menu-hook
+ #'(lambda ()
+ (local-set-key [(hyper ?d)] 'calendar)))
+
+;:*=======================
+;:* 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)
+
+(define-key ctl-x-map "ti" 'timeclock-in)
+(define-key ctl-x-map "to" 'timeclock-out)
+(define-key ctl-x-map "tc" 'timeclock-change)
+(define-key ctl-x-map "tr" 'timeclock-reread-log)
+(define-key ctl-x-map "tu" 'timeclock-update-modeline)
+(define-key ctl-x-map "tw" 'timeclock-when-to-leave-string)
+
+
+
+;:*=======================
+;:* Start itimer to refresh just after midnight
+;; This needs my `future-run-at-time' advice.
+(run-at-time "00:01" 86400 #'redraw-calendar)
+
+;:*=======================
+;:* Get the show on the road
+(defun sy-calendar-setup ()
+ (mark-diary-entries)
+ (mark-calendar-holidays)
+ (diary-show-all-entries))
+
+(add-hook 'calendar-load-hook 'sy-calendar-setup)
+;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
+(message "Calendar settings loaded")