diff options
| author | Oliver Seidel | 1997-08-05 22:34:14 +0000 |
|---|---|---|
| committer | Oliver Seidel | 1997-08-05 22:34:14 +0000 |
| commit | 3d8105fb39ed39dd49982246a514204d39596c8e (patch) | |
| tree | 5a7d0be1fd48f8cd536f5c1c20937c36294fb859 | |
| parent | dc64c73985460065cc9fdb607cfec25530755009 (diff) | |
| download | emacs-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.el | 139 |
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) |