Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7304e86ce | ||
|
|
d7b95cb2e1 | ||
|
|
45ed7dcdaa | ||
|
|
d809b6dae7 | ||
|
|
a1cc4e5774 | ||
|
|
21c33f7030 | ||
|
|
2e32457032 | ||
|
|
e4ed873d60 | ||
|
|
e35dcd0e42 | ||
|
|
ec15dc9342 | ||
|
|
fb87039d8c | ||
|
|
e9a71b7db9 | ||
|
|
df215f228d | ||
|
|
4f8f044644 | ||
|
|
4380c7c712 | ||
|
|
4abc722eff | ||
|
|
11225eb599 | ||
|
|
e16bd057d8 | ||
|
|
29a152edb0 | ||
|
|
e99e6832f2 | ||
|
|
ff4e8dbef1 | ||
|
|
d265ac6c2d | ||
|
|
dc1760769f | ||
|
|
c6eb09cd63 | ||
|
|
e080c3168c | ||
|
|
ea06565007 | ||
|
|
4ae189f77d | ||
|
|
ebf4f3cb12 | ||
|
|
4d1cdf0270 | ||
|
|
ceffdca8a2 | ||
|
|
bb7f48496a | ||
|
|
da7cda3c82 | ||
|
|
31a5816fb4 | ||
|
|
a443257aaa |
6
AUTHORS
6
AUTHORS
@@ -3,6 +3,8 @@ Principal Author:
|
|||||||
|
|
||||||
Contributing Authors:
|
Contributing Authors:
|
||||||
Damian Glenny
|
Damian Glenny
|
||||||
|
Andy Lester
|
||||||
|
H. İbrahim Güngör
|
||||||
|
|
||||||
With thanks to:
|
With thanks to:
|
||||||
Eugene Kramer
|
Eugene Kramer
|
||||||
@@ -12,7 +14,7 @@ With thanks to:
|
|||||||
Thomas Engel
|
Thomas Engel
|
||||||
Nishiishii
|
Nishiishii
|
||||||
galvanizd
|
galvanizd
|
||||||
H. İbrahim Güngör
|
|
||||||
Stas Antons
|
Stas Antons
|
||||||
Andy Lester
|
Vincent Fleuranceau
|
||||||
|
T. Charles Yun
|
||||||
|
|
||||||
|
|||||||
33
ChangeLog
33
ChangeLog
@@ -7,6 +7,37 @@ represents a feature release, and the Z represents a patch.
|
|||||||
|
|
||||||
------ current release ---------------------------
|
------ current release ---------------------------
|
||||||
|
|
||||||
|
1.4.2 (9/18/2008)
|
||||||
|
+ "task undo" can now retract a "task done" command, provided no reports
|
||||||
|
have been run (and therefore TDB::gc run)
|
||||||
|
+ Task now correctly sorts on entire strings, instead of just the first
|
||||||
|
character (thanks to Andy Lester)
|
||||||
|
+ Task now uses dashes (-----) to column underlines when color is disabled
|
||||||
|
(thanks to Vincent Fleuranceau)
|
||||||
|
+ Task now allows mixed case attribute names (pri:, PRI:, Pri: ...) and
|
||||||
|
commands (add, ADD, Add ...) (thanks to Vincent Fleuranceau)
|
||||||
|
+ Task now supports a default project and priority for new tasks, via
|
||||||
|
the new "default.project" and "default.priority" configuration variables
|
||||||
|
(thanks to Vincent Fleuranceau)
|
||||||
|
+ Task supports improved word-wrapping to the terminal width
|
||||||
|
+ Task now supports "default.command" configuration variable (for example
|
||||||
|
it could contain "list due:tomorrow") that is the command that is run
|
||||||
|
whenever task is invoked with no arguments.
|
||||||
|
+ Task supports modifying the existing description of a task, with the
|
||||||
|
following syntax: task <id> "new description ...".
|
||||||
|
+ Bug: Now properly supports relative dates in filters (task list due:eom,
|
||||||
|
task list due:tomorrow, task list due:23rd ...)
|
||||||
|
+ Bug: Source now properly includes <string.h> in order to build clean
|
||||||
|
using gcc 4.3 (thanks to H. İbrahim Güngör)
|
||||||
|
|
||||||
|
------ old releases ------------------------------
|
||||||
|
|
||||||
|
1.4.1 (7/18/2008)
|
||||||
|
+ Bug: Descriptions can not be altered with "task 123 New description"
|
||||||
|
+ Tweak: For "task calendar" month names are now centered over the month
|
||||||
|
+ Removed TUTORIAL file contents in favor of online version
|
||||||
|
+ Provided Mac .pkg binary
|
||||||
|
|
||||||
1.4.0 (7/10/2008)
|
1.4.0 (7/10/2008)
|
||||||
+ New recurring tasks feature
|
+ New recurring tasks feature
|
||||||
+ "task undelete" can now undelete erroneously deleted tasks, provided no
|
+ "task undelete" can now undelete erroneously deleted tasks, provided no
|
||||||
@@ -25,8 +56,6 @@ represents a feature release, and the Z represents a patch.
|
|||||||
+ Bug: Adding a blank priority resulted in an assigned garbage value
|
+ Bug: Adding a blank priority resulted in an assigned garbage value
|
||||||
+ Bug: Fixed parsing of date "07/08/2008" when using dateformat "m/d/Y"
|
+ Bug: Fixed parsing of date "07/08/2008" when using dateformat "m/d/Y"
|
||||||
|
|
||||||
------ old releases ------------------------------
|
|
||||||
|
|
||||||
1.3.1 (6/21/2008)
|
1.3.1 (6/21/2008)
|
||||||
+ New configuration variable, "defaultwidth" that determines the width
|
+ New configuration variable, "defaultwidth" that determines the width
|
||||||
of tables when ncurses support is not available
|
of tables when ncurses support is not available
|
||||||
|
|||||||
1
NEWS
1
NEWS
@@ -7,6 +7,7 @@ Task has been built and tested on the following configurations:
|
|||||||
- Fedora Core 8
|
- Fedora Core 8
|
||||||
- Fedora Core 9
|
- Fedora Core 9
|
||||||
- Ubuntu 8 Hardy Heron
|
- Ubuntu 8 Hardy Heron
|
||||||
|
- Ubuntu 9 Feisty Fawn
|
||||||
- Solaris 10
|
- Solaris 10
|
||||||
- Cygwin 1.5.25-14
|
- Cygwin 1.5.25-14
|
||||||
|
|
||||||
|
|||||||
26
README
26
README
@@ -16,8 +16,7 @@ frequently, with best practices and useful reports evolving from usage patterns.
|
|||||||
|
|
||||||
Task is scope-limited to GTD functionality only.
|
Task is scope-limited to GTD functionality only.
|
||||||
|
|
||||||
You may want to jump straight to the TUTORIAL file, or perhaps watch the old
|
You may want to watch the old task movie on YouTube:
|
||||||
task movie on YouTube:
|
|
||||||
|
|
||||||
http://www.youtube.com/watch?v=l68LCl6BYvs
|
http://www.youtube.com/watch?v=l68LCl6BYvs
|
||||||
|
|
||||||
@@ -25,14 +24,11 @@ or the new improved one:
|
|||||||
|
|
||||||
http://www.youtube.com/watch?v=D2Kn4DMOVSw
|
http://www.youtube.com/watch?v=D2Kn4DMOVSw
|
||||||
|
|
||||||
Either will give you a fairly good idea of what task is capable of, and whether
|
Either will give you a fairly good idea of what task is capable of, and
|
||||||
it fits in to your way of working. As a command line application, task is not
|
whether it fits in to your way of working. As a command line application,
|
||||||
for everyone and some of you may prefer to not proceed. The movie or TUTORIAL
|
task is not for everyone and some of you may prefer to not proceed. The
|
||||||
file are the quickest way for you to make that decision.
|
movie or online tutorial file are the quickest way for you to make that
|
||||||
|
decision. The online tutorial can be found at:
|
||||||
Please note that the TUTORIAL file included is deprecated, and will be removed
|
|
||||||
at the next major release of task. It is superceded by an HTML tutorial that
|
|
||||||
can be found at:
|
|
||||||
|
|
||||||
http://www.beckingham.net/task.html
|
http://www.beckingham.net/task.html
|
||||||
|
|
||||||
@@ -40,9 +36,9 @@ Task is based on ideas presented in the todo.sh script, found on:
|
|||||||
|
|
||||||
http://todotxt.org
|
http://todotxt.org
|
||||||
|
|
||||||
Task has many more features than todo.sh, but fundamentally, they are both
|
Task has many more features than todo.sh, but fundamentally, they are
|
||||||
working toward the same goals, which is to help you follow basic Getting Things
|
both working toward the same goals, which is to help you follow basic
|
||||||
Done (GTD) principles.
|
Getting Things Done (GTD) principles.
|
||||||
|
|
||||||
All feedback is welcome, in addition to any bug reports or patches to:
|
All feedback is welcome, in addition to any bug reports or patches to:
|
||||||
|
|
||||||
@@ -50,6 +46,6 @@ All feedback is welcome, in addition to any bug reports or patches to:
|
|||||||
|
|
||||||
Got an idea for an enhancement? Send a message!
|
Got an idea for an enhancement? Send a message!
|
||||||
|
|
||||||
I have found that task makes me more productive and organized. I hope task can
|
I have found that task makes me more productive and organized.
|
||||||
do the same for you.
|
I hope task can do the same for you.
|
||||||
|
|
||||||
|
|||||||
833
TUTORIAL
833
TUTORIAL
@@ -1,835 +1,6 @@
|
|||||||
Task program tutorial, for version 1.4.0
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
|
This TUTORIAL file has been deprecated. It is superceded by a richer and more
|
||||||
|
extensive online version that can be found at:
|
||||||
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
|
|
||||||
|
|
||||||
This TUTORIAL file is deprecated, and does not contain all the new features in
|
|
||||||
release 1.4.0. It will not be included in future releases of task, and will be
|
|
||||||
superceded by a richer and more extensive online version that can be found at:
|
|
||||||
|
|
||||||
http://www.beckingham.net/task.html
|
http://www.beckingham.net/task.html
|
||||||
|
|
||||||
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This guide shows how to quickly set up the task program, and become proficient
|
|
||||||
with it.
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
Quick Setup
|
|
||||||
Simple Usage
|
|
||||||
Advanced Usage
|
|
||||||
Interacting with the Shell
|
|
||||||
Configuring Task
|
|
||||||
Colors
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Quick Setup
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Build the task program according to the directions in the INSTALL file. This
|
|
||||||
transcript illustrates a typical installation:
|
|
||||||
|
|
||||||
% ls
|
|
||||||
task-1.4.0.tar.gz
|
|
||||||
% gunzip task-1.4.0.tar.gz
|
|
||||||
% tar xf task-1.4.0.tar
|
|
||||||
% cd task-1.4.0
|
|
||||||
% ./configure
|
|
||||||
...
|
|
||||||
% make
|
|
||||||
...
|
|
||||||
% make install # (may require sudo, depending on --prefix)
|
|
||||||
|
|
||||||
You need to make sure that the installed task program is in your PATH
|
|
||||||
environment variable.
|
|
||||||
|
|
||||||
Task reads a configuration file - called .taskrc in your home directory - and
|
|
||||||
stores pending and completed tasks in in a directory specified in the
|
|
||||||
configuration file.
|
|
||||||
|
|
||||||
The simplest way to get a configuration file and task directory is to run task.
|
|
||||||
On startup, task will check to see if it can find the configuration file and
|
|
||||||
task directory, and if not found, will ask you whether it may create both.
|
|
||||||
|
|
||||||
% task version
|
|
||||||
|
|
||||||
A configuration file could not be found in /Users/paul/.taskrc
|
|
||||||
|
|
||||||
Would you like a sample .taskrc created, so task can proceed? (y/n) y
|
|
||||||
Done.
|
|
||||||
|
|
||||||
[then task will show version information]
|
|
||||||
|
|
||||||
|
|
||||||
Simple Usage
|
|
||||||
------------
|
|
||||||
|
|
||||||
Let us begin by adding some tasks:
|
|
||||||
|
|
||||||
% task add Book plane ticket
|
|
||||||
% task add Rent a tux
|
|
||||||
% task add Reserve a rental car
|
|
||||||
% task add Reserve a hotel room
|
|
||||||
|
|
||||||
That's it. You'll notice immediately that task has a very minimalist
|
|
||||||
interface. Let us take a look at those tasks:
|
|
||||||
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
1 Book plane ticket
|
|
||||||
2 Rent a tux
|
|
||||||
3 Reserve a rental car
|
|
||||||
4 Send John a birthday card
|
|
||||||
|
|
||||||
The 'ls' command provides the most minimal list of tasks. Each task has been
|
|
||||||
given an id number, and you can see that there are no projects or priorities
|
|
||||||
assigned. Wait a minute - I own a tux, I don't need to rent one. Let us delete
|
|
||||||
task 2:
|
|
||||||
|
|
||||||
% task 2 delete
|
|
||||||
Permanently delete task? (y/n) y
|
|
||||||
|
|
||||||
Task wants you to confirm deletions. To remove the confirmation, edit your
|
|
||||||
.taskrc file and change the line:
|
|
||||||
|
|
||||||
confirmation=yes
|
|
||||||
|
|
||||||
to have a value of "no".
|
|
||||||
|
|
||||||
While the use of projects and priorities are not essential to benefitting from
|
|
||||||
task, they can be very useful when the list of tasks grows large. Let's assign
|
|
||||||
a project to these tasks:
|
|
||||||
|
|
||||||
% task 1 project:Wedding
|
|
||||||
% task 3 project:Wedding
|
|
||||||
% task 4 project:Family
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
3 Family Send John a birthday card
|
|
||||||
2 Wedding Reserve a rental car
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
|
|
||||||
Notice that the id numbers have changed. When tasks get deleted, or have their
|
|
||||||
attributes changed (project, for example), the ids are prone to change. But the
|
|
||||||
id numbers will remain valid until the next 'ls' command is run. You should
|
|
||||||
only use the ids from the most recent 'ls' command. The ids change, because
|
|
||||||
task is always trying to use small numbers so that it is easy for you to enter
|
|
||||||
them correctly.
|
|
||||||
|
|
||||||
Subprojects are supported. If you have a project "Wedding", you can specify
|
|
||||||
that a task is a subproject "Transport" of "Wedding" by assigning the project
|
|
||||||
"Wedding.Transport". Let's do this:
|
|
||||||
|
|
||||||
% task 2 project:Wedding.Transport
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
3 Family Send John a birthday card
|
|
||||||
2 Wedding.Transport Reserve a rental car
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
|
|
||||||
Task matches the leftmost part of the project when searching, so projects
|
|
||||||
may be abbreviated:
|
|
||||||
|
|
||||||
% task ls project:Wedding.Tra
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
2 Wedding.Transport Reserve a rental car
|
|
||||||
|
|
||||||
This way of matching projects can be used to see all tasks under the
|
|
||||||
"Wedding" project and all subprojects:
|
|
||||||
|
|
||||||
% task ls project:Wedding
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
2 Wedding.Transport Reserve a rental car
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
|
|
||||||
Let's reassign 2 back to the "Wedding" project:
|
|
||||||
|
|
||||||
% task 2 project:Wedding
|
|
||||||
|
|
||||||
Now that projects are assigned, we can look at just the Wedding project tasks:
|
|
||||||
|
|
||||||
% task ls project:Wedding
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
2 Wedding Reserve a rental car
|
|
||||||
|
|
||||||
Any command arguments after the 'ls' are used for filtering the output. We
|
|
||||||
could also have requested:
|
|
||||||
|
|
||||||
% task ls ticket plane
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
|
|
||||||
Now let's prioritize. Priorities can be H, M or L (High, Medium, Low).
|
|
||||||
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
3 Family Send John a birthday card
|
|
||||||
2 Wedding Reserve a rental car
|
|
||||||
1 Wedding Book plane ticket
|
|
||||||
|
|
||||||
% task 1 priority:H
|
|
||||||
% task 2 prior:M
|
|
||||||
% task 3 pr:H
|
|
||||||
Ambiguous attribute 'pr' - could be either of project, priority
|
|
||||||
% task 3 pri:H
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
3 Family H Send John a birthday card
|
|
||||||
1 Wedding H Book plane ticket
|
|
||||||
2 Wedding M Reserve a rental car
|
|
||||||
|
|
||||||
Notice that task supports the abbreviation of words such as priority, project.
|
|
||||||
Priority can be abbreviated to pri, but not pr, because it is ambiguous. Now
|
|
||||||
that tasks have been prioritized, you can see that the tasks are being sorted
|
|
||||||
by priority, with the highest priority tasks at the top.
|
|
||||||
|
|
||||||
These attributes can all be provided when the task is added, instead of
|
|
||||||
applying them afterwards, as shown. The following command shows how to set all
|
|
||||||
the attributes at once:
|
|
||||||
|
|
||||||
% task add project:Wedding priority:H Book plane ticket
|
|
||||||
|
|
||||||
The 'ls' command provides the least information for each task. The 'list'
|
|
||||||
command provides more:
|
|
||||||
|
|
||||||
% task list
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
3 Family H 4 mins Send John a birthday card
|
|
||||||
1 Wedding H 5 mins Book plane ticket
|
|
||||||
2 Wedding M 5 mins Reserve a rental car
|
|
||||||
|
|
||||||
Notice that a task can have a due date, and can be active. The task lists are
|
|
||||||
sorted by due date, then priority. Let's add due dates:
|
|
||||||
|
|
||||||
% task 3 due:6/25/2008
|
|
||||||
% task 1 due:7/31/2008
|
|
||||||
% task list
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
3 Family H 6/25/2008 6 mins Send John a birthday card
|
|
||||||
1 Wedding H 7/31/2008 7 mins Book plane ticket
|
|
||||||
2 Wedding M 7 mins Reserve a rental car
|
|
||||||
|
|
||||||
If today's date is 6/23/2008, then task 3 is due in 2 days. It will be colored
|
|
||||||
yellow if your terminal supports color. To change this color, edit your
|
|
||||||
.taskrc file, and change the line to one of these alternatives:
|
|
||||||
|
|
||||||
color.due=red
|
|
||||||
color.due=on_blue
|
|
||||||
color.due=red on_blue
|
|
||||||
color.due=bold_red on_blue
|
|
||||||
|
|
||||||
Where color is one of the following:
|
|
||||||
|
|
||||||
black
|
|
||||||
blue
|
|
||||||
red
|
|
||||||
green
|
|
||||||
cyan
|
|
||||||
magenta
|
|
||||||
yellow
|
|
||||||
white
|
|
||||||
|
|
||||||
All colors are specified in this way. Take a look in .taskrc for all the other
|
|
||||||
color rules that you control.
|
|
||||||
|
|
||||||
Tagging tasks is a good way to group them, aside from specifying a project. To
|
|
||||||
add a tag to a task:
|
|
||||||
|
|
||||||
% task <id> +tag
|
|
||||||
|
|
||||||
The plus sign indicates that this is a tag. Any number of tags may be applied
|
|
||||||
to a task, and then used for searching. Tags are just single words that are
|
|
||||||
labels.
|
|
||||||
|
|
||||||
% task list
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
3 Family H 6/25/2008 8 mins Send John a birthday card
|
|
||||||
1 Wedding H 7/31/2008 9 mins Book plane ticket
|
|
||||||
2 Wedding M 9 mins Reserve a rental car
|
|
||||||
|
|
||||||
% task 1 +phone
|
|
||||||
% task 2 +phone
|
|
||||||
% task 3 +shopping
|
|
||||||
% task 3 +john
|
|
||||||
|
|
||||||
% task list +phone
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
1 Wedding H 7/31/2008 9 mins Book plane ticket
|
|
||||||
2 Wedding M 9 mins Reserve a rental car
|
|
||||||
|
|
||||||
To remove a tag from a task, use the minus sign:
|
|
||||||
|
|
||||||
% task 3 -john
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Use
|
|
||||||
------------
|
|
||||||
|
|
||||||
Here are the other commands, in some detail. Note that the command:
|
|
||||||
|
|
||||||
% task
|
|
||||||
|
|
||||||
with no arguments will generate a help message that lists all these commands.
|
|
||||||
|
|
||||||
|
|
||||||
% task projects
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This report generates a list of all the different projects that you are using
|
|
||||||
along with a count of the pending tasks for each project. For example:
|
|
||||||
|
|
||||||
% task projects
|
|
||||||
|
|
||||||
Project Tasks
|
|
||||||
Errands 1
|
|
||||||
Birthdays 3
|
|
||||||
Car 2
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task summary
|
|
||||||
--------------
|
|
||||||
|
|
||||||
This report lists all the projects and a summary of their task status.
|
|
||||||
|
|
||||||
% task summary
|
|
||||||
|
|
||||||
Project Remaining Avg age Complete 0% 100%
|
|
||||||
Errands 1 3 days 50% XXXXXXXXXXXXXXXX
|
|
||||||
Birthdays 3 7 mths 0%
|
|
||||||
Car 2 2 wks 25% XXXXXXXXX
|
|
||||||
|
|
||||||
This shows the project, the remaining tasks, the average age of each task,
|
|
||||||
the percentage completed (remaining vs total) and a bar indicating that
|
|
||||||
percentage.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task delete <id>
|
|
||||||
------------------
|
|
||||||
|
|
||||||
There are two ways of getting rid of tasks - mark them as done, or delete
|
|
||||||
them.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task undelete <id>
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
If a task was inadvertently deleted, it may be undeleted, provided that no
|
|
||||||
reports have been run since the deletion. Ideally, the undelete command is
|
|
||||||
run immediately after the erroneous delete command.
|
|
||||||
|
|
||||||
If a report is run (such as "task list"), then task performs a garbage
|
|
||||||
collection that removes deleted tasks, and the task cannot be undeleted.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task done <id>
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This is how a task is marked as done.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task list ...
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The list report will show the active status, and age of the task in addition
|
|
||||||
to the columns that "task ls" shows. It is just a more detailed list.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task long ...
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The long report will show the entry date and start date of a task, in
|
|
||||||
addition to the columns that the "task list" shows.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task start <id>
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
This marks a task as started (and therefore active), which is shown in the
|
|
||||||
"list" report:
|
|
||||||
|
|
||||||
% task list
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
12 Errand L Remember to deposit check
|
|
||||||
...
|
|
||||||
|
|
||||||
% task start 12
|
|
||||||
% task list
|
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
|
||||||
12 Errand L * 3 days Remember to deposit check
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task active
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Shows all active tasks, that is, the tasks for which the "task start ..."
|
|
||||||
command was run, as shown above.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task overdue
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Simply lists all the task that have a due date that is past, in "list"
|
|
||||||
format.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task oldest
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Lists the oldest tasks. Shows 10 tasks by default, but can be set via the
|
|
||||||
"oldest" configuration variable.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task newest
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Lists the newest tasks. Shows 10 tasks by default, but can be set via the
|
|
||||||
"newest" configuration variable.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task history
|
|
||||||
--------------
|
|
||||||
|
|
||||||
This report shows you an overview of how many tasks were added, completed and
|
|
||||||
deleted, by month. It looks like this:
|
|
||||||
|
|
||||||
% task history
|
|
||||||
|
|
||||||
Year Month Added Completed Deleted Net
|
|
||||||
2008 March 21 16 0 5
|
|
||||||
April 13 11 1 1
|
|
||||||
May 8 14 3 -9
|
|
||||||
|
|
||||||
Average 14 13 1 -1
|
|
||||||
|
|
||||||
This shows that for the three months that task has been used, March and April
|
|
||||||
saw the total number of tasks increase, but in May the number decreased as
|
|
||||||
more task were completed than added.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task ghistory
|
|
||||||
--------------
|
|
||||||
|
|
||||||
This report shows you an overview of how many tasks were added, completed and
|
|
||||||
deleted, by month, as does "task history", but as a bar chart. It looks like this:
|
|
||||||
|
|
||||||
% task history
|
|
||||||
|
|
||||||
Year Month Added/Completed/Deleted
|
|
||||||
2008 March +++++++++++++++++++++XXXXXXXXXXXXXXXX
|
|
||||||
April +++++++++++++XXXXXXXXXXX-
|
|
||||||
May ++++++++XXXXXXXXXXXXXX---
|
|
||||||
|
|
||||||
With color enabled, the bars contain the size of each bar.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task calendar
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This report shows a calendar of the current month, with any task due or
|
|
||||||
overdue dates marked on it. Color is used to mark these dates.
|
|
||||||
|
|
||||||
% task calendar
|
|
||||||
|
|
||||||
May 2008
|
|
||||||
|
|
||||||
Su Mo Tu We Th Fr Sa
|
|
||||||
1 2 3
|
|
||||||
4 5 6 7 8 9 10
|
|
||||||
11 12 13 14 15 16 17
|
|
||||||
18 19 20 21 22 23 24
|
|
||||||
25 26 27 28 29 30 31
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task next
|
|
||||||
-----------
|
|
||||||
|
|
||||||
This report shows you the tasks you should probable work on next. Task will
|
|
||||||
scan all the tasks and will pick two task from each project to report. Those
|
|
||||||
two tasks will be chosen in order of overdue, due soon, High, Medium or Low
|
|
||||||
priority. Essentially task chooses the two most important task for each
|
|
||||||
project and displays them ordered in the usual way.
|
|
||||||
|
|
||||||
If you wish to show a different number of tasks per project, modify the entry
|
|
||||||
in .taskrc:
|
|
||||||
|
|
||||||
next=2
|
|
||||||
|
|
||||||
To be your preferred number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task <id> ...
|
|
||||||
---------------
|
|
||||||
|
|
||||||
When a task id is specified, everything applies to just that task. Suppose
|
|
||||||
we needed to correct a task:
|
|
||||||
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
12 Errand L Remember to deposit chekc
|
|
||||||
...
|
|
||||||
|
|
||||||
% task 12 Remember to deposit bonus check
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
12 Errand L Remember to deposit bonus check
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task /from/to/
|
|
||||||
----------------
|
|
||||||
|
|
||||||
If a task has been entered with a typo, it can be easily corrected by this
|
|
||||||
command. For example:
|
|
||||||
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
12 Errand L Remember to deposit chekc
|
|
||||||
...
|
|
||||||
|
|
||||||
% task 12 /chekc/check/
|
|
||||||
% task ls
|
|
||||||
|
|
||||||
ID Project Pri Description
|
|
||||||
12 Errand L Remember to deposit check
|
|
||||||
...
|
|
||||||
|
|
||||||
This command makes single corrections to a task description.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task tags
|
|
||||||
-----------
|
|
||||||
|
|
||||||
This command will generate a list of all the tags that are currently in use
|
|
||||||
by task.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task info <id>
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This command gives detailed information about a single task. It will tell
|
|
||||||
you when the task was entered, when started, its status, tags, and more.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task stats
|
|
||||||
------------
|
|
||||||
|
|
||||||
This command generates a list of statistics about your task usage, such as
|
|
||||||
the average time it takes to complete a task, how often new tasks are added,
|
|
||||||
and more.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task completed
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This generates a list of all tasks that have been completed, sorted by their
|
|
||||||
completion date.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task export <file name>
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
This instructs task to write out a CSV format dump of all tasks, both pending
|
|
||||||
and completed, to the file specified. This is how you might view tasks in a
|
|
||||||
spreadsheet.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task colors
|
|
||||||
-------------
|
|
||||||
|
|
||||||
This command displays all the colors that task supports.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task usage
|
|
||||||
------------
|
|
||||||
|
|
||||||
If logging has been enabled by the "command.logging=on" directive in the
|
|
||||||
.taskrc file, then task will record every command that is run. When this
|
|
||||||
command is run, task will display a count of how many times each command was
|
|
||||||
used.
|
|
||||||
|
|
||||||
This command is for the purpose of seeing whether command are actually used.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task version
|
|
||||||
--------------
|
|
||||||
|
|
||||||
This can be used to show the version number of task, and to display all the
|
|
||||||
current configuration settings, as read from the .taskrc file.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task <id> fg:... bg:...
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Not strictly a command, the setting of the fg and bg (foreground and
|
|
||||||
background) attributes determines the colors used to represent the task.
|
|
||||||
Valid foreground colors are:
|
|
||||||
|
|
||||||
bold underline bold_underline
|
|
||||||
black bold_black underline_black bold_underline_black
|
|
||||||
red bold_red underline_red bold_underline_red
|
|
||||||
green bold_green underline_green bold_underline_green
|
|
||||||
yellow bold_yellow underline_yellow bold_underline_yellow
|
|
||||||
blue bold_blue underline_blue bold_underline_blue
|
|
||||||
magenta bold_magenta underline_magenta bold_underline_magenta
|
|
||||||
cyan bold_cyan underline_cyan bold_underline_cyan
|
|
||||||
white bold_white underline_white bold_underline_white
|
|
||||||
|
|
||||||
Valid background colors are:
|
|
||||||
|
|
||||||
on_black on_bright_black
|
|
||||||
on_red on_bright_red
|
|
||||||
on_green on_bright_green
|
|
||||||
on_yellow on_bright_yellow
|
|
||||||
on_blue on_bright_blue
|
|
||||||
on_magenta on_bright_magenta
|
|
||||||
on_cyan on_bright_cyan
|
|
||||||
on_white on_bright_white
|
|
||||||
|
|
||||||
Note that these are not just colors, but combinations of colors and
|
|
||||||
attributes.
|
|
||||||
|
|
||||||
Note also that this capability does depend on whether your terminal program
|
|
||||||
can display these colors.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task rc:<file> ...
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
By specifying rc:<file>, it is possible to force task to use an alternate
|
|
||||||
.taskrc file. By default, task looks in your home directory, so these two
|
|
||||||
commands are essentially identical:
|
|
||||||
|
|
||||||
% task list
|
|
||||||
% task rc:~/.taskrc list
|
|
||||||
|
|
||||||
What this override allows, is the possibility of keeping your task lists
|
|
||||||
completely separate, say for work and home. This can be accomplished with
|
|
||||||
the following commands (valid for bash):
|
|
||||||
|
|
||||||
% alias htask="task rc:/home/me/.taskrc_home"
|
|
||||||
% alias wtask="task rc:/home/me/.taskrc_work"
|
|
||||||
% htask list
|
|
||||||
...
|
|
||||||
% wtask list
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Interacting with the Shell
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
Certain characters are interpreted by the shell. For example, the "&". If
|
|
||||||
you wish to include the & in a task description, you need to escape it, so
|
|
||||||
the shell doesn't interpret it. For example:
|
|
||||||
|
|
||||||
% task add Buy bread & milk
|
|
||||||
|
|
||||||
This command is an error because of the &. The shell will consider this to
|
|
||||||
be two commands:
|
|
||||||
|
|
||||||
% task add Buy bread &
|
|
||||||
% milk
|
|
||||||
|
|
||||||
The shell treats the & character as an indicator that the command is complete
|
|
||||||
and should be run in the background. Then the shell considers "milk" to be a
|
|
||||||
command all by itself. Which it is not. One way to get around this is to
|
|
||||||
individually escape the & character:
|
|
||||||
|
|
||||||
% task add Buy bread \& milk
|
|
||||||
|
|
||||||
Another is to quote the entire description, with either ' or " characters:
|
|
||||||
|
|
||||||
% task add "Buy bread & milk"
|
|
||||||
|
|
||||||
Task itself interprets the commands, and it too can make mistakes. For
|
|
||||||
example, any colon : character will be interpreted by task as a delimiter
|
|
||||||
between an attribute name and its value. Currently there is no workaround
|
|
||||||
for this.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Configuring Task
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Task recognizes several entries in the .taskrc file for configuration
|
|
||||||
purposes. Valid entries are of the form:
|
|
||||||
|
|
||||||
name=value
|
|
||||||
|
|
||||||
Valid examples are:
|
|
||||||
|
|
||||||
data.location This is a path to the directory containing all the task
|
|
||||||
files. By default, it is set up to be ~/.task, for
|
|
||||||
example: /Users/paul/.task
|
|
||||||
|
|
||||||
command.logging May be "on" or "off", defaulting to "off". This
|
|
||||||
determines whether task records commands. This is not
|
|
||||||
generally useful, except while developing task.
|
|
||||||
|
|
||||||
confirmation May be "yes" or "no", and determines whether task will
|
|
||||||
ask for confirmation before deleting a task.
|
|
||||||
|
|
||||||
nag This may be a string of text, or blank. It is used as
|
|
||||||
a prompt when a task is completed that is not considered
|
|
||||||
high priority. The "task next" command lists important
|
|
||||||
tasks, and completing one of those does not generate
|
|
||||||
this nagging. Default value is:
|
|
||||||
|
|
||||||
Note: try to stick to high priority tasks.
|
|
||||||
See "task next".
|
|
||||||
|
|
||||||
next Is a number, defaulting to 2, which is the number of
|
|
||||||
tasks for each project that are shown in the "task next"
|
|
||||||
command.
|
|
||||||
|
|
||||||
curses Determines whether task uses ncurses to establish the
|
|
||||||
size of the window you are using, for text wrapping.
|
|
||||||
|
|
||||||
blanklines May be "on" or "off". Prevents the display of
|
|
||||||
unnecessary blank lines so that task makes better use
|
|
||||||
screen real estate on small-screened devices.
|
|
||||||
|
|
||||||
dateformat This is a string of characters that define how task
|
|
||||||
formats dates. The default value is:
|
|
||||||
|
|
||||||
m/d/Y
|
|
||||||
|
|
||||||
which means dates look like:
|
|
||||||
|
|
||||||
6/7/2008
|
|
||||||
|
|
||||||
The string should contain the characters:
|
|
||||||
|
|
||||||
m minimal-digit month 1, 12
|
|
||||||
d minimal-digit day 1, 30
|
|
||||||
y two-digit year 08
|
|
||||||
M two-digit month 01, 12
|
|
||||||
D two-digit day 01, 30
|
|
||||||
Y four-digit year 2008
|
|
||||||
|
|
||||||
The string may also contain other characters to act as
|
|
||||||
spacers, or formatting. Other values could include
|
|
||||||
(but are not limited to):
|
|
||||||
|
|
||||||
d/m/Y 7/6/2008
|
|
||||||
YMD 20080607
|
|
||||||
m-d-y 6-7-08
|
|
||||||
|
|
||||||
showage May be "yes" or "no". Determines whether the "Age"
|
|
||||||
column appears on the "list" and "next" reports.
|
|
||||||
|
|
||||||
monthsperline Determines how many months the "task calendar" command
|
|
||||||
renders across the screen. Defaults to 1.
|
|
||||||
|
|
||||||
oldest Determines how many tasks are shown on the "oldest"
|
|
||||||
report. Defaults to 10.
|
|
||||||
|
|
||||||
newest Determines how many tasks are shown on the "newest"
|
|
||||||
report. Defaults to 10.
|
|
||||||
|
|
||||||
defaultwidth The width of tables used when ncurses support is not
|
|
||||||
available. Defaults to 80.
|
|
||||||
|
|
||||||
color May be "on" or "off". Determines whether task uses
|
|
||||||
color.
|
|
||||||
|
|
||||||
color.overdue These are the coloration rules. They correspond to a
|
|
||||||
color.due particular attribute of a task, such as it being due, or
|
|
||||||
color.pri.H being active, and specifies the automatic coloring of
|
|
||||||
color.pri.M that task.
|
|
||||||
color.pri.L
|
|
||||||
color.pri.none The value may be one optional foreground color (see
|
|
||||||
color.active below) and one optional background color.
|
|
||||||
color.tagged
|
|
||||||
For example, the value may be:
|
|
||||||
|
|
||||||
bold_red on_bright_yellow
|
|
||||||
|
|
||||||
color.tag.X Colors any task that has the tag X.
|
|
||||||
|
|
||||||
color.project.X Colors any task assigned to project X.
|
|
||||||
|
|
||||||
color.keyword.X Colors any task where the description contains X.
|
|
||||||
|
|
||||||
|
|
||||||
Colors
|
|
||||||
------
|
|
||||||
|
|
||||||
Task supports color in several places. In cases where you may specify a
|
|
||||||
color, a foreground, a background, or a combination foreground and background
|
|
||||||
color may be used. The following are valid foreground colors:
|
|
||||||
|
|
||||||
bold underline bold_underline
|
|
||||||
black bold_black underline_black bold_underline_black
|
|
||||||
red bold_red underline_red bold_underline_red
|
|
||||||
green bold_green underline_green bold_underline_green
|
|
||||||
yellow bold_yellow underline_yellow bold_underline_yellow
|
|
||||||
blue bold_blue underline_blue bold_underline_blue
|
|
||||||
magenta bold_magenta underline_magenta bold_underline_magenta
|
|
||||||
cyan bold_cyan underline_cyan bold_underline_cyan
|
|
||||||
white bold_white underline_white bold_underline_white
|
|
||||||
|
|
||||||
and the following are valid background colors:
|
|
||||||
|
|
||||||
on_black on_bright_black
|
|
||||||
on_red on_bright_red
|
|
||||||
on_green on_bright_green
|
|
||||||
on_yellow on_bright_yellow
|
|
||||||
on_blue on_bright_blue
|
|
||||||
on_magenta on_bright_magenta
|
|
||||||
on_cyan on_bright_cyan
|
|
||||||
on_white on_bright_white
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.61)
|
AC_PREREQ(2.61)
|
||||||
AC_INIT(task, 1.4.0, bugs@beckingham.net)
|
AC_INIT(task, 1.4.2, bugs@beckingham.net)
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
AC_CONFIG_SRCDIR([src/task.cpp])
|
AC_CONFIG_SRCDIR([src/task.cpp])
|
||||||
AC_CONFIG_HEADER([auto.h])
|
AC_CONFIG_HEADER([auto.h])
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -43,6 +43,25 @@
|
|||||||
lists all these commands.
|
lists all these commands.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
However, if the following configuration variable is specified:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre><code>default.command=list pri:H</code></pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Then this command will be run whenever task is run without arguments.
|
||||||
|
This means that your most common task command can be run simply
|
||||||
|
with the command:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre><code>% task
|
||||||
|
[task list project:foo]
|
||||||
|
|
||||||
|
ID Project Pri Description
|
||||||
|
1 foo H Design the thing
|
||||||
|
2 foo Build the thing</code></pre>
|
||||||
|
|
||||||
<strong>% task projects</strong>
|
<strong>% task projects</strong>
|
||||||
<p>
|
<p>
|
||||||
This report generates a list of all the different projects that you
|
This report generates a list of all the different projects that you
|
||||||
@@ -337,6 +356,14 @@ ID Project Pri Description
|
|||||||
% wtask list
|
% wtask list
|
||||||
...</code></pre>
|
...</code></pre>
|
||||||
|
|
||||||
|
<strong>% task <id> "new description"</strong>
|
||||||
|
<p>
|
||||||
|
Not strictly a command, the replacement of the description can
|
||||||
|
be achieved by quoting the entire description. The quotes are
|
||||||
|
necessary in case one of the description words looks like a task
|
||||||
|
command.
|
||||||
|
</p>
|
||||||
|
|
||||||
<strong>% task <id> fg:... bg:...</strong>
|
<strong>% task <id> fg:... bg:...</strong>
|
||||||
<p>
|
<p>
|
||||||
Not strictly a command, the setting of the fg and bg (foreground
|
Not strictly a command, the setting of the fg and bg (foreground
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -210,6 +210,8 @@
|
|||||||
<dt>color</dt>
|
<dt>color</dt>
|
||||||
<dd>
|
<dd>
|
||||||
May be "on" or "off". Determines whether task uses color.
|
May be "on" or "off". Determines whether task uses color.
|
||||||
|
When "off", task will use dashes (-----) to underline column
|
||||||
|
headings.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt>
|
<dt>
|
||||||
@@ -246,6 +248,44 @@
|
|||||||
<dd>
|
<dd>
|
||||||
Colors any task where the description contains X.
|
Colors any task where the description contains X.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
<dt>default.project</dt>
|
||||||
|
<dd>
|
||||||
|
Provides a default project name for the "task add ..." command.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>default.priority</dt>
|
||||||
|
<dd>
|
||||||
|
Provides a default priority for the "task add ..." command.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>default.command</dt>
|
||||||
|
<dd>
|
||||||
|
<p>
|
||||||
|
Provides a default command that is run every time task is
|
||||||
|
invoked with no arguments. For example, if set to:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre><code>default.command=list project:foo</code></pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Then task will run the "list project:foo" command if no
|
||||||
|
command is specified. This means that by merely typing:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre><code>% task
|
||||||
|
[task list project:foo]
|
||||||
|
|
||||||
|
ID Project Pri Description
|
||||||
|
1 foo H Design the thing
|
||||||
|
2 foo Build the thing</code></pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Note that the value of this variable is simply the command
|
||||||
|
line that you would ordinarily type, but without the
|
||||||
|
preceding "task" program name.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -39,10 +39,10 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre><code>% ls
|
<pre><code>% ls
|
||||||
task-1.4.0.tar.gz
|
task-1.4.1.tar.gz
|
||||||
% gunzip task-1.4.0.tar.gz
|
% gunzip task-1.4.1.tar.gz
|
||||||
% tar xf task-1.4.0.tar
|
% tar xf task-1.4.1.tar
|
||||||
% cd task-1.4.0
|
% cd task-1.4.1
|
||||||
% ./configure
|
% ./configure
|
||||||
...
|
...
|
||||||
% make
|
% make
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.2</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -69,31 +69,55 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<h2 class="title">Get the Latest Source Release
|
<h2 class="title">Get the Latest Release</h2>
|
||||||
<a href="http://www.beckingham.net/task-1.4.0.tar.gz">task-1.4.0.tar.gz</a>
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<h4>New in version 1.4.0 (7/10/2008)</h4>
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Source:</td>
|
||||||
|
<td><a href="http://www.beckingham.net/task-1.4.2.tar.gz">task-1.4.2.tar.gz</a></td>
|
||||||
|
</tr>
|
||||||
|
<!--
|
||||||
|
<tr>
|
||||||
|
<td>Mac OS X 10.5 (Leopard) Intel-only:</td>
|
||||||
|
<td><a href="http://www.beckingham.net/task-1.4.2.pkg">task-1.4.2.pkg</a></td>
|
||||||
|
</tr>
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Debian package:
|
||||||
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>):
|
||||||
|
</td>
|
||||||
|
<td><a href="http://www.beckingham.net/task_1.4.2-1_i386.deb">task_1.4.2-1_i386.deb</a></td>
|
||||||
|
</tr>
|
||||||
|
-->
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4>New in version 1.4.2 (9/18/2008)</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Added new <a href="recur.html">recurring tasks</a> feature
|
<li>"task undo" can now retract a "task done" command, provided no
|
||||||
<li>Added "task undelete" feature to restore a (very) recently deleted
|
reports have been run.
|
||||||
task
|
<li>Task now correctly sorts on entire strings, instead of just the
|
||||||
<li>Added averages to the "task history" report
|
first character (thanks to Andy Lester).
|
||||||
<li>Added bar chart history report "task ghistory"
|
<li>Task now uses dashes (-----) to underline column headings when
|
||||||
<li>Added support for rc:<file> to allow override of the default
|
color is disabled (thanks to Vincent Fleuranceau).
|
||||||
~/.taskrc file
|
<li>Task now allows mixed case attribute names (pri:, PRI:, Pri: ...)
|
||||||
<li>Added support for relative due: dates, such as "tomorrow", "friday",
|
and commands (add, ADD, Add ...) (thanks to Vincent Fleuranceau).
|
||||||
"23rd", "eom"
|
<li>Task now supports a default project and priority for new tasks, via
|
||||||
<li>Added support for task filtering on all reports
|
the new "default.project" and "default.priority" configuration variables
|
||||||
<li>Automatically shuts off color, ncurses when output is not to a tty
|
(thanks to Vincent Fleuranceau).
|
||||||
<li>Added support for the ~ character in .taskrc data.location, for flexibility
|
<li>Task supports improved word-wrapping to the terminal width.
|
||||||
<li>Allows colons on the description, provided what is to the left of the colon
|
<li>Task now supports "default.command" configuration variable (for example
|
||||||
is not a standard attribute name
|
it could contain "list due:tomorrow") which is the command that is run
|
||||||
<li>Fixed bug where Esc[0m sequences were being emitted for no good reason
|
whenever task is invoked with no arguments.
|
||||||
<li>Fixed bug where table headers are underlined when color is turned off
|
<li>Task supports modifying the existing description of a task, with the
|
||||||
<li>Fixed bug where adding a blank priority resulted in an assigned garbage value
|
following syntax: task <id> "new description ...".
|
||||||
<li>Fixed bug parsing date "07/08/2008" when using dateformat "m/d/Y"
|
<li>Fixed bug so that relative dates in filters (task list due:eom,
|
||||||
|
task list due:tomorrow, task list due:23rd ...) are now properly
|
||||||
|
supported.
|
||||||
|
<li>Fixed bug so that source now properly includes <string.h> in
|
||||||
|
order to build clean using gcc 4.3 (thanks to H. İbrahim Güngör)
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -102,7 +126,7 @@
|
|||||||
|
|
||||||
<h2>Troubleshooting</h2>
|
<h2>Troubleshooting</h2>
|
||||||
<p>
|
<p>
|
||||||
Task has been built and tested in the following environments:
|
Task has been built from source and tested in the following environments:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
@@ -110,6 +134,7 @@
|
|||||||
<li>OS X 10.5 Leopard
|
<li>OS X 10.5 Leopard
|
||||||
<li>Fedora Core 8
|
<li>Fedora Core 8
|
||||||
<li>Fedora Core 9
|
<li>Fedora Core 9
|
||||||
|
<li>Ubuntu 7 Feisty Fawn
|
||||||
<li>Ubuntu 8 Hardy Heron
|
<li>Ubuntu 8 Hardy Heron
|
||||||
<li>Solaris 10
|
<li>Solaris 10
|
||||||
<li>Cygwin 1.5.25-14
|
<li>Cygwin 1.5.25-14
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.4.0</title>
|
<title>Task 1.4.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<link rel="stylesheet" href="task.css" type="text/css" />
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
task long [tags] [attrs] desc...
|
task long [tags] [attrs] desc...
|
||||||
task ls [tags] [attrs] desc...
|
task ls [tags] [attrs] desc...
|
||||||
task completed [tags] [attrs] desc...
|
task completed [tags] [attrs] desc...
|
||||||
task ID [tags] [attrs] [desc...]
|
task ID [tags] [attrs] ["desc..."]
|
||||||
task ID /from/to/
|
task ID /from/to/
|
||||||
task delete ID
|
task delete ID
|
||||||
task undelete ID
|
task undelete ID
|
||||||
|
|||||||
@@ -35,6 +35,50 @@
|
|||||||
<br />
|
<br />
|
||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.4.1 (7/18/2008)</h4>
|
||||||
|
<a href="http://www.beckingham.net/task-1.4.1.tar.gz">task-1.4.1.tar.gz</a>
|
||||||
|
<br />
|
||||||
|
Mac OS X 10.5 (Leopard) Intel-only:
|
||||||
|
<a href="http://www.beckingham.net/task-1.4.1.pkg">task-1.4.1.pkg</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Fixed bug: Descriptions could not be altered with "task 123 New description"
|
||||||
|
<li>Tweak: For "task calendar" month names are now centered over the month
|
||||||
|
<li>Removed TUTORIAL file contents in favor of online version
|
||||||
|
<li>New Mac Intel-only Leopard (10.5) binary package
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.4.0 (7/10/2008)</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.4.0.tar.gz">task-1.4.0.tar.gz</a>
|
||||||
|
<br />
|
||||||
|
Debian package: <a href="http://www.beckingham.net/task_1.4.1-1_i386.deb">task_1.4.1-1_i386.deb</a>
|
||||||
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Added new <a href="recur.html">recurring tasks</a> feature
|
||||||
|
<li>Added "task undelete" feature to restore a (very) recently deleted
|
||||||
|
task
|
||||||
|
<li>Added averages to the "task history" report
|
||||||
|
<li>Added bar chart history report "task ghistory"
|
||||||
|
<li>Added support for rc:<file> to allow override of the default
|
||||||
|
~/.taskrc file
|
||||||
|
<li>Added support for relative due: dates, such as "tomorrow", "friday",
|
||||||
|
"23rd", "eom"
|
||||||
|
<li>Added support for task filtering on all reports
|
||||||
|
<li>Automatically shuts off color, ncurses when output is not to a tty
|
||||||
|
<li>Added support for the ~ character in .taskrc data.location, for flexibility
|
||||||
|
<li>Allows colons on the description, provided what is to the left of the colon
|
||||||
|
is not a standard attribute name
|
||||||
|
<li>Fixed bug where Esc[0m sequences were being emitted for no good reason
|
||||||
|
<li>Fixed bug where table headers are underlined when color is turned off
|
||||||
|
<li>Fixed bug where adding a blank priority resulted in an assigned garbage value
|
||||||
|
<li>Fixed bug parsing date "07/08/2008" when using dateformat "m/d/Y"
|
||||||
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<h4>New in version 1.3.1</h4>
|
<h4>New in version 1.3.1</h4>
|
||||||
Source: <a href="http://www.beckingham.net/task-1.3.1.tar.gz">task-1.3.1.tar.gz</a>
|
Source: <a href="http://www.beckingham.net/task-1.3.1.tar.gz">task-1.3.1.tar.gz</a>
|
||||||
|
|||||||
48
ideas.txt
48
ideas.txt
@@ -20,51 +20,3 @@ Test Suite
|
|||||||
- debug=on to cause all cout to be csv
|
- debug=on to cause all cout to be csv
|
||||||
- regression tests for every bug, command, feature
|
- regression tests for every bug, command, feature
|
||||||
|
|
||||||
Recurrence
|
|
||||||
+ new T::status recurring (stored as R)
|
|
||||||
+ new user-specifiable attributes - recur:<duration> [until:<date>]
|
|
||||||
+ duration:
|
|
||||||
daily, day, 1d
|
|
||||||
Nd
|
|
||||||
weekly, 1w
|
|
||||||
Nw
|
|
||||||
biweekly
|
|
||||||
monthly, 1m
|
|
||||||
bimonthly
|
|
||||||
Nm
|
|
||||||
quarterly, 1q
|
|
||||||
Nq
|
|
||||||
biannual, biyearly
|
|
||||||
annual, yearly, 1y
|
|
||||||
Na, Ny
|
|
||||||
+ recur: without due: => Error
|
|
||||||
+ until: without recur: => Error
|
|
||||||
+ New file format: supports status R, recur:, until:, base:, range:
|
|
||||||
- on TDB.gc, adjust base: and compress range: for T::status == recurring
|
|
||||||
- all recurring tasks are removed from lists by T::*pendingT, and a synthetic
|
|
||||||
addendum is generated
|
|
||||||
- when a recurring task is completed, range: is updated, and a synthetic
|
|
||||||
task is added to completed.data that retains the attributes of the root
|
|
||||||
|
|
||||||
- Scenario:
|
|
||||||
# Today = 6/22/2008
|
|
||||||
% task add Friday due:6/15/2008 recur:weekly until 8/1/2008
|
|
||||||
# task must generate a base and range
|
|
||||||
# base:6/15/2008
|
|
||||||
# range:-------
|
|
||||||
# ^6/15
|
|
||||||
# ^6/22
|
|
||||||
# ^6/29
|
|
||||||
# ^7/6
|
|
||||||
# ^7/13
|
|
||||||
# ^7/20
|
|
||||||
# ^7/27
|
|
||||||
% task ls
|
|
||||||
1 Friday 6/15/2008 .lte. today (overdue)
|
|
||||||
2 Friday 6/22/2008 .lte. today (due)
|
|
||||||
3 Friday 6/29/2008 one recurrence
|
|
||||||
4 Friday 7/6/2008 (not shown)
|
|
||||||
5 Friday 7/13/2008 (not shown)
|
|
||||||
6 Friday 7/20/2008 (not shown)
|
|
||||||
7 Friday 7/27/2008 (not shown)
|
|
||||||
|
|
||||||
|
|||||||
21
src/Date.cpp
21
src/Date.cpp
@@ -543,22 +543,35 @@ bool Date::isRelativeDate (const std::string& input)
|
|||||||
else
|
else
|
||||||
today += (dow - today.dayOfWeek ()) * 86400;
|
today += (dow - today.dayOfWeek ()) * 86400;
|
||||||
|
|
||||||
mT = today.mT;
|
int m, d, y;
|
||||||
|
today.toMDY (m, d, y);
|
||||||
|
Date then (m, d, y);
|
||||||
|
|
||||||
|
mT = then.mT;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (found == "today")
|
else if (found == "today")
|
||||||
{
|
{
|
||||||
mT = today.mT;
|
Date then (today.month (),
|
||||||
|
today.day (),
|
||||||
|
today.year ());
|
||||||
|
mT = then.mT;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (found == "tomorrow")
|
else if (found == "tomorrow")
|
||||||
{
|
{
|
||||||
mT = today.mT + 86400;
|
Date then (today.month (),
|
||||||
|
today.day (),
|
||||||
|
today.year ());
|
||||||
|
mT = then.mT + 86400;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (found == "yesterday")
|
else if (found == "yesterday")
|
||||||
{
|
{
|
||||||
mT = today.mT - 86400;
|
Date then (today.month (),
|
||||||
|
today.day (),
|
||||||
|
today.year ());
|
||||||
|
mT = then.mT - 86400;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (found == "eom")
|
else if (found == "eom")
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
Table::Table ()
|
Table::Table ()
|
||||||
: mRows (0)
|
: mRows (0)
|
||||||
, mIntraPadding (1)
|
, mIntraPadding (1)
|
||||||
|
, mDashedUnderline (false)
|
||||||
, mTablePadding (0)
|
, mTablePadding (0)
|
||||||
, mTableWidth (0)
|
, mTableWidth (0)
|
||||||
, mSuppressWS (false)
|
, mSuppressWS (false)
|
||||||
@@ -103,6 +104,12 @@ void Table::setTableWidth (int width)
|
|||||||
mTableWidth = width;
|
mTableWidth = width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void Table::setTableDashedUnderline ()
|
||||||
|
{
|
||||||
|
mDashedUnderline = true;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
int Table::addColumn (const std::string& col)
|
int Table::addColumn (const std::string& col)
|
||||||
{
|
{
|
||||||
@@ -582,7 +589,57 @@ const std::string Table::formatHeader (
|
|||||||
fg, bg,
|
fg, bg,
|
||||||
Text::colorize (
|
Text::colorize (
|
||||||
decoration, Text::nocolor,
|
decoration, Text::nocolor,
|
||||||
pad + preJust+ data + postJust + pad) + intraPad);
|
pad + preJust + data + postJust + pad) + intraPad);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// data One Data to be rendered
|
||||||
|
// width 8 Max data width for column/specified width
|
||||||
|
// padding 1 Extra padding around data
|
||||||
|
// intraPadding 0 Extra padding between columns only
|
||||||
|
// justification right Alignment withing padding
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// "------- "
|
||||||
|
// ------- data
|
||||||
|
// ^ ^ padding
|
||||||
|
// ^ intraPadding
|
||||||
|
// ^^^^^^^^ width
|
||||||
|
// ^ ^ fg/bg
|
||||||
|
//
|
||||||
|
const std::string Table::formatHeaderDashedUnderline (
|
||||||
|
int col,
|
||||||
|
int width,
|
||||||
|
int padding)
|
||||||
|
{
|
||||||
|
assert (width > 0);
|
||||||
|
|
||||||
|
Text::color fg = getHeaderFg (col);
|
||||||
|
Text::color bg = getHeaderBg (col);
|
||||||
|
Text::color decoration = getHeaderUnderline (col);
|
||||||
|
|
||||||
|
std::string data = "";
|
||||||
|
for (int i = 0; i < width; ++i)
|
||||||
|
data += '-';
|
||||||
|
|
||||||
|
std::string pad = "";
|
||||||
|
std::string intraPad = "";
|
||||||
|
std::string attrOn = "";
|
||||||
|
std::string attrOff = "";
|
||||||
|
|
||||||
|
for (int i = 0; i < padding; ++i)
|
||||||
|
pad += " ";
|
||||||
|
|
||||||
|
// Place the value within the available space - justify.
|
||||||
|
if (col < (signed) mColumns.size () - 1)
|
||||||
|
for (int i = 0; i < getIntraPadding (); ++i)
|
||||||
|
intraPad += " ";
|
||||||
|
|
||||||
|
return Text::colorize (
|
||||||
|
fg, bg,
|
||||||
|
Text::colorize (
|
||||||
|
decoration, Text::nocolor,
|
||||||
|
pad + data + pad) + intraPad);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -758,12 +815,12 @@ void Table::sort (std::vector <int>& order)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ascendingCharacter:
|
case ascendingCharacter:
|
||||||
if ((char)*left > (char)*right)
|
if ((std::string)*left > (std::string)*right)
|
||||||
SWAP
|
SWAP
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case descendingCharacter:
|
case descendingCharacter:
|
||||||
if ((char)*left < (char)*right)
|
if ((std::string)*left < (std::string)*right)
|
||||||
SWAP
|
SWAP
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -861,13 +918,24 @@ const std::string Table::render ()
|
|||||||
|
|
||||||
// Print column headers in column order.
|
// Print column headers in column order.
|
||||||
std::string output;
|
std::string output;
|
||||||
|
std::string underline;
|
||||||
for (size_t col = 0; col < mColumns.size (); ++col)
|
for (size_t col = 0; col < mColumns.size (); ++col)
|
||||||
|
{
|
||||||
output += formatHeader (
|
output += formatHeader (
|
||||||
col,
|
col,
|
||||||
mCalculatedWidth[col],
|
mCalculatedWidth[col],
|
||||||
mColumnPadding[col]);
|
mColumnPadding[col]);
|
||||||
|
|
||||||
|
if (mDashedUnderline)
|
||||||
|
underline += formatHeaderDashedUnderline (
|
||||||
|
col,
|
||||||
|
mCalculatedWidth[col],
|
||||||
|
mColumnPadding[col]);
|
||||||
|
}
|
||||||
|
|
||||||
output += "\n";
|
output += "\n";
|
||||||
|
if (underline.length ())
|
||||||
|
output += underline + "\n";
|
||||||
|
|
||||||
// Determine row order, according to sort options.
|
// Determine row order, according to sort options.
|
||||||
std::vector <int> order;
|
std::vector <int> order;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ public:
|
|||||||
void setTablePadding (int);
|
void setTablePadding (int);
|
||||||
void setTableIntraPadding (int);
|
void setTableIntraPadding (int);
|
||||||
void setTableWidth (int);
|
void setTableWidth (int);
|
||||||
|
void setTableDashedUnderline ();
|
||||||
|
|
||||||
int addColumn (const std::string&);
|
int addColumn (const std::string&);
|
||||||
void setColumnColor (int, Text::color, Text::color);
|
void setColumnColor (int, Text::color, Text::color);
|
||||||
@@ -98,6 +99,7 @@ private:
|
|||||||
just getJustification (const int, const int);
|
just getJustification (const int, const int);
|
||||||
just getHeaderJustification (const int);
|
just getHeaderJustification (const int);
|
||||||
const std::string formatHeader (const int, const int, const int);
|
const std::string formatHeader (const int, const int, const int);
|
||||||
|
const std::string formatHeaderDashedUnderline (const int, const int, const int);
|
||||||
void formatCell (const int, const int, const int, const int, std::vector <std::string>&, std::string&);
|
void formatCell (const int, const int, const int, const int, std::vector <std::string>&, std::string&);
|
||||||
void optimize (std::string&);
|
void optimize (std::string&);
|
||||||
void sort (std::vector <int>&);
|
void sort (std::vector <int>&);
|
||||||
@@ -110,6 +112,7 @@ private:
|
|||||||
std::map <std::string, std::string> mFg;
|
std::map <std::string, std::string> mFg;
|
||||||
std::map <std::string, std::string> mBg;
|
std::map <std::string, std::string> mBg;
|
||||||
std::map <std::string, std::string> mUnderline;
|
std::map <std::string, std::string> mUnderline;
|
||||||
|
bool mDashedUnderline;
|
||||||
|
|
||||||
// Padding...
|
// Padding...
|
||||||
int mTablePadding;
|
int mTablePadding;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Date.h"
|
#include "Date.h"
|
||||||
#include "Table.h"
|
#include "Table.h"
|
||||||
|
#include "color.h"
|
||||||
#include "TDB.h"
|
#include "TDB.h"
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
@@ -66,6 +67,20 @@ void handleAdd (const TDB& tdb, T& task, Config& conf)
|
|||||||
task.setAttribute ("mask", "");
|
task.setAttribute ("mask", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**/
|
||||||
|
// Override with default.project, if not specified.
|
||||||
|
if (task.getAttribute ("project") == "")
|
||||||
|
task.setAttribute ("project", conf.get ("default.project", ""));
|
||||||
|
|
||||||
|
// Override with default.priority, if not specified.
|
||||||
|
if (task.getAttribute ("priority") == "")
|
||||||
|
{
|
||||||
|
std::string defaultPriority = conf.get ("default.priority", "");
|
||||||
|
if (validPriority (defaultPriority))
|
||||||
|
task.setAttribute ("priority", defaultPriority);
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
|
||||||
if (task.getDescription () == "")
|
if (task.getDescription () == "")
|
||||||
throw std::string ("Cannot add a blank task.");
|
throw std::string ("Cannot add a blank task.");
|
||||||
|
|
||||||
@@ -203,6 +218,49 @@ void handleUndelete (TDB& tdb, T& task, Config& conf)
|
|||||||
<< "command is run immediately after the errant delete command." << std::endl;
|
<< "command is run immediately after the errant delete command." << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// If a task is done, but is still in the pending file, then it may be undone
|
||||||
|
// simply by changing it's status.
|
||||||
|
void handleUndo (TDB& tdb, T& task, Config& conf)
|
||||||
|
{
|
||||||
|
std::vector <T> all;
|
||||||
|
tdb.allPendingT (all);
|
||||||
|
|
||||||
|
int id = task.getId ();
|
||||||
|
std::vector <T>::iterator it;
|
||||||
|
for (it = all.begin (); it != all.end (); ++it)
|
||||||
|
{
|
||||||
|
if (it->getId () == id)
|
||||||
|
{
|
||||||
|
if (it->getStatus () == T::completed)
|
||||||
|
{
|
||||||
|
if (it->getAttribute ("recur") != "")
|
||||||
|
{
|
||||||
|
std::cout << "Task does not support 'undo' for recurring tasks." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
T restored (*it);
|
||||||
|
restored.setStatus (T::pending);
|
||||||
|
restored.removeAttribute ("end");
|
||||||
|
tdb.modifyT (restored);
|
||||||
|
|
||||||
|
std::cout << "Task " << id << " successfully undone." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Task " << id << " is not done - therefore cannot be undone." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "Task " << id
|
||||||
|
<< " not found - tasks can only be reliably undone if the undo" << std::endl
|
||||||
|
<< "command is run immediately after the errant done command." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void handleVersion (Config& conf)
|
void handleVersion (Config& conf)
|
||||||
{
|
{
|
||||||
@@ -217,6 +275,26 @@ void handleVersion (Config& conf)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Create a table for the disclaimer.
|
||||||
|
Table disclaimer;
|
||||||
|
disclaimer.setTableWidth (width);
|
||||||
|
disclaimer.addColumn (" ");
|
||||||
|
disclaimer.setColumnWidth (0, Table::flexible);
|
||||||
|
disclaimer.setColumnJustification (0, Table::left);
|
||||||
|
disclaimer.addCell (disclaimer.addRow (), 0,
|
||||||
|
"Task comes with ABSOLUTELY NO WARRANTY; for details read the COPYING file "
|
||||||
|
"included. This is free software, and you are welcome to redistribute it "
|
||||||
|
"under certain conditions; again, see the COPYING file for details.");
|
||||||
|
|
||||||
|
// Create a table for the URL.
|
||||||
|
Table link;
|
||||||
|
link.setTableWidth (width);
|
||||||
|
link.addColumn (" ");
|
||||||
|
link.setColumnWidth (0, Table::flexible);
|
||||||
|
link.setColumnJustification (0, Table::left);
|
||||||
|
link.addCell (link.addRow (), 0,
|
||||||
|
"See http://www.beckingham.net/task.html for the latest releases and a full tutorial.");
|
||||||
|
|
||||||
// Create a table for output.
|
// Create a table for output.
|
||||||
Table table;
|
Table table;
|
||||||
table.setTableWidth (width);
|
table.setTableWidth (width);
|
||||||
@@ -229,6 +307,8 @@ void handleVersion (Config& conf)
|
|||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::flexible);
|
table.setColumnWidth (1, Table::flexible);
|
||||||
@@ -251,22 +331,14 @@ void handleVersion (Config& conf)
|
|||||||
|
|
||||||
std::cout << "Copyright (C) 2006 - 2008, P. Beckingham."
|
std::cout << "Copyright (C) 2006 - 2008, P. Beckingham."
|
||||||
<< std::endl
|
<< std::endl
|
||||||
<< PACKAGE
|
<< (conf.get ("color", true) ? Text::colorize (Text::bold, Text::nocolor, PACKAGE) : PACKAGE)
|
||||||
<< " "
|
<< " "
|
||||||
<< VERSION
|
<< (conf.get ("color", true) ? Text::colorize (Text::bold, Text::nocolor, VERSION) : VERSION)
|
||||||
<< std::endl
|
|
||||||
<< std::endl
|
|
||||||
<< "Task comes with ABSOLUTELY NO WARRANTY; for details read the COPYING file"
|
|
||||||
<< std::endl
|
|
||||||
<< "included. This is free software, and you are welcome to redistribute it"
|
|
||||||
<< std::endl
|
|
||||||
<< "under certain conditions; again, see the COPYING file for details."
|
|
||||||
<< std::endl
|
<< std::endl
|
||||||
|
<< disclaimer.render ()
|
||||||
<< std::endl
|
<< std::endl
|
||||||
<< table.render ()
|
<< table.render ()
|
||||||
<< std::endl
|
<< link.render ()
|
||||||
<< "See http://www.beckingham.net/task.html for the latest releases and a full tutorial."
|
|
||||||
<< std::endl
|
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
// Verify installation. This is mentioned in the documentation as the way to
|
// Verify installation. This is mentioned in the documentation as the way to
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ static const char* commands[] =
|
|||||||
"summary",
|
"summary",
|
||||||
"tags",
|
"tags",
|
||||||
"undelete",
|
"undelete",
|
||||||
|
"undo",
|
||||||
"usage",
|
"usage",
|
||||||
"version",
|
"version",
|
||||||
"",
|
"",
|
||||||
@@ -207,7 +208,7 @@ bool validDate (std::string& date, Config& conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool validPriority (const std::string& input)
|
bool validPriority (const std::string& input)
|
||||||
{
|
{
|
||||||
if (input != "H" &&
|
if (input != "H" &&
|
||||||
input != "M" &&
|
input != "M" &&
|
||||||
@@ -370,8 +371,8 @@ void parse (
|
|||||||
std::string to;
|
std::string to;
|
||||||
|
|
||||||
// An id is the first argument found that contains all digits.
|
// An id is the first argument found that contains all digits.
|
||||||
if (command != "add" && // "add" doesn't require an ID
|
if (lowerCase (command) != "add" && // "add" doesn't require an ID
|
||||||
task.getId () == 0 &&
|
task.getId () == 0 &&
|
||||||
validId (arg))
|
validId (arg))
|
||||||
task.setId (::atoi (arg.c_str ()));
|
task.setId (::atoi (arg.c_str ()));
|
||||||
|
|
||||||
@@ -388,7 +389,7 @@ void parse (
|
|||||||
// value.
|
// value.
|
||||||
else if ((colon = arg.find (":")) != std::string::npos)
|
else if ((colon = arg.find (":")) != std::string::npos)
|
||||||
{
|
{
|
||||||
std::string name = arg.substr (0, colon);
|
std::string name = lowerCase (arg.substr (0, colon));
|
||||||
std::string value = arg.substr (colon + 1, std::string::npos);
|
std::string value = arg.substr (colon + 1, std::string::npos);
|
||||||
|
|
||||||
if (validAttribute (name, value, conf))
|
if (validAttribute (name, value, conf))
|
||||||
@@ -412,10 +413,11 @@ void parse (
|
|||||||
// Command.
|
// Command.
|
||||||
else if (command == "")
|
else if (command == "")
|
||||||
{
|
{
|
||||||
if (isCommand (arg) && validCommand (arg))
|
std::string l = lowerCase (arg);
|
||||||
command = arg;
|
if (isCommand (l) && validCommand (l))
|
||||||
|
command = l;
|
||||||
else
|
else
|
||||||
throw std::string ("'") + arg + "' is not a valid command.";
|
descCandidate += arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Anything else is just considered description.
|
// Anything else is just considered description.
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ void filter (std::vector<T>& all, T& task)
|
|||||||
// Apply attribute filter.
|
// Apply attribute filter.
|
||||||
matches = 0;
|
matches = 0;
|
||||||
foreach (a, attrList)
|
foreach (a, attrList)
|
||||||
|
{
|
||||||
if (a->first == "project")
|
if (a->first == "project")
|
||||||
{
|
{
|
||||||
if (a->second.length () <= refTask.getAttribute (a->first).length ())
|
if (a->second.length () <= refTask.getAttribute (a->first).length ())
|
||||||
@@ -87,6 +88,7 @@ void filter (std::vector<T>& all, T& task)
|
|||||||
}
|
}
|
||||||
else if (a->second == refTask.getAttribute (a->first))
|
else if (a->second == refTask.getAttribute (a->first))
|
||||||
++matches;
|
++matches;
|
||||||
|
}
|
||||||
|
|
||||||
if (matches == attrList.size ())
|
if (matches == attrList.size ())
|
||||||
{
|
{
|
||||||
@@ -143,7 +145,7 @@ void handleList (TDB& tdb, T& task, Config& conf)
|
|||||||
if (showAge) table.addColumn ("Age");
|
if (showAge) table.addColumn ("Age");
|
||||||
table.addColumn ("Description");
|
table.addColumn ("Description");
|
||||||
|
|
||||||
if (conf.get ("color", true))
|
if (conf.get (std::string ("color"), true))
|
||||||
{
|
{
|
||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
@@ -153,6 +155,8 @@ void handleList (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (5);
|
table.setColumnUnderline (5);
|
||||||
if (showAge) table.setColumnUnderline (6);
|
if (showAge) table.setColumnUnderline (6);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -291,6 +295,8 @@ void handleSmallList (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (2);
|
table.setColumnUnderline (2);
|
||||||
table.setColumnUnderline (3);
|
table.setColumnUnderline (3);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -414,6 +420,8 @@ void handleCompleted (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
table.setColumnUnderline (2);
|
table.setColumnUnderline (2);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -493,6 +501,8 @@ void handleInfo (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -710,6 +720,8 @@ void handleLongList (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (7);
|
table.setColumnUnderline (7);
|
||||||
if (showAge) table.setColumnUnderline (8);
|
if (showAge) table.setColumnUnderline (8);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -913,6 +925,8 @@ void handleReportSummary (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (2);
|
table.setColumnUnderline (2);
|
||||||
table.setColumnUnderline (3);
|
table.setColumnUnderline (3);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnJustification (1, Table::right);
|
table.setColumnJustification (1, Table::right);
|
||||||
table.setColumnJustification (2, Table::right);
|
table.setColumnJustification (2, Table::right);
|
||||||
@@ -1056,6 +1070,8 @@ void handleReportNext (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (5);
|
table.setColumnUnderline (5);
|
||||||
if (showAge) table.setColumnUnderline (6);
|
if (showAge) table.setColumnUnderline (6);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -1275,6 +1291,8 @@ void handleReportHistory (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (4);
|
table.setColumnUnderline (4);
|
||||||
table.setColumnUnderline (5);
|
table.setColumnUnderline (5);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnJustification (2, Table::right);
|
table.setColumnJustification (2, Table::right);
|
||||||
table.setColumnJustification (3, Table::right);
|
table.setColumnJustification (3, Table::right);
|
||||||
@@ -1462,6 +1480,8 @@ void handleReportGHistory (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
// Determine the longest line.
|
// Determine the longest line.
|
||||||
int maxLine = 0;
|
int maxLine = 0;
|
||||||
@@ -1623,6 +1643,8 @@ void handleReportUsage (const TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (0);
|
table.setColumnUnderline (0);
|
||||||
table.setColumnUnderline (1);
|
table.setColumnUnderline (1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnJustification (1, Table::right);
|
table.setColumnJustification (1, Table::right);
|
||||||
table.sortOn (1, Table::descendingNumeric);
|
table.sortOn (1, Table::descendingNumeric);
|
||||||
@@ -1681,6 +1703,8 @@ std::string renderMonths (
|
|||||||
table.setColumnUnderline (i + 6);
|
table.setColumnUnderline (i + 6);
|
||||||
table.setColumnUnderline (i + 7);
|
table.setColumnUnderline (i + 7);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnJustification (i + 0, Table::right);
|
table.setColumnJustification (i + 0, Table::right);
|
||||||
table.setColumnJustification (i + 1, Table::right);
|
table.setColumnJustification (i + 1, Table::right);
|
||||||
@@ -1816,13 +1840,14 @@ void handleReportCalendar (TDB& tdb, T& task, Config& conf)
|
|||||||
for (int i = 0 ; i < monthsPerLine ; i++)
|
for (int i = 0 ; i < monthsPerLine ; i++)
|
||||||
{
|
{
|
||||||
std::string month = Date::monthName (nextM);
|
std::string month = Date::monthName (nextM);
|
||||||
std::cout << month
|
int left = (18 - month.length ()) / 2 + 1;
|
||||||
<< " "
|
int right = 18 - left - month.length ();
|
||||||
<< std::setw(23 // one month's output width
|
|
||||||
- month.length ()// month name length
|
std::cout << std::setw (left) << ' '
|
||||||
- 1)// spacer character
|
<< month
|
||||||
<< std::left
|
<< ' '
|
||||||
<< nextY;
|
<< nextY
|
||||||
|
<< std::setw (right) << ' ';
|
||||||
|
|
||||||
if (++nextM > 12)
|
if (++nextM > 12)
|
||||||
{
|
{
|
||||||
@@ -1895,6 +1920,8 @@ void handleReportActive (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (3);
|
table.setColumnUnderline (3);
|
||||||
table.setColumnUnderline (4);
|
table.setColumnUnderline (4);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -2010,6 +2037,8 @@ void handleReportOverdue (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (3);
|
table.setColumnUnderline (3);
|
||||||
table.setColumnUnderline (4);
|
table.setColumnUnderline (4);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -2125,6 +2154,8 @@ void handleReportOldest (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (5);
|
table.setColumnUnderline (5);
|
||||||
if (showAge) table.setColumnUnderline (6);
|
if (showAge) table.setColumnUnderline (6);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
@@ -2268,6 +2299,8 @@ void handleReportNewest (TDB& tdb, T& task, Config& conf)
|
|||||||
table.setColumnUnderline (5);
|
table.setColumnUnderline (5);
|
||||||
if (showAge) table.setColumnUnderline (6);
|
if (showAge) table.setColumnUnderline (6);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
table.setTableDashedUnderline ();
|
||||||
|
|
||||||
table.setColumnWidth (0, Table::minimum);
|
table.setColumnWidth (0, Table::minimum);
|
||||||
table.setColumnWidth (1, Table::minimum);
|
table.setColumnWidth (1, Table::minimum);
|
||||||
|
|||||||
25
src/task.cpp
25
src/task.cpp
@@ -29,6 +29,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
@@ -125,6 +126,10 @@ static void shortUsage (Config& conf)
|
|||||||
table.addCell (row, 1, "task done ID");
|
table.addCell (row, 1, "task done ID");
|
||||||
table.addCell (row, 2, "Marks the specified task as completed");
|
table.addCell (row, 2, "Marks the specified task as completed");
|
||||||
|
|
||||||
|
row = table.addRow ();
|
||||||
|
table.addCell (row, 1, "task undo ID");
|
||||||
|
table.addCell (row, 2, "Marks the specified done task as pending, provided a report has not yet been run");
|
||||||
|
|
||||||
row = table.addRow ();
|
row = table.addRow ();
|
||||||
table.addCell (row, 1, "task projects");
|
table.addCell (row, 1, "task projects");
|
||||||
table.addCell (row, 2, "Shows a list of all project names used, and how many tasks are in each");
|
table.addCell (row, 2, "Shows a list of all project names used, and how many tasks are in each");
|
||||||
@@ -295,10 +300,23 @@ int main (int argc, char** argv)
|
|||||||
if (conf.get ("command.logging") == "on")
|
if (conf.get ("command.logging") == "on")
|
||||||
tdb.logCommand (argc, argv);
|
tdb.logCommand (argc, argv);
|
||||||
|
|
||||||
// Parse the command line.
|
// If argc == 1 and the default.command configuration variable is set,
|
||||||
|
// then use that, otherwise stick with argc/argv.
|
||||||
std::vector <std::string> args;
|
std::vector <std::string> args;
|
||||||
for (int i = 1; i < argc; ++i)
|
std::string defaultCommand = conf.get ("default.command");
|
||||||
args.push_back (argv[i]);
|
if (argc == 1 && defaultCommand != "")
|
||||||
|
{
|
||||||
|
// Stuff the command line.
|
||||||
|
split (args, defaultCommand, ' ');
|
||||||
|
std::cout << "[task " << defaultCommand << "]" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Parse the command line.
|
||||||
|
for (int i = 1; i < argc; ++i)
|
||||||
|
args.push_back (argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
std::string command;
|
std::string command;
|
||||||
T task;
|
T task;
|
||||||
parse (args, command, task, conf);
|
parse (args, command, task, conf);
|
||||||
@@ -316,6 +334,7 @@ int main (int argc, char** argv)
|
|||||||
else if (command == "delete") handleDelete (tdb, task, conf);
|
else if (command == "delete") handleDelete (tdb, task, conf);
|
||||||
else if (command == "start") handleStart (tdb, task, conf);
|
else if (command == "start") handleStart (tdb, task, conf);
|
||||||
else if (command == "done") handleDone (tdb, task, conf);
|
else if (command == "done") handleDone (tdb, task, conf);
|
||||||
|
else if (command == "undo") handleUndo (tdb, task, conf);
|
||||||
else if (command == "export") handleExport (tdb, task, conf);
|
else if (command == "export") handleExport (tdb, task, conf);
|
||||||
else if (command == "version") handleVersion ( conf);
|
else if (command == "version") handleVersion ( conf);
|
||||||
else if (command == "summary") handleReportSummary (tdb, task, conf);
|
else if (command == "summary") handleReportSummary (tdb, task, conf);
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ for (typeof (c) *foreach_p = & (c); \
|
|||||||
|
|
||||||
// parse.cpp
|
// parse.cpp
|
||||||
void parse (std::vector <std::string>&, std::string&, T&, Config&);
|
void parse (std::vector <std::string>&, std::string&, T&, Config&);
|
||||||
|
bool validPriority (const std::string&);
|
||||||
bool validDate (std::string&, Config&);
|
bool validDate (std::string&, Config&);
|
||||||
|
|
||||||
// task.cpp
|
// task.cpp
|
||||||
@@ -76,6 +77,7 @@ void handleExport (TDB&, T&, Config&);
|
|||||||
void handleDelete (TDB&, T&, Config&);
|
void handleDelete (TDB&, T&, Config&);
|
||||||
void handleStart (TDB&, T&, Config&);
|
void handleStart (TDB&, T&, Config&);
|
||||||
void handleDone (TDB&, T&, Config&);
|
void handleDone (TDB&, T&, Config&);
|
||||||
|
void handleUndo (TDB&, T&, Config&);
|
||||||
void handleModify (TDB&, T&, Config&);
|
void handleModify (TDB&, T&, Config&);
|
||||||
void handleColor (Config&);
|
void handleColor (Config&);
|
||||||
|
|
||||||
|
|||||||
15
src/tests/in
Executable file
15
src/tests/in
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
./task add monday due:monday
|
||||||
|
./task add tuesday due:tuesday
|
||||||
|
./task add wednesday due:wednesday
|
||||||
|
./task add thursday due:thursday
|
||||||
|
./task add friday due:friday
|
||||||
|
./task add saturday due:saturday
|
||||||
|
./task add sunday due:sunday
|
||||||
|
./task add yesterday due:yesterday
|
||||||
|
./task add today due:today
|
||||||
|
./task add tomorrow due:tomorrow
|
||||||
|
./task add eow due:eow
|
||||||
|
./task add eom due:eom
|
||||||
|
./task add eoy due:eoy
|
||||||
|
./task add 21st due:21st
|
||||||
|
|
||||||
15
src/tests/out
Executable file
15
src/tests/out
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
./task li due:monday
|
||||||
|
./task li due:tuesday
|
||||||
|
./task li due:wednesday
|
||||||
|
./task li due:thursday
|
||||||
|
./task li due:friday
|
||||||
|
./task li due:saturday
|
||||||
|
./task li due:sunday
|
||||||
|
./task li due:yesterday
|
||||||
|
./task li due:today
|
||||||
|
./task li due:tomorrow
|
||||||
|
./task li due:eow
|
||||||
|
./task li due:eom
|
||||||
|
./task li due:eoy
|
||||||
|
./task li due:21st
|
||||||
|
|
||||||
1
task.pmdoc/01task-contents.xml
Normal file
1
task.pmdoc/01task-contents.xml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<pkg-contents spec="1.12"><f n="task" o="root" g="wheel" p="33261" pt="/Users/paul/task.git/binary/task" m="true" t="file"><mod>owner</mod><mod>group</mod></f></pkg-contents>
|
||||||
1
task.pmdoc/01task.xml
Normal file
1
task.pmdoc/01task.xml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<pkgref spec="1.12" uuid="C71026FD-E252-42CD-89C3-2F6F087AAF17"><config><identifier>com.beckingham.task141.task.pkg</identifier><version>1</version><description/><post-install type="none"/><requireAuthorization/><installFrom>/Users/paul/task.git/binary/task</installFrom><installTo mod="true" relocatable="true">/usr/local/bin</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>parent</mod><mod>locationType</mod><mod>relocatable</mod><mod>installTo.path</mod><mod>installTo</mod></config><contents><file-list>01task-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
|
||||||
1
task.pmdoc/index.xml
Normal file
1
task.pmdoc/index.xml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<pkmkdoc spec="1.12"><properties><title>Task 1.4.1</title><build>/Users/paul/task.git/binary/task-1.4.1.pkg</build><organization>com.beckingham</organization><userSees ui="easy"/><min-target os="3"/><domain system="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><contents><choice title="task" id="choice0" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.beckingham.task141.task.pkg"/><choice-reqs><requirement id="tosv" operator="ge" value="'10.5.0'" selected="no" enabled="no" hidden="unchanged" startSelected="unchanged" startEnabled="unchanged" startHidden="unchanged"/></choice-reqs></choice></contents><resources bg-scale="none" bg-align="topleft"><locale lang="en"><resource mod="true" type="license">/Users/paul/task.git/binary/COPYING.txt</resource><resource mod="true" type="readme">/Users/paul/task.git/binary/README.txt</resource></locale></resources><flags/><item type="file">01task.xml</item><mod>properties.title</mod><mod>properties.systemDomain</mod><mod>properties.anywhereDomain</mod></pkmkdoc>
|
||||||
Reference in New Issue
Block a user