summaryrefslogtreecommitdiff
path: root/lisp/calendar/todo-mode.el
diff options
context:
space:
mode:
authorOliver Seidel <os10000@seidel-space.de>1997-10-28 21:14:51 +0000
committerOliver Seidel <os10000@seidel-space.de>1997-10-28 21:14:51 +0000
commit85b3b16644c40c90fb49f62944cfb47fbe2a5609 (patch)
treee6b6856643c96c13b2c7dfbf21e7e315183fd061 /lisp/calendar/todo-mode.el
parentf1757bdd294a1122cac696d8070d05cf193c8984 (diff)
downloademacs-85b3b16644c40c90fb49f62944cfb47fbe2a5609.tar.gz
Improvements sent in by Dave Love <d.love@dl.ac.uk>:
todo-mode.el: Doc fixes. Customization. (todo-add-item-non-interactively): New arg -- don't dynamically bind ARG. (todo-insert-item): Use it.
Diffstat (limited to 'lisp/calendar/todo-mode.el')
-rw-r--r--lisp/calendar/todo-mode.el245
1 files changed, 163 insertions, 82 deletions
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index 02e1057596f..721e312aeb9 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -4,7 +4,7 @@
;; Author: Oliver.Seidel@cl.cam.ac.uk (was valid on Aug 2, 1997)
;; Created: 2 Aug 1997
-;; Version: $Id: todo-mode.el,v 1.24 1997/10/28 19:41:53 os10000 Exp os10000 $
+;; Version: $Id: todo-mode.el,v 1.25 1997/10/28 20:03:27 os10000 Exp os10000 $
;; Keywords: Categorised TODO list editor, todo-mode
;; This file is part of GNU Emacs.
@@ -28,6 +28,25 @@
;;; Commentary:
+;; Mode Description
+;;
+;; TODO is a major mode for EMACS which offers functionality to
+;; treat most lines in one buffer as a list of items one has to
+;; do. There are facilities to add new items, which are
+;; categorised, to edit or even delete items from the buffer.
+;; The buffer contents are currently compatible with the diary,
+;; so that the list of todo-items will show up in the FANCY diary
+;; mode.
+;;
+;; Notice: Besides the major mode, this file also exports the
+;; function `todo-show' which will change to the one specific
+;; TODO file that has been specified in the todo-file-do
+;; variable. If this file does not conform to the TODO mode
+;; conventions, the todo-show function will add the appropriate
+;; header and footer. I don't anticipate this to cause much
+;; grief, but be warned, in case you attempt to read a plain text
+;; file.
+;;
;; Preface, Quickstart Installation
;;
;; To get this to work, make emacs execute the line
@@ -72,7 +91,7 @@
;;
;; Which version of todo-mode.el does this documentation refer to?
;;
-;; $Id: todo-mode.el,v 1.24 1997/10/28 19:41:53 os10000 Exp os10000 $
+;; $Id: todo-mode.el,v 1.25 1997/10/28 20:03:27 os10000 Exp os10000 $
;;
;; Pre-Requisites
;;
@@ -82,25 +101,6 @@
;; time-stamp
;; easymenu
;;
-;; Mode Description
-;;
-;; TODO is a major mode for EMACS which offers functionality to
-;; treat most lines in one buffer as a list of items one has to
-;; do. There are facilities to add new items, which are
-;; categorised, to edit or even delete items from the buffer.
-;; The buffer contents are currently compatible with the diary,
-;; so that the list of todo-items will show up in the FANCY diary
-;; mode.
-;;
-;; Notice: Besides the major mode, this file also exports the
-;; function "todo-show" which will change to the one specific
-;; TODO file that has been specified in the todo-file-do
-;; variable. If this file does not conform to the TODO mode
-;; conventions, the todo-show function will add the appropriate
-;; header and footer. I don't anticipate this to cause much
-;; grief, but be warned, in case you attempt to read a plain text
-;; file.
-;;
;; Operation
;;
;; You will have the following facilities available:
@@ -125,7 +125,7 @@
;; r to raise the current entry's priority
;; s to save the list
;; S to save the list of top priorities
-;; t show top priority items for each category
+;; t show top priority items for each category
;;
;; When you add a new entry, you are asked for the text and then
;; for the category. I for example have categories for things
@@ -196,7 +196,7 @@
;; is the window size at which it will stop. If you set the
;; threshhold to zero, the upper and lower bound will coincide at
;; the end of the loop and you will insert your item just before
-;; that point. If you set the threshhold to i.e. 8, it will stop
+;; that point. If you set the threshhold to, e.g. 8, it will stop
;; as soon as the window size drops below that amount and will
;; insert the item in the approximate centre of that window. I
;; got the idea for this feature after reading a very helpful
@@ -249,6 +249,12 @@
;;; Change Log:
;; $Log: todo-mode.el,v $
+;; Revision 1.25 1997/10/28 20:03:27 os10000
+;; Harald Backer <harald.backer@fou.telenor.no> sent the following:
+;; Added `todo-save-top-priorities' and option to automatically save top
+;; priorities file when saving todo-file. Changed some default values.
+;; Bug fixes.
+;;
;; Revision 1.24 1997/10/28 19:41:53 os10000
;; Added fix from Frank Ridderbusch <ridderbusch.pad@sni.de>,
;; an apostrophe was missing.
@@ -411,55 +417,124 @@
;;; Code:
+(eval-and-compile ; Removable for installation in
+ ; Emacs 20.
+ (condition-case ()
+ (require 'custom)
+ (error nil))
+ (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+ nil ;; We've got what we needed
+ ;; We have the old custom-library, hack around it!
+ (defmacro defgroup (&rest args)
+ nil)
+ (defmacro defcustom (var value doc &rest args)
+ (` (defvar (, var) (, value) (, doc))))))
+
;; User-configurable variables:
-(defvar todo-prefix "*/*" "*TODO mode prefix for entries.")
-(defvar todo-file-do "~/.todo-do" "*TODO mode list file.")
-(defvar todo-file-done "~/.todo-done" "*TODO mode archive file.")
-(defvar todo-mode-hook nil "*TODO mode hooks.")
-(defvar todo-edit-mode-hook nil "*TODO Edit mode hooks.")
-(defvar todo-insert-threshold 0 "*TODO mode insertion accuracy.")
+(defgroup todo nil
+ "Maintain a list of todo items."
+ :group 'calendar)
+
+(defcustom todo-prefix "*/*"
+ "*TODO mode prefix for entries.
+
+This is useful in conjunction with `calendar' and `diary' if you use
+
+#include \"~/.todo-do\"
+
+in your diary file to include your todo list file as part of your
+diary. With the default value \"*/*\" the diary displays each entry
+every day and it may also be marked on every day of the calendar.
+Using \"&%%(equal (calendar-current-date) date)\" instead will only
+show and mark todo entreis for today, but may slow down processing of
+the diary file somewhat."
+ :type 'string
+ :group 'todo)
+(defcustom todo-file-do "~/.todo-do"
+ "*TODO mode list file."
+ :type 'file
+ :group 'todo)
+(defcustom todo-file-done "~/.todo-done"
+ "*TODO mode archive file."
+ :type 'file
+ :group 'todo)
+(defcustom todo-mode-hook nil
+ "*TODO mode hooks."
+ :type 'hook
+ :group 'todo)
+(defcustom todo-edit-mode-hook nil
+ "*TODO Edit mode hooks."
+ :type 'hook
+ :group 'todo)
+(defcustom todo-insert-threshold 0
+ "*TODO mode insertion accuracy.
+
+If you have 8 items in your TODO list, then you may get asked 4
+questions by the binary insertion algorithm. However, you may not
+really have a need for such accurate priorities amongst your TODO
+items. If you now think about the binary insertion halfing the size
+of the window each time, then the threshhold is the window size at
+which it will stop. If you set the threshhold to zero, the upper and
+lower bound will coincide at the end of the loop and you will insert
+your item just before that point. If you set the threshhold to,
+e.g. 8, it will stop as soon as the window size drops below that
+amount and will insert the item in the approximate centre of that
+window."
+ :type 'integer
+ :group 'todo)
(defvar todo-edit-buffer " *TODO Edit*" "TODO Edit buffer name.")
-(defvar todo-file-top "~/.todo-top"
+(defcustom todo-file-top "~/.todo-top"
"*TODO mode top priorities file.
+
Not in TODO format, but diary compatible.
-Automatically generated when `todo-save-top-priorities' is non-nil.")
-
-(defvar todo-print-function 'ps-print-buffer-with-faces
- "*Function to print the current buffer.")
-(defvar todo-show-priorities 1
- "*Default number of priorities to show by
- \\[todo-top-priorities]. 0 means show all entries.")
-(defvar todo-print-priorities 0
- "*Default number of priorities to print by
- \\[todo-print]. 0 means print all entries.")
-(defvar todo-remove-separator t
- "*Non-nil removes category separators in
- \\[todo-top-priorities] and \\[todo-print].")
-(defvar todo-save-top-priorities-too t
+Automatically generated when `todo-save-top-priorities' is non-nil."
+ :type 'string
+ :group 'todo)
+
+(defcustom todo-print-function 'ps-print-buffer-with-faces
+ "*Function to print the current buffer."
+ :type 'symbol
+ :group 'todo)
+(defcustom todo-show-priorities 1
+ "*Default number of priorities to show by \\[todo-top-priorities].
+0 means show all entries."
+ :type 'integer
+ :group 'todo)
+(defcustom todo-print-priorities 0
+ "*Default number of priorities to print by \\[todo-print].
+0 means print all entries."
+ :type 'integer
+ :group 'todo)
+(defcustom todo-remove-separator t
+ "*Non-nil to remove category separators in\
+\\[todo-top-priorities] and \\[todo-print]."
+ :type 'boolean
+ :group 'todo)
+(defcustom todo-save-top-priorities-too t
"*Non-nil makes todo-save automatically save top-priorities in
-`todo-file-top'.")
+`todo-file-top'."
+ :type 'boolean
+ :group 'todo)
;; Thanks for the ISO time stamp format go to Karl Eichwalder <ke@suse.de>
;; My format string for the appt.el package is "%3b %2d, %y, %02I:%02M%p".
;;
-(defvar todo-time-string-format
+(defcustom todo-time-string-format
"%:y-%02m-%02d %02H:%02M"
- "TODO mode time string format for done entries.
-For details see the variable `time-stamp-format'.")
-
-(defvar todo-entry-prefix-function nil
- "*Function producing text to insert at start of todo entry.
-
-See `todo-entry-prefix-function' as an example:
-(defun todo-entry-timestamp-initials ()
- \"Prepend timestamp and your initials to the head of a TODO entry.\"
- (let ((time-stamp-format todo-time-string-format))
- (concat (time-stamp-string) \" \" todo-initials \": \")))
-")
-
-(defvar todo-initials (or (getenv "INITIALS") (user-login-name))
- "*Initials of todo item author.")
+ "*TODO mode time string format for done entries.
+For details see the variable `time-stamp-format'."
+ :type 'string
+ :group 'todo)
+
+(defcustom todo-entry-prefix-function 'todo-entry-timestamp-initials
+ "*Function producing text to insert at start of todo entry."
+ :type 'symbol
+ :group 'todo)
+(defcustom todo-initials (or (getenv "INITIALS") (user-login-name))
+ "*Initials of todo item author."
+ :type 'string
+ :group 'todo)
(defun todo-entry-timestamp-initials ()
"Prepend timestamp and your initials to the head of a TODO entry."
@@ -478,8 +553,9 @@ See `todo-entry-prefix-function' as an example:
;; Set up some helpful context ...
(defvar todo-categories nil "TODO categories.")
-(defvar todo-cats nil "Old variable for holding the
-TODO categories. Use `todo-categories' instead.")
+(defvar todo-cats nil
+ "Old variable for holding the TODO categories.
+Use `todo-categories' instead.")
(defvar todo-previous-line 0 "Previous line that I asked about.")
(defvar todo-previous-answer 0 "Previous answer that I got.")
(defvar todo-mode-map nil "TODO mode keymap.")
@@ -562,7 +638,7 @@ TODO categories. Use `todo-categories' instead.")
(defalias 'todo-cmd-prev 'todo-backward-item)
(defun todo-forward-item (&optional count)
- "Select Nth next entry of TODO list."
+ "Select COUNT-th next entry of TODO list."
(interactive "P")
(if (listp count) (setq count (car count)))
(end-of-line)
@@ -611,7 +687,8 @@ TODO categories. Use `todo-categories' instead.")
(narrow-to-region (todo-item-start) (todo-item-end))))
;;;### autoload
-(defun todo-add-category (cat) "Add a new category to the TODO list."
+(defun todo-add-category (cat)
+ "Add new category CAT to the TODO list."
(interactive)
(save-window-excursion
(setq todo-categories (cons cat todo-categories))
@@ -634,8 +711,8 @@ TODO categories. Use `todo-categories' instead.")
0)
;;;### autoload
-(defun todo-add-item-non-interactively (new-item category)
- "Insert new TODO list entry."
+(defun todo-add-item-non-interactively (new-item category ARG)
+ "Insert NEW-ITEM in TODO list as a new entry in CATEGORY."
(save-excursion
(todo-show)
(if (string= "" category)
@@ -670,25 +747,27 @@ TODO categories. Use `todo-categories' instead.")
;;;### autoload
(defun todo-insert-item (ARG)
- "Insert new TODO list entry."
+ "Insert new TODO list entry.
+With a prefix argument solicit the category, otherwise use the current
+category."
(interactive "P")
(todo-show)
(let* ((new-item (concat todo-prefix " "
(read-from-minibuffer
"New TODO entry: "
- (if todo-entry-prefix-function
- (funcall todo-entry-prefix-function)))))
+ (if todo-entry-prefix-function
+ (funcall todo-entry-prefix-function)))))
(categories todo-categories)
(history (cons 'categories (1+ todo-category-number)))
(current-category (nth todo-category-number todo-categories))
(category
(if ARG
current-category
- (completing-read
- (concat "Category ["
- current-category "]: ")
- (todo-category-alist) nil nil nil history))))
- (todo-add-item-non-interactively new-item category)))
+ (completing-read
+ (concat "Category ["
+ current-category "]: ")
+ (todo-category-alist) nil nil nil history))))
+ (todo-add-item-non-interactively new-item category ARG)))
(defalias 'todo-cmd-inst 'todo-insert-item)
@@ -791,7 +870,9 @@ between each category."
(or nof-priorities (setq nof-priorities todo-show-priorities))
(if (listp nof-priorities) ;universal argument
(setq nof-priorities (car nof-priorities)))
- (let ((todo-category-break (if category-pr-page " " ""))
+ (let ((todo-print-buffer-name "*Tmp*")
+ ;;(todo-print-category-number 0)
+ (todo-category-break (if category-pr-page " " ""))
(cat-end
(concat
(if todo-remove-separator
@@ -803,8 +884,8 @@ between each category."
(save-excursion
(save-restriction
(widen)
- (copy-to-buffer todo-tmp-buffer-name (point-min) (point-max))
- (set-buffer todo-tmp-buffer-name)
+ (copy-to-buffer todo-print-buffer-name (point-min) (point-max))
+ (set-buffer todo-print-buffer-name)
(goto-char (point-min))
(if (re-search-forward (regexp-quote todo-header) nil t)
(progn
@@ -831,9 +912,9 @@ between each category."
;; Could have used switch-to-buffer as it has a norecord argument,
;; which is nice when we are called from e.g. todo-print.
;; Else we could have used pop-to-buffer.
- (display-buffer todo-tmp-buffer-name)
+ (display-buffer todo-print-buffer-name)
(message "Type C-x 1 to remove %s window. M-C-v to scroll the help."
- todo-tmp-buffer-name)
+ todo-print-buffer-name)
))
;;;###autoload
@@ -931,11 +1012,11 @@ Number of entries for each category is given by
(length (split-string string "\n")))
(defun todo-string-multiline-p (string)
- "Returns non-nil if STRING spans several lines"
+ "Return non-nil if STRING spans several lines."
(> (todo-string-count-lines string) 1))
(defun todo-category-alist ()
- "Generate an alist fro use in `completing-read' from `todo-categories'"
+ "Generate an alist for use in `completing-read' from `todo-categories'."
(mapcar (lambda (cat) (cons cat nil))
todo-categories))