diff options
| author | Oliver Seidel | 1997-08-03 12:15:13 +0000 |
|---|---|---|
| committer | Oliver Seidel | 1997-08-03 12:15:13 +0000 |
| commit | 3cb152f94116bc9aaad268bf352659d53fb01327 (patch) | |
| tree | 934f1e8333849e95d7d64c624767a60f17745510 | |
| parent | 3fbc965dbac0dd3aff016bdddab85aede176864c (diff) | |
| download | emacs-3cb152f94116bc9aaad268bf352659d53fb01327.tar.gz emacs-3cb152f94116bc9aaad268bf352659d53fb01327.zip | |
Initial revision
| -rw-r--r-- | lisp/calendar/todo-mode.el | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el new file mode 100644 index 00000000000..69e6f72c959 --- /dev/null +++ b/lisp/calendar/todo-mode.el | |||
| @@ -0,0 +1,164 @@ | |||
| 1 | ;; todomode.el -- major mode for editing Todo-List files | ||
| 2 | |||
| 3 | ;; --------------------------------------------------------------------------- | ||
| 4 | |||
| 5 | ;; Note: You may copy this file freely for non-commercial use; otherwise, | ||
| 6 | ;; please contact (address) O Seidel, Lessingstr 8, Eschborn, FRG | ||
| 7 | ;; (e-mail ) Oliver.Seidel@cl.cam.ac.uk (2 Aug 1997) | ||
| 8 | |||
| 9 | ;; $Id:$ | ||
| 10 | ;; | ||
| 11 | ;; $Log:$ | ||
| 12 | ;; | ||
| 13 | |||
| 14 | ;; --------------------------------------------------------------------------- | ||
| 15 | |||
| 16 | ;; User-configurable variables: | ||
| 17 | |||
| 18 | (defvar todo-file-do "~/.todo-do" "TODO mode filename of list file") | ||
| 19 | (defvar todo-file-done "~/.todo-done" "TODO mode filename of archive file") | ||
| 20 | (defvar todo-mode-hook nil "Hooks invoked when the *TODO* buffer is created.") | ||
| 21 | |||
| 22 | ;; --------------------------------------------------------------------------- | ||
| 23 | |||
| 24 | (require 'time-stamp) | ||
| 25 | |||
| 26 | (defvar todo-begin (point-min) "TODO mode beginning of line") | ||
| 27 | (defvar todo-end (point-min) "TODO mode end of line") | ||
| 28 | |||
| 29 | (setq todo-mode-map (make-keymap)) | ||
| 30 | (suppress-keymap todo-mode-map) | ||
| 31 | (define-key todo-mode-map "p" 'todo-cmd-prev) | ||
| 32 | (define-key todo-mode-map "n" 'todo-cmd-next) | ||
| 33 | (define-key todo-mode-map "q" 'todo-cmd-done) | ||
| 34 | (define-key todo-mode-map "e" 'todo-cmd-edit) | ||
| 35 | (define-key todo-mode-map "i" 'todo-cmd-inst) | ||
| 36 | (define-key todo-mode-map "k" 'todo-cmd-kill) | ||
| 37 | (define-key todo-mode-map "f" 'todo-cmd-file) | ||
| 38 | |||
| 39 | (defun todo-cmd-prev () "Select previous entry." | ||
| 40 | (interactive) | ||
| 41 | (forward-line -1) | ||
| 42 | (beginning-of-line nil) | ||
| 43 | (message "") | ||
| 44 | ) | ||
| 45 | |||
| 46 | (defun todo-cmd-next () "Select next entry." | ||
| 47 | (interactive) | ||
| 48 | (forward-line 1) | ||
| 49 | (beginning-of-line nil) | ||
| 50 | (message "") | ||
| 51 | ) | ||
| 52 | |||
| 53 | (defun todo-cmd-done () "Done with todo list for now." | ||
| 54 | (interactive) | ||
| 55 | (save-buffer) | ||
| 56 | (bury-buffer) | ||
| 57 | ) | ||
| 58 | |||
| 59 | (defun todo-line () "Find current line in buffer." | ||
| 60 | (end-of-line nil) (setq todo-end (point)) | ||
| 61 | (beginning-of-line nil) (setq todo-begin (point)) | ||
| 62 | (buffer-substring todo-begin todo-end) | ||
| 63 | ) | ||
| 64 | |||
| 65 | (defun todo-cmd-edit () "Edit current todo list entry." | ||
| 66 | (interactive) | ||
| 67 | (setq todo-entry (todo-line)) | ||
| 68 | (delete-region todo-begin todo-end) | ||
| 69 | (insert (read-from-minibuffer "Edit: " todo-entry)) | ||
| 70 | (beginning-of-line nil) | ||
| 71 | (message "") | ||
| 72 | ) | ||
| 73 | |||
| 74 | (defvar todo-prv-lne 0 "previous line that I asked about.") | ||
| 75 | (defvar todo-prv-ans 0 "previous answer that I got.") | ||
| 76 | |||
| 77 | (defun todo-ask (lne) "Ask whether entry is more important than at LNE." | ||
| 78 | (if (not (equal todo-prv-lne lne) ) | ||
| 79 | (progn | ||
| 80 | (setq todo-prv-lne lne) | ||
| 81 | (goto-line todo-prv-lne) | ||
| 82 | (setq todo-prv-ans (y-or-n-p (concat "More important than '" (todo-line) "'? "))) | ||
| 83 | ) | ||
| 84 | ) | ||
| 85 | todo-prv-ans | ||
| 86 | ) | ||
| 87 | |||
| 88 | (defun todo-cmd-inst () "Insert new todo list entry." | ||
| 89 | (interactive) | ||
| 90 | (setq todo-entry (read-from-minibuffer "New TODO entry: ")) | ||
| 91 | (save-window-excursion | ||
| 92 | (find-file todo-file-do) | ||
| 93 | (setq todo-prv-lne 0) | ||
| 94 | (let* ((todo-fst 1) | ||
| 95 | (todo-lst (+ 1 (count-lines (point-min) (point-max))))) | ||
| 96 | (while (< todo-fst todo-lst) | ||
| 97 | (setq todo-cur (/ (+ todo-fst todo-lst) 2)) | ||
| 98 | (setq todo-ans (if (< todo-cur todo-lst) (todo-ask todo-cur) nil)) | ||
| 99 | (if todo-ans | ||
| 100 | (setq todo-lst todo-cur) | ||
| 101 | (setq todo-fst (+ todo-cur 1))) | ||
| 102 | ) | ||
| 103 | (goto-line todo-fst) | ||
| 104 | ) | ||
| 105 | (insert (concat todo-entry "\n")) | ||
| 106 | (forward-char -1) | ||
| 107 | ) | ||
| 108 | (beginning-of-line nil) | ||
| 109 | (message "") | ||
| 110 | ) | ||
| 111 | |||
| 112 | (defun todo-cmd-kill () "Delete current todo list entry." | ||
| 113 | (interactive) | ||
| 114 | (if (> (count-lines (point-min) (point-max)) 0) | ||
| 115 | (progn | ||
| 116 | (setq todo-entry (todo-line)) | ||
| 117 | (setq todo-answer (y-or-n-p (concat "Permanently remove '" todo-entry "'? "))) | ||
| 118 | (if todo-answer (progn (delete-region todo-begin (+ 1 todo-end)) (forward-char -1))) | ||
| 119 | ) | ||
| 120 | (message "No entry to delete.") | ||
| 121 | ) | ||
| 122 | (beginning-of-line nil) | ||
| 123 | (message "") | ||
| 124 | ) | ||
| 125 | |||
| 126 | (defun todo-cmd-file () "File away the current todo list entry." | ||
| 127 | (interactive) | ||
| 128 | (if (> (count-lines (point-min) (point-max)) 0) | ||
| 129 | (progn | ||
| 130 | (setq time-stamp-format " %2d, %y, %02I:%02M%p %b") | ||
| 131 | (setq tmp (time-stamp-string)) | ||
| 132 | (beginning-of-line nil) | ||
| 133 | (insert (concat (substring tmp 19 22) (substring tmp 0 19))) | ||
| 134 | (end-of-line nil) | ||
| 135 | (insert (concat " (" (read-from-minibuffer "Comment: ") ")")) | ||
| 136 | (todo-line) | ||
| 137 | (append-to-file todo-begin (+ 1 todo-end) todo-file-done) | ||
| 138 | (delete-region todo-begin (+ 1 todo-end)) | ||
| 139 | (forward-char -1) | ||
| 140 | ) | ||
| 141 | (message "No entry to delete.") | ||
| 142 | ) | ||
| 143 | (beginning-of-line nil) | ||
| 144 | (message "") | ||
| 145 | ) | ||
| 146 | |||
| 147 | ;; --------------------------------------------------------------------------- | ||
| 148 | |||
| 149 | (defun todo-mode () | ||
| 150 | "Major mode for editing TODO lists.\n\n\\{todo-mode-map}" | ||
| 151 | (interactive) | ||
| 152 | (find-file todo-file-do) | ||
| 153 | (setq major-mode 'todo-mode) | ||
| 154 | (setq mode-name "TODO") | ||
| 155 | (use-local-map todo-mode-map) | ||
| 156 | (run-hooks 'todo-mode-hook) ) | ||
| 157 | |||
| 158 | (provide 'todomode) | ||
| 159 | |||
| 160 | ;; --------------------------------------------------------------------------- | ||
| 161 | |||
| 162 | ;;; todomode.el ends here | ||
| 163 | |||
| 164 | ;; --------------------------------------------------------------------------- | ||