Makefile: Update .PHONY lines.
[remember-el.git] / remember-planner.el
blobb806083aafb0089b3a66967908beaae417c04d64
1 ;;; remember-planner --- Planner support for remember.el
3 ;; Copyright (C) 1999, 2000, 2001 John Wiegley
4 ;; Copyright (C) 2003 Sandra Jean Chua
6 ;; Author: John Wiegley <johnw@gnu.org>
7 ;; Maintainer: Sacha Chua <sacha@free.net.ph>
8 ;; Created: 29 Mar 1999
9 ;; Keywords: data memory todo pim blog
10 ;; URL: http://gna.org/projects/remember-el/
12 ;; This file is not part of GNU Emacs.
14 ;; This is free software; you can redistribute it and/or modify it under
15 ;; the terms of the GNU General Public License as published by the Free
16 ;; Software Foundation; either version 2, or (at your option) any later
17 ;; version.
19 ;; This is distributed in the hope that it will be useful, but WITHOUT
20 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 ;; for more details.
24 ;; You should have received a copy of the GNU General Public License
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the
26 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27 ;; MA 02111-1307, USA.
29 ;;; Commentary:
31 ;; To use, place this in your .emacs
33 ;; (require 'remember-planner)
34 ;; (setq remember-handler-functions '(remember-planner-append))
36 ;; You might also want to
37 ;; (setq remember-annotation-functions planner-annotation-functions)
38 ;; or
39 ;; (defvaralias 'remember-annotation-functions 'planner-annotation-functions)
41 ;; Then type M-x remember to remember new text, or
42 ;; C-u M-x remember to remember a region
44 ;;; Code:
46 (require 'planner)
47 (require 'remember)
49 (defcustom remember-planner-xref-p t
50 "*Non-nil means cross-reference entries with a plan page."
51 :type 'boolean
52 :group 'remember)
54 (defcustom remember-planner-copy-on-xref-flag t
55 "*Non-nil means copy note text instead of moving it to the plan page.
56 WARNING: If you set this to nil, make sure you do not call
57 planner-update-note from the page without the note body."
58 :type 'boolean
59 :group 'remember)
61 (defcustom remember-planner-timestamp-format " %H:%M"
62 "*Format of timestamp for remember entries.
63 If you don't want timestamps, just set this to \"\"."
64 :type 'string
65 :group 'remember)
67 (defcustom remember-planner-append-hook '(remember-planner-add-timestamp)
68 "Functions to run after something has been appended to the planner day page.
69 Buffer will be narrowed to the current note."
70 :type 'hook
71 :group 'remember)
73 (defcustom remember-planner-page nil
74 "Planner page to save to by default.
75 This defaults to the current planner page."
76 :type '(choice (string :tag "Planner page")
77 (const :tag "Current page" nil))
78 :group 'remember)
80 ;;;###autoload
81 (defun remember-planner-append (&optional page)
82 "Remember this text to PAGE or today's page.
83 This function can be added to `remember-handler-functions'."
84 (unless (or page (not planner-use-plan-pages))
85 (setq page
86 (let ((planner-default-page (or remember-planner-page (planner-today))))
87 (when (or (not planner-use-day-pages)
88 remember-planner-xref-p)
89 (planner-read-name (planner-file-alist))))))
90 (let ((text (buffer-string))
91 start)
92 (save-window-excursion
93 (if planner-use-day-pages
94 (planner-create-note (planner-today))
95 (planner-create-note page))
96 (setq start (planner-line-beginning-position))
97 (insert text)
98 (unless (bolp) (insert "\n\n")) ;; trailing newline
99 (save-restriction
100 (narrow-to-region start (point))
101 (when remember-planner-xref-p
102 (remember-planner-add-xref page))
103 (mapcar
104 (lambda (hook)
105 (save-window-excursion
106 (save-restriction
107 (funcall hook))))
108 remember-planner-append-hook)
109 ;; Should be back on today's page
110 (unless (or remember-planner-copy-on-xref-flag
111 (null page)
112 (if planner-use-day-pages
113 (string= page (planner-today))
115 (delete-region (planner-line-end-position) (point-max))))
116 (when remember-save-after-remembering
117 (save-buffer)))
120 (defun remember-planner-add-timestamp ()
121 "Add a timestamp to the current entry.
122 This function can be added to `remember-planner-append-hook'."
123 (goto-char (point-min))
124 (goto-char (planner-line-end-position))
125 (skip-syntax-backward " ")
126 (when (= (char-before (point)) ?)) ; Cross-referenced
127 (search-backward "(" (planner-line-beginning-position) t))
128 (skip-syntax-backward " ")
129 (insert (format-time-string remember-planner-timestamp-format
130 (current-time)))
131 (planner-update-note))
133 (defun remember-planner-add-xref (&optional plan-page)
134 "Move the main text into PAGE.
135 Replace the day page entry with a cross-reference.
136 This should be called from the day page."
137 (interactive (list (planner-read-name (planner-file-alist))))
138 (or plan-page (setq plan-page (planner-read-name (planner-file-alist))))
139 (when (string-match planner-date-regexp (planner-page-name))
140 (save-restriction
141 (planner-narrow-to-note)
142 (goto-char (point-min))
143 (when (looking-at "^.#\\([0-9]+\\)\\s-+\\(.*\\)")
144 (let* (plan-number
145 (day-number (planner-match-string-no-properties 1))
146 (day-page (planner-today))
147 (title (planner-match-string-no-properties 2))
148 (planner-default-page (or remember-planner-page (planner-today)))
149 (body (buffer-substring-no-properties (planner-line-end-position)
150 (point-max))))
151 (unless (or (not plan-page) (equal plan-page (planner-today)))
152 (when (and (featurep 'planner-multi)
153 (string-match planner-multi-separator plan-page))
154 (setq plan-page (concat (planner-make-link (concat (planner-today) "#" day-number))
155 planner-multi-separator plan-page)))
156 (planner-replan-note plan-page)
157 (goto-char (point-min))))))))
159 (defun remember-planner-set-default-page ()
160 "Set `remember-planner-page' if called from a plan page."
161 (setq remember-planner-page
162 (and (equal major-mode 'planner-mode)
163 (not (string-match planner-date-regexp
164 (planner-page-name)))
165 (planner-page-name))))
167 (add-hook 'remember-before-remember-hook 'remember-planner-set-default-page)
168 (custom-add-option 'remember-handler-functions 'remember-planner-append)
170 (provide 'remember-planner)
172 ;;; remember-planner.el ends here