diff -r df7496e40bee -r a234a7579958 lisp/my-planner.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/my-planner.el Thu Oct 13 08:46:42 2011 -0400 @@ -0,0 +1,227 @@ +;;;_ Planner configuration + +;; In emacs21/sarge, schedule doesn't exist. +;; But in planner-el/etch, schedule is in contrib. +(if (not (locate-library "schedule")) + (setcdr (last load-path) + '("/usr/share/emacs/site-lisp/planner-el/contrib"))) +(if (locate-library "schedule") + (require 'planner-timeclock)) +;(require 'planner-wl) +;(planner-wl-insinuate) +(require 'planner-diary) +(planner-diary-insinuate) +(require 'planner-export-diary) +(planner-calendar-insinuate) +(require 'planner-appt) +(planner-appt-use-tasks) +(planner-appt-insinuate) +(require 'planner-cyclic) +(planner-appt-schedule-cyclic-insinuate) +(planner-appt-calendar-insinuate) +(require 'planner-timeclock-summary) +(planner-timeclock-summary-insinuate) +(require 'planner-timeclock-summary-proj) +(planner-timeclock-summary-proj-insinuate) +(require 'planner-schedule) +(require 'planner-bbdb) +(require 'planner-erc) +(require 'planner-bookmark) +(require 'remember-planner) +(require 'planner-log-edit) +(planner-install-extra-task-keybindings) +(planner-install-extra-context-keybindings) +(require 'planner-trunk) +(require 'planner-multi) + +; Local functions for planner + +(defvar my-planner-week-summary-buffer + "Week-%Y-%U.muse") + +(defvar my-planner-week-summary-regexp + "Week-\\([0-9]{4}\\)-\\([0-5][0-9]\\)\\.muse") + +(defun first-day-of-the-week (date) + (progn + ;; (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE) + (setcar (nthcdr 3 date) + (- (elt date 3) + (elt date 6))) + (setcar (nthcdr 6 date) 0) + (apply 'encode-time date))) + +(defun last-day-of-the-week (date) + (progn + ;; (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE) + (setcar (nthcdr 3 date) + (+ (elt date 3) + (- 6 (elt date 6)))) + (setcar (nthcdr 6 date) 6) + (apply 'encode-time date))) + +(defun my-planner-file-to-date (filename) + (let ((calendar-date + (planner-filename-to-calendar-date filename))) + (decode-time (encode-time 0 0 0 (elt calendar-date 1) + (elt calendar-date 0) (elt calendar-date 2))))) + +(defun my-planner-week-summary (week-day) + (interactive (list (planner-read-date "Select a day of the week" t))) + (let ((date + (my-planner-file-to-date week-day))) + (planner-timeclock-summary-show-range + (planner-date-to-filename (first-day-of-the-week date)) + (planner-date-to-filename (last-day-of-the-week date))))) + +;;;_ redefinition of planner-maybe-remove-file +;; +;; The kill-buffer of this function make me crazy. I modify it so you +;; can change it's behavior using this custom variable. Personnaly, I +;; used ignore and let emacs ask me to save it when I kill it. Take +;; also note that I change the regexp to remove any file that only +;; have empty section (section with just a first level heading). This +;; is to cope with the new Events and Schedule sections. + +(defcustom planner-not-empty-file 'kill-this-buffer + "Command to run when a planner file is not empty. Can be +kill-this-buffer, save-buffer or ignore for example." + :type 'function + :group 'planner) + +(defvar local-planner-empty-line-regexp "\\(\\* .*\\|[[:space:]]*\\|No entries[[:space:]]*\\)") +(defvar planner-empty-file-regexp + (concat "\\(^" local-planner-empty-line-regexp + "\n\\)*[[:space:]]*\\'")) + +; redefinition + +(defun planner-maybe-remove-file () + "This function remove the file if it contains only first level +headings and empty lines." + (interactive) + (goto-char (point-min)) + (if (looking-at planner-empty-file-regexp) + (let ((filename buffer-file-name)) + (set-buffer-modified-p nil) + (kill-buffer (current-buffer)) + (delete-file filename)) + (funcall planner-not-empty-file))) + +;;;_ Planner automatic retrunl + +;; Should all been rework because planner-trunk just +;; look for Projects page. + +;; (defun my-planner-trunk-tasks-build-rules () +;; (let ((rule-set nil)) +;; (save-excursion +;; (save-restriction +;; (when (planner-narrow-to-section 'tasks) +;; (goto-char (point-min)) +;; (while (not (equal (point-max) (point))) +;; (let ((current-task (planner-task-description +;; (planner-current-task-info)))) +;; (if current-task +;; (if (string-match "|\\(.*\\)|" current-task) +;; (let ((category +;; (substring current-task +;; (match-beginning 1) +;; (match-end 1)))) +;; (add-to-list 'rule-set +;; (list (format "|%s|" category) +;; category)))))) +;; (forward-line))))) +;; rule-set)) + +;; (defun my-planner-trunk-tasks (&optional force) +;; (interactive "P") +;; (let ((page-name (planner-page-name))) +;; (if (not (catch 'done +;; (mapc (lambda (rule) +;; (if (string-match (car rule) page-name) +;; (if force +;; (progn +;; (delq rule planner-trunk-rule-list) +;; (throw 'done nil)) +;; (throw 'done t)))) +;; planner-trunk-rule-list) +;; nil)) +;; (add-to-list 'planner-trunk-rule-list +;; (list (regexp-quote (planner-page-name)) +;; nil (my-planner-trunk-tasks-build-rules)))) +;; (planner-trunk-tasks force))) + +;;;_ Planner replan + +;; Remember last day of plan so that it can go back correctly in time. + +(defcustom my-planner-last-replan-day (calendar-current-date) + "Last day plan." + :type '(list + (integer :tag "day") + (integer :tag "month") + (integer :tag "year"))) + +(defun my-planner-replan () + "Run plan with the last day checked." + (interactive) + (let ((current-date (calendar-current-date)) + (number-of-days 0)) + (setq number-of-days + (- (calendar-absolute-from-gregorian current-date) + (calendar-absolute-from-gregorian my-planner-last-replan-day))) + (if (> number-of-days 0) + (plan number-of-days)) + (customize-save-variable 'my-planner-last-replan-day current-date))) + +(defun my-planner-page-template (sections) + "Function to create a planner page." + (mapconcat (lambda (section) + (concat "* " section)) + sections "\n\n\n")) + +(defun my-planner-day-page-template () + "Function template to insert a planner day page." + (my-planner-page-template ["Évènements" "Tâches" "Rendez-vous" "Horaire" "Notes" "Activités"])) + +(defun my-planner-plan-page-template () + "Function template to insert a planner day page." + (my-planner-page-template ["Tâches" "Notes" "Rapport d'activités"])) + +;;;_ Set the diary export file + +;; Should have been used with a (get-planner-default-directory) too. + +(setq planner-export-diary-number-of-days 7 + diary-file "~/Plans/diary" + planner-export-diary-file "~/Plans/diary.planner") + +;; global key mapping + +(defvar my-planner-keymap + (let ((map (make-sparse-keymap))) + (mapcar + (lambda (args) + (apply (lambda (key symbol) + (define-key map key symbol)) args)) + '(("a" planner-create-task) + ("b" planner-create-task-from-buffer) + ("c" timeclock-change) + ("f" planner-appt-forthcoming-display) + ("p" planner-goto-plan-page) + ("i" timeclock-in) + ("j" planner-goto) + ("o" timeclock-out) + ("r" timeclock-reread-log) + ("s" planner-goto-today) + ("v" timeclock-status-string) + ("w" my-planner-week-summary) + ("x" planner-index))) + map) + "Global planner keymap I love to use.") + +(define-key ctl-x-map "t" my-planner-keymap) + +(provide 'my-planner) +