lisp/my-old-planner.el
author Fabien Ninoles <fabien@tzone.org>
Thu, 13 Oct 2011 08:46:42 -0400
changeset 1 a234a7579958
permissions -rw-r--r--
Add Emacs lisp files.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     1
; timeclock functionnality
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     2
(require 'timeclock)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     3
(require 'calendar)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     4
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     5
;(timeclock-modeline-display)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     6
(add-hook 'kill-emacs-hook 'timeclock-query-out)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     7
 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     8
;; planner mode
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     9
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    10
;;; helper functions
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    11
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    12
(defun planner-date-to-calendar (date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    13
  "Convert a planner date string like \"YYYY.MM.DD\" in
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    14
   a calendar date list (month day year)."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    15
  (let ((split-date 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    16
         (mapcar 'string-to-number 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    17
                 (split-string (file-name-nondirectory date) "\\."))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    18
    (list (nth 1 split-date) 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    19
          (nth 2 split-date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    20
          (nth 0 split-date))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    21
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    22
(defsubst calendar-date-to-planner (date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    23
; "Convert a planner date string like \"YYYY.MM.DD\" in
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    24
; a calendar date list (month day year)."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    25
  (format "%04d.%02d.%02d"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    26
          (nth 2 date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    27
          (nth 0 date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    28
          (nth 1 date)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    29
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    30
;; Moving functions
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    31
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    32
(defun planner-goto-schedule ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
  "Create if necessary and go to a Schedule section in current planner.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    34
Ensure to preserved the buffer-modified-p value so that a kill will not
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    35
preserve the automated change for nothing."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    36
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    37
  (goto-char (point-min))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
  (let ((modified (buffer-modified-p)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    39
    (unless (re-search-forward "^\\* Schedule\n\n" nil t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    40
      (re-search-forward "^\\* Notes")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    41
      (beginning-of-line)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    42
      (insert "* Schedule\n\n\n\n")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    43
      (forward-line -2)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    44
      (set-buffer-modified-p modified))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    45
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    46
(defun planner-goto-events ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    47
  "Create if necessary and go to a Events section just before the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    48
Schedule one (which is also create if necessary) in current planner.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    49
Ensure to preserved the buffer-modified-p value so that a kill will
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
not preserve the automated change for nothing."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    51
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    52
  (goto-char (point-min))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    53
  (let ((modified (buffer-modified-p)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    54
    (unless (re-search-forward "^\\* Events\n\n" nil t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    55
      (planner-goto-schedule)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    56
      (re-search-backward "^\\* Schedule")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    57
      (insert "* Events\n\n\n\n")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    58
      (forward-line -2)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    59
      (set-buffer-modified-p modified))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    60
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    61
;; The reminders converter.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    62
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    63
;; It now used a custom diary file, so you
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    64
;; can included it without breaking your normal diary-file.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    65
;; The function can also set some arguments.  I used it to call
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    66
;; a modified remconv which accept a "euro" argument to output
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    67
;; euro style date.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    68
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    69
;; I no more used those ones now since I'm directly marking the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    70
;; calendar and the add-appt from the planner files.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    71
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    72
(defcustom planner-diary-file diary-file
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    73
  "Diary file where to add planner entries.  You can set this value to
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    74
another file than `diary-file' and add in `diary-file' the #include
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    75
\"~/your-planner-diary-file-name\".  Just make sure that you call
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    76
`planner-convert-reminders' before `include-other-diary-files' in the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    77
`list-diary-entries-hook'."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    78
  :type 'file
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    79
  :group 'planner)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    80
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    81
(defcustom planner-remconv-command "remconv"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    82
  "A command that output diary compatible entries.  Can take arguments
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
also."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    84
  :type 'string
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    85
  :group 'planner)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    86
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    87
(defun planner-convert-reminders ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    88
  "Generate a diary file from a .reminders file.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    89
You can add this this function to the `list-diary-entries-hook'"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    90
  (with-current-buffer (find-file-noselect planner-diary-file)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    91
    (erase-buffer)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    92
    (insert (shell-command-to-string planner-remconv-command))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    93
    (save-buffer)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    94
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    95
;; redefinition of planner-maybe-remove-file 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    96
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    97
;; The kill-buffer of this function make me crazy.  I modify it so you
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    98
;; can change it's behavior using this custom variable.  Personnaly, I
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    99
;; used ignore and let emacs ask me to save it when I kill it.  Take
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   100
;; also note that I change the regexp to remove any file that only
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   101
;; have empty section (section with just a first level heading).  This
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   102
;; is to cope with the new Events and Schedule sections.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   103
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   104
(defcustom planner-not-empty-file 'kill-this-buffer
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   105
  "Command to run when a planner file is not empty.  Can be
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   106
kill-this-buffer, save-buffer or ignore for example."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   107
  :type 'function
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   108
  :group 'planner)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   110
(defvar local-planner-empty-line-regexp "\\(\\* .*\\|[[:space:]]*\\)")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   111
(defvar planner-empty-file-regexp 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   112
  (concat "\\(^" local-planner-empty-line-regexp
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   113
          "\n\\)*[[:space:]]*\\'"))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   114
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   115
; redefinition
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   116
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   117
(defun planner-maybe-remove-file ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   118
  "This function remove the file if it contains only first level
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   119
headings and empty lines."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   120
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   121
  (goto-char (point-min))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   122
  (if (looking-at planner-empty-file-regexp)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   123
      (let ((filename buffer-file-name))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   124
	(set-buffer-modified-p nil)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   125
	(kill-buffer (current-buffer))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   126
	(delete-file filename))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   127
    (funcall planner-not-empty-file)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   128
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   129
;; planner-browse-url bbdb url handling
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   130
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   131
;; My emacs-wiki doesn't like bbdb url like [[bbdb://Fabien Niñoles]]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   132
;; I make this advice so he can replace _ with space and __ with _ in the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   133
;; url before letting planner-browse-url handling it.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   134
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   135
(defadvice planner-browse-url (before local-bbdb-url-pretreatment (url))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   136
  "Pretreatment of some URL."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   137
  (if (string-match "^bbdb://\\(.+\\)" url)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   138
      (setq url
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   139
            (mapconcat 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   140
             '(lambda (str) (subst-char-in-string ?_ ?  str t))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   141
             (split-string url "__")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   142
             "_"))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   143
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   144
(ad-activate 'planner-browse-url)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   145
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   146
;; diary support functions
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   147
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   148
;; This functions add diary entries into the Schedule and Events
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   149
;; sections of a planner buffer.  I hook it to the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   150
;; `planner-seek-to-first' function and only if the Events section
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   151
;; doesn't already exist.  The best should be that it check if the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   152
;; entry doesn't exist already instead but currently it works pretty
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   153
;; good.  You can always call it interactively if you want to update
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   154
;; your Events/Schedule.  Just make sure that you don't add the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   155
;; `planner-convert-reminder' set in the `list-diary-entries-hook'
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   156
;; setup.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   157
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   158
(defun planner-insert-diary ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   159
  "Insert the diary schedule in the planner buffer."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   160
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   161
  (let*
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   162
    ((entries (list-diary-entries (planner-date-to-calendar (emacs-wiki-page-name)) 1))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   163
     (events))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   164
    (planner-goto-schedule)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   165
    (while entries
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   166
      (let* ((entry (nth 1 (car entries)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   167
             (lines (split-string entry "\n"))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   168
             (line))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   169
        (while (setq line (car lines))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   170
          (if (string-match
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   171
               "^[[:space:]]*\\([0-9]+:[0-9]\\{2\\}\\(?:am\\|pm\\)?\\)\\(-[0-9]+:[0-9]\\{2\\}\\(?:am\\|pm\\)?\\)?[[:space:]]+\\(.*\\)$" 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   172
               line)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   173
          (let ((starttime (match-string 1 line))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   174
                (endtime (match-string 2 line))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   175
                (description (match-string 3 line)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   176
            (insert (concat "  " starttime
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   177
                            " | " description
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   178
                            (if endtime
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   179
                                (let
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   180
                                    ((minutes
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   181
                                      (- (appt-convert-time (substring endtime 1 nil))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   182
                                         (appt-convert-time starttime))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   183
                                  (format " (%d:%02d)"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   184
                                          (/ minutes 60)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   185
                                          (% minutes 60)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   186
                                "")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   187
                              "\n")))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   188
          (setq events (cons line events)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   189
          (setq lines (cdr lines))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   190
      (setq entries (cdr entries)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   191
    (planner-goto-events)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   192
    (while events
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   193
      (insert (concat " - " (car events) "\n"))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   194
      (setq events (cdr events)))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   195
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   196
(defadvice planner-seek-to-first (after planner-insert-diary-ad ())
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   197
  "Insert the diary into a newly create buffer."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   198
  (if (string-match planner-date-regexp (emacs-wiki-page-name))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   199
      (save-excursion
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   200
        (goto-char (point-min))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   201
        (if (not (re-search-forward "^\\* Events[[:space:]]*$" nil t))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   202
            (planner-insert-diary)))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   203
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   204
(ad-activate 'planner-seek-to-first)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   205
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   206
;; appt support
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   207
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   208
;; I'm loading now my appointments directly from the planner list.  It
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   209
;; has the same functionnality as the regular appt-make-list,
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   210
;; including its own planner-prev-appt-check variable.  It's set as an
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   211
;; after-advice to appt-check.  I also add a function that parse the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   212
;; current line and add the appt to it's list.  The
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   213
;; planner-appt-entry-regexp are setup to catch any 'HH:MM | Message
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   214
;; (HH:MM)' line (just like allrems). You can set it up also to ignore
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   215
;; some special line (like those beginning with '&' for example).
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   216
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   217
(require 'appt)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   218
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   219
(defvar planner-appt-entry-regexp 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   220
  "^[[:space:]]*\\([0-9]+:[0-9]\\{2\\}\\)[[:space:]]*|[[:space:]]*\\([^&].*\\)[[:space:]]*\\(([0-9]+:[0-9]\\{2\\})\\)?[[:space:]]*$"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   221
  "Regexp that match a appt entry in planner.")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   222
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   223
(defun planner-appt-add ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   224
  "Add this line as an appointment.  The line should match
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   225
`planner-appt-entry-regexp'."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   226
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   227
  (save-excursion
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   228
    (beginning-of-line)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   229
    (if (looking-at planner-appt-entry-regexp)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   230
        (appt-add (match-string-no-properties 1) (match-string-no-properties 2))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   231
      (error "No appointment on this line"))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   232
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   233
(defun planner-make-appt-list ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   234
  "Load today planner file and make appt-list from schedule."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   235
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   236
  (save-excursion
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   237
    (save-window-excursion 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   238
      (planner-goto-today)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   239
      (while (re-search-forward planner-appt-entry-regexp nil t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   240
        (appt-add (match-string-no-properties 1) (match-string-no-properties 2))))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   241
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   242
(defvar planner-prev-appt-check nil
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   243
  "Determine the last time appt-check are called")
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   244
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   245
(defadvice appt-check (after planner-appt-check-ad ())
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   246
  "Call planner-make-appt-list the first time and every day."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   247
  (let* ((now (decode-time))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   248
         (cur-hour (nth 2 now))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   249
         (cur-min (nth 1 now))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   250
         (cur-comp-time (+ (* cur-hour 60) cur-min)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   251
    (if (or (null planner-prev-appt-check)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   252
            (< cur-comp-time planner-prev-appt-check))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   253
        (planner-make-appt-list))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   254
    (setq planner-prev-appt-check cur-comp-time)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   255
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   256
(ad-activate 'appt-check)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   257
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   258
;; calendar support
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   259
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   260
;; This function are used to mark calendar entries directly from the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   261
;; planner files.  I try to optimize it with a helper function that
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   262
;; take the list of planner-date string corresponding to the three
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   263
;; months display of the calendar (same behavior as the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   264
;; mark-diary-entries-hook).  One of the helper are made in elisp, and
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   265
;; the other used an external perl script to parse the entries.  The
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   266
;; only thing check is a non-empty (I mean non-space) Events section.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   267
;; Used it as a hook to the `mark-diary-entries-hook'.  Since this
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   268
;; function also search for diary entries, you can used it in
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   269
;; conjunction with diary.  And with the `planner-diary-insert'
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   270
;; function, you just have to type 'n' at the calendar day to see both
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   271
;; the diary and your normal planner entry.  The helper script is call events
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   272
;; and it's very short (see documentation of planner-mark-calendar-external-helper
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   273
;; for the script. The script also return the entry line so that you can remove
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   274
;; specially mark entry if you care, either by directly modifying the
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   275
;; script or by modifying the planner-mark-calendar-external-helper
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   276
;; function.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   277
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   278
(defcustom planner-mark-calendar-helper 'planner-mark-calendar-internal-helper
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   279
  "Helper function to determinate which day have a non-empty events.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   280
Currently, it exist two functions to do it:
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   281
`planner-mark-calendar-internal-helper' which is a lisp
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   282
implementation, and `planner-mark-calendar-external-helper' which used
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   283
a external script to do most of the parsing."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   284
  :type 'function
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   285
  :group 'planner)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   286
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   287
(defun planner-mark-calendar ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   288
  "Look for planner file with non-empty events."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   289
  (save-window-excursion
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   290
    (set-buffer calendar-buffer)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   291
    (let ((prev-month displayed-month)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   292
          (prev-year displayed-year)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   293
          (succ-month displayed-month)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   294
          (succ-year displayed-year)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   295
          (last-day)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   296
          (day)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   297
          (files nil))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   298
      (increment-calendar-month succ-month succ-year 1)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   299
      (increment-calendar-month prev-month prev-year -1)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   300
      (setq day (calendar-absolute-from-gregorian (list prev-month 1 prev-year)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   301
      (setq last-day 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   302
            (calendar-absolute-from-gregorian 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   303
             (list succ-month 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   304
                   (calendar-last-day-of-month succ-month succ-year)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   305
                   succ-year))) 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   306
      (while (<= day last-day)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   307
        (let* ((date (calendar-gregorian-from-absolute day))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   308
               (file 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   309
                (expand-file-name 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   310
                 (calendar-date-to-planner date)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   311
                 planner-directory)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   312
          (if (file-readable-p file)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   313
              (setq files (cons file files))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   314
        (setq day (1+ day)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   315
      (setq files (funcall planner-mark-calendar-helper files))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   316
      (while files
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   317
        (mark-visible-calendar-date (planner-date-to-calendar (car files)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   318
        (setq files (cdr files))))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   319
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   320
(defun planner-mark-calendar-internal-helper (files)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   321
  "Local (elisp) helper function for `planner-mark-calendar'."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   322
  (let ((correct))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   323
    (while files
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   324
      (find-file-other-window (car files))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   325
      (goto-char (point-min))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   326
      (if (re-search-forward "^\\* Events" nil t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   327
          (progn
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   328
            (forward-line 1)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   329
            (if (re-search-forward 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   330
                 "[^[:space:]]+"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   331
                 (save-excursion
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   332
                   (re-search-forward "^\\* " nil t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   333
                   (let ((p (match-beginning 0)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   334
                     (and p (1- p))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   335
                 t)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   336
                (setq correct (cons (car files) correct)))))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   337
      (if (not (buffer-modified-p)) (kill-this-buffer))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   338
      (setq files (cdr files)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   339
    correct))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   340
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   341
(defcustom planner-mark-calendar-external-script "events %s"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   342
  "Command line that select files that must be marked.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   343
This string is send to the shell with %s replace with a list
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   344
of space separate (maybe non-existing) file names. An example
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   345
of such script follow:
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   346
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   347
#!/usr/bin/perl -s
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   348
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   349
for $file (sort @ARGV) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   350
    open (FILE, $file) || die \"Cannot open file $file\\n\";
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   351
    $inevents = 0;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   352
    while (<FILE>) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   353
            if ($inevents == 0) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   354
                if (/^\\* Events/) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   355
                    $inevents = 1;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   356
                }
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   357
            } elsif (/^\\* /) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   358
                $inevents = 0;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   359
                break;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   360
            }
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   361
            elsif (/^\\s*\\S/) {
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   362
                printf \"$file: $_\";
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   363
            }
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   364
        }
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   365
    close (FILE);
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   366
};
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   367
"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   368
  :type 'string
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   369
  :group 'planner)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   370
  
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   371
(defun planner-mark-calendar-external-helper (files)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   372
  "Use an external application to parse the planner files.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   373
The command line is set with the `planner-mark-calendar-external-script'
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   374
variable and must take a list of files as arguments."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   375
  (let* ((command (concat "events " 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   376
                         (mapconcat 'identity files " ")))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   377
         (output (split-string (shell-command-to-string command) "\n"))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   378
         (results))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   379
    (while output
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   380
      (if (string-match "^\\([^:]+\\):" (car output))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   381
          (setq results 
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   382
                (cons (match-string 1 (car output))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   383
                      results)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   384
      (setq output (cdr output)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   385
    results))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   386
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   387
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   388
;; planner-mode key mapping
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   389
;;
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   390
;; No comment for this one.  Do ye want.
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   391
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   392
(eval-after-load "planner"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   393
  '(progn
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   394
     (define-key planner-mode-map [(control ?c) (control ?w)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   395
       'planner-goto-schedule)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   396
     (define-key planner-mode-map [(control ?c) (control ?n)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   397
       'planner-create-note)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   398
     (define-key planner-mode-map [(control ?c) (control ?e)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   399
       'planner-appt-add)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   400
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   401
;; global key mapping
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   402
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   403
(define-key ctl-x-map "ta" 'planner-create-task)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   404
(define-key ctl-x-map "ts" 'planner-goto-today)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   405
(define-key ctl-x-map "ti" 'timeclock-in)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   406
(define-key ctl-x-map "to" 'timeclock-out)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   407
(define-key ctl-x-map "tc" 'timeclock-change)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   408
(define-key ctl-x-map "tr" 'timeclock-reread-log)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   409
(define-key ctl-x-map "tv" 'timeclock-status-string)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   410
;(define-key ctl-x-map "tu" 'timeclock-update-modeline)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   411
;(define-key ctl-x-map "tw" 'timeclock-when-to-leave-string)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   412
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   413
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   414
(defun local-planner-kill-buffer ()
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   415
  "Kill the buffer and erase it if empty."
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   416
  (interactive)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   417
  (let (
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   418
        (planner-not-empty-file 'kill-this-buffer)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   419
;        (planner-not-empty-file (lambda () (save-buffer) (kill-this-buffer)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   420
       )
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   421
    (planner-maybe-remove-file)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   422
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   423
;; planner-mode  key mapping
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   424
(eval-after-load "planner"
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   425
  '(progn
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   426
     (define-key planner-mode-map [(control ?c) (control ?w)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   427
       'planner-goto-schedule)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   428
     (define-key planner-mode-map [(control ?c) (control ?n)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   429
       'planner-create-note)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   430
     (define-key planner-mode-map [(control ?c) (control ?k)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   431
       'local-planner-kill-buffer)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   432
     (define-key planner-mode-map [(control ?c) (control ?e)]
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   433
       'planner-appt-add)))
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   434
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   435
;; global key mapping
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   436
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   437
(define-key ctl-x-map "ta" 'planner-create-task)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   438
(define-key ctl-x-map "ts" 'planner-goto-today)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   439
(define-key ctl-x-map "tj" 'planner-goto)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   440
(define-key ctl-x-map "ti" 'timeclock-in)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   441
(define-key ctl-x-map "to" 'timeclock-out)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   442
(define-key ctl-x-map "tc" 'timeclock-change)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   443
(define-key ctl-x-map "tr" 'timeclock-reread-log)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   444
(define-key ctl-x-map "tv" 'timeclock-status-string)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   445
;(define-key ctl-x-map "tu" 'timeclock-update-modeline)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   446
;(define-key ctl-x-map "tw" 'timeclock-when-to-leave-string)
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   447
a234a7579958 Add Emacs lisp files.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   448
(provide 'local-planner)