aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Seidel1997-08-05 22:34:14 +0000
committerOliver Seidel1997-08-05 22:34:14 +0000
commit3d8105fb39ed39dd49982246a514204d39596c8e (patch)
tree5a7d0be1fd48f8cd536f5c1c20937c36294fb859
parentdc64c73985460065cc9fdb607cfec25530755009 (diff)
downloademacs-3d8105fb39ed39dd49982246a514204d39596c8e.tar.gz
emacs-3d8105fb39ed39dd49982246a514204d39596c8e.zip
Fixed insertion routine with help from Trey Jackson
<tjackson@ichips.intel.com>; added todo-ins-thresh; fixed keyboard layout to remove unwanted keys.
-rw-r--r--lisp/calendar/todo-mode.el139
1 files changed, 80 insertions, 59 deletions
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index 39f35a548fc..09998719a27 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -6,9 +6,13 @@
6;; please contact (address) O Seidel, Lessingstr 8, Eschborn, FRG 6;; please contact (address) O Seidel, Lessingstr 8, Eschborn, FRG
7;; (e-mail ) Oliver.Seidel@cl.cam.ac.uk (2 Aug 1997) 7;; (e-mail ) Oliver.Seidel@cl.cam.ac.uk (2 Aug 1997)
8 8
9;; $Id: todomode.el,v 1.5 1997/08/05 14:43:39 os10000 Exp os10000 $ 9;; $Id: todomode.el,v 1.6 1997/08/05 16:47:01 os10000 Exp os10000 $
10;; 10;;
11;; $Log: todomode.el,v $ 11;; $Log: todomode.el,v $
12;; Revision 1.6 1997/08/05 16:47:01 os10000
13;; Incorporated menus for XEmacs from Allan.Cochrane@soton.sc.philips.com,
14;; fixed TYPO, fixed todo-file-cmd, cleaned up rcs history.
15;;
12;; Revision 1.5 1997/08/05 14:43:39 os10000 16;; Revision 1.5 1997/08/05 14:43:39 os10000
13;; Added improvements from Ron Gut <rgut@aware.com>. 17;; Added improvements from Ron Gut <rgut@aware.com>.
14;; Added category management. 18;; Added category management.
@@ -84,6 +88,21 @@
84;; and use the #include command to include your todo list file as part 88;; and use the #include command to include your todo list file as part
85;; of your diary. 89;; of your diary.
86;; 90;;
91;; Another nifty feature is the insertion accuracy. If you have 8 items
92;; in your TODO list, then you may get asked 4 questions by the binary
93;; insertion algorithm. However, you may not really have a need for such
94;; accurate priorities amongst your TODO items. If you now think about
95;; the binary insertion halfing the size of the window each time, then
96;; the threshhold is the window size at which it will stop. If you set
97;; the threshhold to zero, the upper and lower bound will coincide at the
98;; end of the loop and you will insert your item just before that point.
99;; If you set the threshhold to i.e. 8, it will stop as soon as the window
100;; size drops below that amount and will insert the item in the approximate
101;; centre of that window. I got the idea for this feature after reading
102;; a very helpful e-mail reply from Trey Jackson <tjackson@ichips.intel.com>
103;; who corrected some of my awful coding and pointed me towards some good
104;; reading. Thanks Trey!
105;;
87;; Enjoy this package and express your gratitude by sending valuables 106;; Enjoy this package and express your gratitude by sending valuables
88;; to my parents' address as listed above!!! 107;; to my parents' address as listed above!!!
89;; 108;;
@@ -97,24 +116,30 @@
97(defvar todo-file-do "~/.todo-do" "TODO mode filename of list file") 116(defvar todo-file-do "~/.todo-do" "TODO mode filename of list file")
98(defvar todo-file-done "~/.todo-done" "TODO mode filename of archive file") 117(defvar todo-file-done "~/.todo-done" "TODO mode filename of archive file")
99(defvar todo-mode-hook nil "Hooks invoked when the *TODO* buffer is created.") 118(defvar todo-mode-hook nil "Hooks invoked when the *TODO* buffer is created.")
119(defvar todo-ins-thresh 0 "TODO mode insertion accuracy.")
100 120
101;; --------------------------------------------------------------------------- 121;; ---------------------------------------------------------------------------
102 122
103(require 'time-stamp) 123(require 'time-stamp)
104 124
105(defvar todo-mode-map (make-sparse-keymap) "TODO mode keymap. See `todo-mode'") 125(defvar todo-mode-map nil "TODO mode keymap. See `todo-mode'")
106(define-key todo-mode-map "+" 'todo-cmd-forw) 126(if todo-mode-map
107(define-key todo-mode-map "-" 'todo-cmd-back) 127 nil
108(define-key todo-mode-map "e" 'todo-cmd-edit) 128 (let ((map (make-keymap)))
109(define-key todo-mode-map "f" 'todo-cmd-file) 129 (suppress-keymap map t)
110(define-key todo-mode-map "i" 'todo-cmd-inst) 130 (define-key map "+" 'todo-cmd-forw)
111(define-key todo-mode-map "k" 'todo-cmd-kill) 131 (define-key map "-" 'todo-cmd-back)
112(define-key todo-mode-map "l" 'todo-cmd-lowr) 132 (define-key map "e" 'todo-cmd-edit)
113(define-key todo-mode-map "n" 'todo-cmd-next) 133 (define-key map "f" 'todo-cmd-file)
114(define-key todo-mode-map "p" 'todo-cmd-prev) 134 (define-key map "i" 'todo-cmd-inst)
115(define-key todo-mode-map "q" 'todo-cmd-done) 135 (define-key map "k" 'todo-cmd-kill)
116(define-key todo-mode-map "r" 'todo-cmd-rais) 136 (define-key map "l" 'todo-cmd-lowr)
117(define-key todo-mode-map "s" 'todo-cmd-save) 137 (define-key map "n" 'todo-cmd-next)
138 (define-key map "p" 'todo-cmd-prev)
139 (define-key map "q" 'todo-cmd-done)
140 (define-key map "r" 'todo-cmd-rais)
141 (define-key map "s" 'todo-cmd-save)
142 (setq todo-mode-map map)))
118 143
119(defun todo-cat-slct () 144(defun todo-cat-slct ()
120 (let ((todo-category-name (nth todo-category-number todo-cats))) 145 (let ((todo-category-name (nth todo-category-number todo-cats)))
@@ -190,17 +215,6 @@
190(defvar todo-prv-lne 0 "previous line that I asked about.") 215(defvar todo-prv-lne 0 "previous line that I asked about.")
191(defvar todo-prv-ans 0 "previous answer that I got.") 216(defvar todo-prv-ans 0 "previous answer that I got.")
192 217
193(defun todo-ask (lne) "Ask whether entry is more important than at LNE."
194 (if (not (equal todo-prv-lne lne))
195 (progn
196 (setq todo-prv-lne lne)
197 (goto-line todo-prv-lne)
198 (setq todo-prv-ans (y-or-n-p (concat "More important than '" (todo-line) "'? ")))
199 )
200 )
201 todo-prv-ans
202 )
203
204(defun todo-add-category (cat) "Add a new category to the TODO list." 218(defun todo-add-category (cat) "Add a new category to the TODO list."
205 (interactive) 219 (interactive)
206 (save-window-excursion 220 (save-window-excursion
@@ -219,49 +233,56 @@
219 0 233 0
220 ) 234 )
221 235
222(defun todo-cmd-inst () "Insert new TODO list entry." 236(defun todo-cmd-inst ()
237 "Insert new TODO list entry."
223 (interactive) 238 (interactive)
224 (beginning-of-line nil) 239 (beginning-of-line nil)
225 (let* ((todo-entry (concat todo-prefix " " (read-from-minibuffer "New TODO entry: "))) 240 (let* ((todo-entry (concat todo-prefix " " (read-from-minibuffer "New TODO entry: ")))
226 (temp-catgs todo-cats) 241 (temp-catgs todo-cats)
227 (todo-hstry (cons 'temp-catgs (+ todo-category-number 1)))) 242 (todo-hstry (cons 'temp-catgs (+ todo-category-number 1))))
228 (save-window-excursion 243 (save-window-excursion
229 (setq todo-category 244 (setq todo-category
230 (read-from-minibuffer "Category: " (nth todo-category-number todo-cats) nil nil todo-hstry)) 245 (read-from-minibuffer "Category: "
231 (let* ((ltrgt todo-category) 246 (nth todo-category-number todo-cats)
232 (lnmbr 0) 247 nil nil todo-hstry))
233 (ltext (car todo-cats)) 248
234 (lrest (cdr todo-cats))) 249 (let ((cat-exists (member todo-category todo-cats)))
235 (setq ltext (car todo-cats)) 250 (setq todo-category-number
236 (while (not (or (null lrest) (string-equal ltext ltrgt))) 251 (if cat-exists
237 (setq ltext (car lrest)) 252 (- (length todo-cats) (length cat-exists))
238 (setq lrest (cdr lrest)) 253 (todo-add-category todo-category))))
239 (setq lnmbr (+ 1 lnmbr))
240 )
241 (setq todo-category-number
242 (if (string-equal ltext todo-category) lnmbr (todo-add-category todo-category)))
243 )
244 (todo-show) 254 (todo-show)
245 (setq todo-prv-lne 0) 255 (setq todo-prv-lne 0)
246 (let* ((todo-fst 1) 256
247 (todo-lst (+ 1 (count-lines (point-min) (point-max))))) 257 (let ((todo-fst 1)
248 (while (< todo-fst todo-lst) 258 (todo-lst (+ 1 (count-lines (point-min) (point-max)))))
249 (let* ((todo-cur (/ (+ todo-fst todo-lst) 2)) 259 (while (> (- todo-lst todo-fst) todo-ins-thresh)
250 (todo-ans (if (< todo-cur todo-lst) (todo-ask todo-cur) nil))) 260 (let* ((todo-cur (/ (+ todo-fst todo-lst) 2))
251 (if todo-ans 261 (todo-ans (if (< todo-cur todo-lst) (todo-ask todo-cur) nil)))
252 (setq todo-lst todo-cur) 262 (if todo-ans
253 (setq todo-fst (+ todo-cur 1))) 263 (setq todo-lst todo-cur)
254 ) 264 (setq todo-fst (+ todo-cur 1)))))
255 ) 265
256 (goto-line todo-fst) 266 (setq todo-fst (/ (+ todo-fst todo-lst) 2))
257 ) 267 ;; goto-line doesn't have the desired behavior in a narrowed buffer
268 (goto-char (point-min))
269 (message (format "todo-fst=%d" todo-fst))
270 (forward-line (- todo-fst 1)))
271
258 (insert (concat todo-entry "\n")) 272 (insert (concat todo-entry "\n"))
259 (forward-line -1) 273 (forward-line -1))
260 )
261 (beginning-of-line nil) 274 (beginning-of-line nil)
262 (message "") 275 (message "")))
263 ) 276
264 ) 277(defun todo-ask (lne)
278 "Ask whether entry is more important than at LNE."
279 (if (not (equal todo-prv-lne lne))
280 (progn
281 (setq todo-prv-lne lne)
282 (goto-char (point-min))
283 (forward-line (- todo-prv-lne 1))
284 (setq todo-prv-ans (y-or-n-p (concat "More important than '" (todo-line) "'? ")))))
285 todo-prv-ans)
265 286
266(defun todo-cmd-kill () "Delete current TODO list entry." 287(defun todo-cmd-kill () "Delete current TODO list entry."
267 (interactive) 288 (interactive)