changeset 19100:0cbf5673993f

Initial revision
author Oliver Seidel <os10000@seidel-space.de>
date Sun, 03 Aug 1997 12:15:13 +0000
parents 5221c4793bb8
children 31ba6200863a
files lisp/calendar/todo-mode.el
diffstat 1 files changed, 164 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/calendar/todo-mode.el	Sun Aug 03 12:15:13 1997 +0000
@@ -0,0 +1,164 @@
+;; todomode.el -- major mode for editing Todo-List files
+
+;; ---------------------------------------------------------------------------
+
+;; Note: You may copy this file freely for non-commercial use; otherwise,
+;;       please contact   (address) O Seidel, Lessingstr 8, Eschborn, FRG
+;;                        (e-mail ) Oliver.Seidel@cl.cam.ac.uk (2 Aug 1997)
+
+;; $Id:$
+;;
+;; $Log:$
+;;
+
+;; ---------------------------------------------------------------------------
+
+;; User-configurable variables:
+
+(defvar todo-file-do   "~/.todo-do"   "TODO mode filename of list file")
+(defvar todo-file-done "~/.todo-done" "TODO mode filename of archive file")
+(defvar todo-mode-hook nil "Hooks invoked when the *TODO* buffer is created.")
+
+;; ---------------------------------------------------------------------------
+
+(require 'time-stamp)
+
+(defvar todo-begin (point-min) "TODO mode beginning of line")
+(defvar todo-end   (point-min) "TODO mode end of line")
+
+(setq todo-mode-map (make-keymap))
+(suppress-keymap todo-mode-map)
+(define-key todo-mode-map "p" 'todo-cmd-prev)
+(define-key todo-mode-map "n" 'todo-cmd-next)
+(define-key todo-mode-map "q" 'todo-cmd-done)
+(define-key todo-mode-map "e" 'todo-cmd-edit)
+(define-key todo-mode-map "i" 'todo-cmd-inst)
+(define-key todo-mode-map "k" 'todo-cmd-kill)
+(define-key todo-mode-map "f" 'todo-cmd-file)
+
+(defun todo-cmd-prev () "Select previous entry."
+  (interactive)
+  (forward-line -1)
+  (beginning-of-line nil)
+  (message "")
+  )
+
+(defun todo-cmd-next () "Select next entry."
+  (interactive)
+  (forward-line 1)
+  (beginning-of-line nil)
+  (message "")
+  )
+
+(defun todo-cmd-done () "Done with todo list for now."
+  (interactive)
+  (save-buffer)
+  (bury-buffer)
+  )
+
+(defun todo-line () "Find current line in buffer."
+  (end-of-line nil)       (setq todo-end (point))
+  (beginning-of-line nil) (setq todo-begin (point))
+  (buffer-substring todo-begin todo-end)
+  )
+
+(defun todo-cmd-edit () "Edit current todo list entry."
+  (interactive)
+  (setq todo-entry (todo-line))
+  (delete-region todo-begin todo-end)
+  (insert (read-from-minibuffer "Edit: " todo-entry))
+  (beginning-of-line nil)
+  (message "")
+  )
+
+(defvar todo-prv-lne 0 "previous line that I asked about.")
+(defvar todo-prv-ans 0 "previous answer that I got.")
+
+(defun todo-ask (lne) "Ask whether entry is more important than at LNE."
+  (if (not (equal todo-prv-lne lne) )
+      (progn
+	(setq todo-prv-lne lne)
+	(goto-line todo-prv-lne)
+	(setq todo-prv-ans (y-or-n-p (concat "More important than '" (todo-line) "'? ")))
+	)
+    )
+  todo-prv-ans
+  )
+
+(defun todo-cmd-inst () "Insert new todo list entry."
+  (interactive)
+  (setq todo-entry (read-from-minibuffer "New TODO entry: "))
+  (save-window-excursion
+    (find-file todo-file-do)
+    (setq todo-prv-lne 0)
+    (let* ((todo-fst 1)
+	   (todo-lst (+ 1 (count-lines (point-min) (point-max)))))
+      (while (< todo-fst todo-lst)
+	(setq todo-cur (/ (+ todo-fst todo-lst) 2))
+	(setq todo-ans (if (< todo-cur todo-lst) (todo-ask todo-cur) nil))
+	(if todo-ans
+	    (setq todo-lst todo-cur)
+	  (setq todo-fst (+ todo-cur 1)))
+	)
+      (goto-line todo-fst)
+      )
+    (insert (concat todo-entry "\n"))
+    (forward-char -1)
+    )
+  (beginning-of-line nil)
+  (message "")
+  )
+
+(defun todo-cmd-kill () "Delete current todo list entry."
+  (interactive)
+  (if (> (count-lines (point-min) (point-max)) 0)
+      (progn
+	(setq todo-entry (todo-line))
+	(setq todo-answer (y-or-n-p (concat "Permanently remove '" todo-entry "'? ")))
+	(if todo-answer (progn (delete-region todo-begin (+ 1 todo-end)) (forward-char -1)))
+	)
+    (message "No entry to delete.")
+    )
+  (beginning-of-line nil)
+  (message "")
+  )
+
+(defun todo-cmd-file () "File away the current todo list entry."
+  (interactive)
+  (if (> (count-lines (point-min) (point-max)) 0)
+      (progn
+	(setq time-stamp-format " %2d, %y, %02I:%02M%p %b")
+	(setq tmp (time-stamp-string))
+	(beginning-of-line nil)
+	(insert (concat (substring tmp 19 22) (substring tmp 0 19)))
+	(end-of-line nil)
+	(insert (concat " (" (read-from-minibuffer "Comment: ") ")"))
+	(todo-line)
+	(append-to-file todo-begin (+ 1 todo-end) todo-file-done)
+	(delete-region todo-begin (+ 1 todo-end))
+	(forward-char -1)
+	)
+    (message "No entry to delete.")
+    )
+  (beginning-of-line nil)
+  (message "")
+  )
+
+;; ---------------------------------------------------------------------------
+
+(defun todo-mode ()
+  "Major mode for editing TODO lists.\n\n\\{todo-mode-map}"
+  (interactive)
+  (find-file todo-file-do)
+  (setq major-mode 'todo-mode)
+  (setq mode-name "TODO")
+  (use-local-map todo-mode-map)
+  (run-hooks 'todo-mode-hook) )
+
+(provide 'todomode)
+
+;; ---------------------------------------------------------------------------
+
+;;; todomode.el ends here
+
+;; ---------------------------------------------------------------------------