Compare commits

...

13 Commits

Author SHA1 Message Date
Paul Beckingham
18fd59a1ed - Bumped to 0.9.8 2008-05-25 20:36:13 -04:00
Paul Beckingham
4549af6b84 - Added DEVELOPERS file describing high-level code layout.
- Removed unused library.h file.
- Removed unused std::wstring Unicode variants.
2008-05-25 20:33:27 -04:00
Paul Beckingham
4825b37df5 - Added color command. 2008-05-25 01:01:24 -04:00
Paul Beckingham
148088c775 - Removed overwriting of colors in autoColorize. 2008-05-24 23:32:29 -04:00
Paul Beckingham
45a25ca47b - Fixed Table::calculateColumnWidths bug. 2008-05-24 23:08:36 -04:00
Paul Beckingham
ab0a57ec89 - Documentation cleanup 2008-05-20 00:05:18 -04:00
Paul Beckingham
65c2fe438f - Migrated old compiler flags for better warnings, etc 2008-05-19 23:28:48 -04:00
Paul Beckingham
37bdfe06da - Added endwin check to configure.ac 2008-05-19 10:48:01 -04:00
Paul Beckingham
b54b07ef77 Merge branch 'master' of git@github.com:pbeckingham/task
Conflicts:

	ChangeLog
2008-05-19 00:25:27 -04:00
Paul Beckingham
e3eb87aa74 - Snapshot 2008-05-18 00:32:27 -04:00
Paul Beckingham
b34cb90709 - Set up structure for AUTHORS file.
- Set up NEWS file, with pleas for feedback.
- Added welcome message to README.
- Completed a chunk of the TUTORIAL.
- Added error handling for "task export" when a file name is not specified.
2008-05-18 00:30:12 -04:00
Paul Beckingham
04da56193e - Removed unnecessary SAMPLE_taskrc, and assorted references.
- Cleaned up ChangeLog.
- Minor mods to standard docs.
2008-05-17 23:16:08 -04:00
Paul Beckingham
3e1afc5777 - ChangeLog snapshot 2008-05-16 16:55:09 -04:00
20 changed files with 791 additions and 291 deletions

View File

@@ -0,0 +1,7 @@
Principal Author
Paul Beckingham, paul@beckingham.net
Contributing Authors
Testers

144
ChangeLog
View File

@@ -1,125 +1,129 @@
1.0.0 - First official release ()
- Bug: assertion fails for task info n, where n is out of range
1.0.0 (?)
- Bug: assertion fails on mobile for t v
0.10.0 - Productization ()
~ Documentation complete
~ Test suite
~ All known bugs fixed
0.9.9 (?)
- Autoconf/autmake behaving properly.
- All bugs fixed.
------ reality -----------------------------------
0.9.7
5/17/2008
+ Task offers to create a sample ~/.taskrc file if one is not found.
+ Task offers to create a ~/.task directory if one is not found.
0.9.8 (5/25/2008)
+ Color command.
+ Removed unnecessary files.
+ Completed documentation.
0.9.6
5/13/208
+ Replaced color management code.
+ Improved color rules code.
0.9.7 (5/24/2008)
+ Migrated old compiler flags into Makefile.am
+ Added ncurses endwin function check to configure.ac
+ Set up structure for AUTHORS file.
+ Set up NEWS file, with pleas for feedback.
+ Added welcome message to README.
+ Completed a chunk of the TUTORIAL.
+ Added error handling for "task export" when a file name is not specified.
+ Task offers to create a sample ~/.taskrc file if one is not found.
+ Task offers to create a ~/.task directory if one is not found.
+ Removed unnecessary SAMPLE_taskrc, and assorted references.
+ Cleaned up ChangeLog.
+ Minor mods to standard docs.
+ Bumped version to 0.9.7
+ Changed some autoconf details
+ Corrected comment in T.cpp
+ Made unit tests compile and run again.
+ Removed tests from distibution.
0.9.5
5/12/2008
+ Replaced Table storage with Grid.
5/10/2008
+ Added Grid.cpp to configure.ac
+ Added Makefile to src/.gitignore
+ Makefile should not be part of the repository.
+ Added Grid.cpp
+ Added Grid::Cell::operator==
4/27/2008
+ ChangeLog file begun.
+ Bumped version to 0.9.5 for next release.
0.9.6 (5/13/208)
+ Corrected wrong include file in Table.cpp
+ Replaced color management code.
+ Improved color rules code.
0.9.4
4/26/2008
+ Integrated new Grid object into build - not yet integrated into Table.
4/19/2008
+ More .gitignore tweaks.
+ Added .gitignore
+ Added more missing files.
+ Added all source code.
+ Generic OSS files added.
+ Initial commit.
0.9.5 (5/12/2008)
+ Replaced Table storage with Grid.
+ Added Grid.cpp to configure.ac
+ Added Makefile to src/.gitignore
+ Makefile should not be part of the repository.
+ Added Grid.cpp
+ Added Grid::Cell::operator==
+ ChangeLog file begun.
+ Bumped version to 0.9.5 for next release.
0.9.3
4/6/2008
0.9.4 (4/26/2008)
+ Integrated new Grid object into build - not yet integrated into Table.
+ More .gitignore tweaks.
+ Added .gitignore
+ Added more missing files.
+ Added all source code.
+ Generic OSS files added.
+ Initial commit.
0.9.2
4/3/2008
0.9.3 (4/6/2008)
0.9.1
4/1/2008
0.9.2 (4/3/2008)
0.9.0
3/23/2008
+ flat source directory
+ autoconf complete
+ "task next"
+ "task stats"
+ "task export"
+ Rule₋based colorization
0.9.1 (4/1/2008)
0.8.16
3/13/208
0.9.0 (3/23/2008)
+ flat source directory
+ autoconf complete
+ "task next"
+ "task stats"
+ "task export"
+ Rules-based colorization
0.8.14
2/20/2008
0.8.1 (1/28/2008) - 0.8.16 (3/13/2008)
+ autoconf conversion (many builds)
0.8.13
2/2/2008
0.8.1
1/28/2008
0.8.0 - Polish (1/25/2008)
0.8.0 Polish (1/25/2008)
+ Code cleanup, reorganization
+ "task overdue"
+ Add "age" column to list and long
+ Use 'conf' for build, version tracking
+ Add "/from/to/" description editing
0.7.0 - Multi-user, File handling, atomicity (1/8/2008)
0.7.0 Multi-user, File handling, atomicity (1/8/2008)
+ Clean, publishable API reimplementation
+ File locking
+ retain deleted tasks
+ "task info ID" report showing all metadata
0.6.0 - Reports (12/27/2006)
[Development hiatus while planning for T, TDB API, new features and the future
of the project. Seeded to two testers for feedback, suggestions.]
0.6.0 Reports (12/27/2006)
+ "task history"
+ "task summary"
+ "task calendar"
+ due: support
+ due support
+ Table sorting
0.5.0 - Multi-user support (12/10/2006)
0.5.0 Multi-user support (12/10/2006)
+ Command logging
+ "task usage" report
0.4.0 - Destructive / modification commands (12/3/2006)
0.4.0 Destructive / modification commands (12/3/2006)
+ "task delete" complete
+ "task id ..." complete
+ "task list ..." synonym for "task find ..."
0.3.0 - Work in progress support (12/3/2006)
0.3.0 Work in progress support (12/3/2006)
+ "task start" complete
+ "task done" complete
+ completed.data support
0.2.0 - Neutral commands (12/2/2006)
0.2.0 Neutral commands (12/2/2006)
+ "task find" complete
+ "task projects" complete
+ "task tags" complete
0.1.0 - Constructive commands (12/1/2006)
0.1.0 Constructive commands (12/1/2006)
+ "task add" complete
+ completed.data support
+ ~/.taskrc support
0.0.1 - Basic infrastructure (11/29/2006)
0.0.1 Basic infrastructure (11/29/2006)
+ Command line parsing
+ API layer
+ Usage
------ start -----------------------------------

20
DEVELOPERS Normal file
View File

@@ -0,0 +1,20 @@
Developers may wish to change task, and here is a high-level guide to the files
included.
task.{cpp,h} Functions that implement the task commands, and main.
parse.cpp Parses the command line.
TDB.{cpp,h} The task database, performs all file I/O
T.{cpp,h} Represents a single task - parses a record from TDB, and also
composes record for TDB. Provides accessors for tasks.
Grid.{cpp,h} Implements a sparse 2D array, provides data storage for the
Table object.
Table.{cpp,h} Implements tabular data rendering, wrapping etc.
Config.{cpp,h} Implements a reader for the .taskrc file.
Date.{cpp,h} General date class for the time_t type.
text.cpp Text manipulation functions.
util.cpp General utility functions.
color.cpp Color support functions.
rules.cpp Auto-colorization rules.
Don't forget, please send patches to task@beckingham.net

View File

@@ -1,3 +1,3 @@
SUBDIRS = src
EXTRA_DIST = TUTORIAL SAMPLE_taskrc
EXTRA_DIST = TUTORIAL DEVELOPERS

20
NEWS
View File

@@ -1,4 +1,22 @@
Task 1.0 is released.
Welcome to Task 1.0.0.
While Task has undergone much testing, bugs are sure to remain. If you
encounter a bug, please contact me at bugs@beckingham.net. Here is what you
could do, in order of increasing effort (to you) and usefulness (to me):
- Do nothing. Bug probably won't get fixed.
- Send an email to bugs@beckingham.net, explaining what you saw. The bug
will be addressed, and a new release will be made. You will be a hero.
- Send an email, and a reproducible test case in the form of the few commands
it takes to recreate the problem. The bug will be addressed, and a new
release will be made. You will be a hero.
- If you are a developer, send a patch that fixes the problem. Your patch
will be applied and tested, and a new release will be made. You will be a
hero.
Thank you.

63
README
View File

@@ -1,47 +1,42 @@
Thank you
GTD
Based on ideas in todo.sh
Movie at www.b.n/task.mov
Feedback, suggestions to task@beckingham.net
Task - a GTD utility featuring:
Thank you for taking a look at task. Task is a GTD utility featuring:
- Robust C++ implementation
- Tags
- Colorful, tabular output
- Reports
- Low-level API
- Auto-completion on all commands, options
- Abbreviations for all commands, options
- Multi-user file locking
- Clean architecture allowing quick addition of new features
- UUID for all tasks
Task is an implementation of GTD ideas, similar to todo.sh, but without many of
the limitations in todo.sh, namely:
- Bugs are not being fixed
- No response or web update from ________ on code submission
- todo.py is the todo.sh replacement, but requires a python installation - a
significant barrier to many users, and is currently merely a
reimplementation of todo.sh
- project.sh is the natural progression for todo.sh, but is intended to be a
project management solution, but is so far todo.sh with a "done" and
"overview" command
- There is no output formatting
- There is no way to enumerate projects, categories
- There is no file locking for multi-user access
- With no API, a graphical front end must reimplement the primitives
With a robust infrastructure in place for parsing commands, file I/O and
structured output, the development threshold for adding new features is kept
low.
It is intended that features, mainly in the form of reports will be added
frequently, with best practices and useful reports evolving.
frequently, with best practices and useful reports evolving from usage patterns.
Task is scope-limited to GTD functionality only.
You may want to jump straight to the TUTORIAL file, or perhaps watch the task
movie on YouTube:
http://?????????????????
Either will give you a fairly good idea of what task is capable of, and whether
it fits in to your way of working. As a command line application, task is not
for everyone and some of you may prefer to not proceed. The movie or TUTORIAL
file are the quickest way for you to make that decision.
Task is based on ideas presented in the todo.sh script, found on:
http://todotxt.org
Task has a few more features than todo.sh, but fundamentally, they are both
working toward the same goals, which is to help you follow basic Getting Things
Done (GTD) principles.
All feedback is welcome, in addition to any bug reports or patches to:
task@beckingham.net
Got an idea for an enhancement? Send a message!

View File

@@ -1,15 +0,0 @@
data.location=/home/bob/.task
#command.logging=on
confirmation=yes
nag=Note: try to stick to high priority tasks. See "task next".
next=2
#color.overdue=red
#color.due=on yellow
#color.pri.H=red
#color.pri.M=yellow
#color.pri.L=green
#color.pri.none=white on yellow
#color.active=blue
#color.tagged=yellow

554
TUTORIAL
View File

@@ -1,9 +1,18 @@
Task program tutorial, for version 0.9.0
Task program tutorial, for version 1.0.0
----------------------------------------
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
-----------
@@ -12,10 +21,10 @@ Build the task program according to the directions in the INSTALL file. This
transcript illustrates a typical installation:
% ls
task-0.9.0.tar.gz
% gunzip task-0.9.0.tar.gz
% tar xf task-0.9.0.tar
% cd task-0.9.0
task-1.0.0.tar.gz
% gunzip task-1.0.0.tar.gz
% tar xf task-1.0.0.tar
% cd task-1.0.0
% ./configure
...
% make
@@ -23,21 +32,24 @@ transcript illustrates a typical installation:
% make install
You need to make sure that the installed task program is in your PATH
environment variable. The next step is to create a configuration file for the
task program. This file resides in your home directory, is called .taskrc, and
contains various configuration settings. Use the provided SAMPLE_taskrc file
as a starting point for your own:
environment variable.
% cp SAMPLE_taskrc ~/.taskrc
% mkdir ~/.task
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.
Your .taskrc files contains an entry that points to the .task directory
belonging to user bob. Change this entry to point to your own home directory,
and the .task directory you just created. Your task program is now ready to
use. Verify that task is properly installed with:
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
[show sample output]
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
@@ -70,14 +82,15 @@ task 2:
Permanently delete task? (y/n) y
Task wants you to confirm deletions. To remove the confirmation, edit your
.taskrc file and remove the line:
.taskrc file and change the line:
confirmation=yes
or change the yes to no.
to have a value of "no".
While projects and priorities are not necessary, they can be very useful when
the list of tasks grows large. Let's assign a project to these tasks:
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
@@ -92,9 +105,10 @@ the list of tasks grows large. Let's assign a project to these tasks:
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.
Now that projects are assigned, we can look at just the Wedding project tasks:
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. Now that projects are assigned, we can look at just the Wedding
project tasks:
% task ls project:Wedding
@@ -136,37 +150,44 @@ 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
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 task can have a due date, and can be active. The task lists are
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:3/25/2008
% task 1 due:5/31/2008
% task 3 due:6/25/2008
% task 1 due:7/31/2008
% task list
ID Project Pri Due Active Age Description
3 Family H 3/25/2008 6 mins Send John a birthday card
1 Wedding H 5/31/2008 7 mins Book plane ticket
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 3/23/2008, then task 3 is due in 2 days. It will be colored
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=<foreground color> on <background color>
color.due=<foreground color>
color.due=on <background color>
color.due=red
color.due=on_blue
color.due=red on_blue
color.due=bold_red on_blue
Where color is one of:
Where color is one of the following:
black
blue
@@ -178,38 +199,451 @@ Where color is one of:
white
All colors are specified in this way. Take a look in .taskrc for all the other
colors you control.
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
------------
Commands:
- task add
- task list
- task long
- task ls
- task done
- task completed
- task delete
- task start
- task summary
- task history
- task next
- task <modify>
- task /from/to/
- task projects
- task tags
- task info
- task active
- task overdue
- task calendar
- task stats
- task usage
- task export
- task version
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 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 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
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 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.
Interacting with the Shell
--------------------------
- Escaping shell metacharacters
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.
% 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:
Valid background colors are:
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.
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.
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
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

View File

@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(task, 0.9.7, bugs@beckingham.net)
AC_INIT(task, 0.9.8, bugs@beckingham.net)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/task.cpp])
AC_CONFIG_HEADER([auto.h])
@@ -16,6 +16,7 @@ AC_LANG(C++)
# Checks for libraries.
#AC_CHECK_LIB(ncurses, initscr, [LIBS="$LIBS -lncurses" AC_DEFINE([HAVE_NCURSES], [1], [Found ncurses])])
AC_CHECK_LIB(ncurses,initscr)
AC_CHECK_LIB(ncurses,endwin)
# Checks for header files.
AC_HEADER_STDC

View File

@@ -86,7 +86,7 @@ void Config::createDefault (const std::string& file)
if (taskDir != "")
{
FILE* out;
if (out = fopen (file.c_str (), "w"))
if ((out = fopen (file.c_str (), "w")))
{
fprintf (out, "data.location=%s\n", taskDir.c_str ());
fprintf (out, "command.logging=off\n");

View File

@@ -399,6 +399,8 @@ bool Grid::Cell::operator== (const Grid::Cell& rhs) const
case CELL_STRING: return mString == rhs.mString ? true : false;
default: break; // To prevent warnings.
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
@@ -414,6 +416,8 @@ bool Grid::Cell::operator!= (const Grid::Cell& rhs) const
case CELL_STRING: return mString != rhs.mString ? true : false;
default: break; // To prevent warnings.
}
return false;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -1,2 +1,3 @@
bin_PROGRAMS = task
task_SOURCES = Config.cpp Date.cpp T.cpp TDB.cpp Table.cpp Grid.cpp color.cpp parse.cpp task.cpp util.cpp text.cpp rules.cpp Config.h Date.h T.h TDB.h Table.h Grid.h color.h stlmacros.h task.h
AM_CPPFLAGS = -Wall -pedantic -ggdb3 -fno-rtti

View File

@@ -155,6 +155,7 @@ target_alias = @target_alias@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
task_SOURCES = Config.cpp Date.cpp T.cpp TDB.cpp Table.cpp Grid.cpp color.cpp parse.cpp task.cpp util.cpp text.cpp rules.cpp Config.h Date.h T.h TDB.h Table.h Grid.h color.h stlmacros.h task.h
AM_CPPFLAGS = -Wall -pedantic -ggdb3 -fno-rtti
all: all-am
.SUFFIXES:

View File

@@ -476,8 +476,16 @@ void Table::calculateColumnWidths ()
mCalculatedWidth = ideal;
return;
}
// else
else
{
// std::cout << "# insufficient room, considering only flexible columns." << std::endl;
// The fallback position is to assume no width was specificed, and just
// calculate widths accordingly.
mTableWidth = 0;
calculateColumnWidths ();
return;
}
}
// Try again, treating minimum columns as flexible.

View File

@@ -1,49 +0,0 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2004 - 2008, Paul Beckingham. All rights reserved.
//
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_LIBRARY
#define INCLUDED_LIBRARY
#include <string>
#include <vector>
#include <sys/types.h>
#include "stlmacros.h"
#ifndef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif
// text.cpp
void wrapText (std::vector <std::string>&, const std::string&, const int);
std::string trimLeft (const std::string& in, const std::string& t = " ");
std::string trimRight (const std::string& in, const std::string& t = " ");
std::string trim (const std::string& in, const std::string& t = " ");
std::wstring trimLeft (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
std::wstring trimRight (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
std::wstring trim (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
void extractParagraphs (const std::string&, std::vector<std::string>&);
void extractLine (std::string&, std::string&, int);
void split (std::vector<std::string>&, const std::string&, const char);
void split (std::vector<std::string>&, const std::string&, const std::string&);
void join (std::string&, const std::string&, const std::vector<std::string>&);
std::string commify (const std::string&);
std::string lowerCase (const std::string&);
// misc.cpp
void delay (float);
// list.cpp
int autoComplete (const std::string&, const std::vector<std::string>&, std::vector<std::string>&);
// units.cpp
void formatTimeDeltaDays (std::string&, time_t);
std::string formatSeconds (time_t);
// uuid.cpp
const std::string uuid ();
#endif
////////////////////////////////////////////////////////////////////////////////

View File

@@ -93,6 +93,7 @@ static char* commands[] =
"active",
"add",
"calendar",
"colors",
"completed",
"delete",
"done",

View File

@@ -60,8 +60,7 @@ void initializeColorRules (Config& conf)
////////////////////////////////////////////////////////////////////////////////
void autoColorize (T& task, Text::color& fg, Text::color& bg)
{
fg = Text::nocolor;
bg = Text::nocolor;
// Note: fg, bg already contain colors specifically assigned via command.
// Colorization of the tagged.
if (gsFg["color.tagged"] != Text::nocolor ||

View File

@@ -56,32 +56,32 @@ void usage (Config& conf)
table.addCell (row, 1, "task");
row = table.addRow ();
table.addCell (row, 1, "task add [tags] [attributes] description...");
table.addCell (row, 1, "task add [tags] [attrs] desc...");
table.addCell (row, 2, "Adds a new task");
row = table.addRow ();
table.addCell (row, 1, "task list [tags] [attributes] description...");
table.addCell (row, 1, "task list [tags] [attrs] desc...");
table.addCell (row, 2, "Lists all tasks matching the specified criteria");
row = table.addRow ();
table.addCell (row, 1, "task long [tags] [attributes] description...");
table.addCell (row, 1, "task long [tags] [attrs] desc...");
table.addCell (row, 2, "Lists all task, all data, matching the specified criteria");
row = table.addRow ();
table.addCell (row, 1, "task ls [tags] [attributes] description...");
table.addCell (row, 1, "task ls [tags] [attrs] desc...");
table.addCell (row, 2, "Minimal listing of all tasks matching the specified criteria");
row = table.addRow ();
table.addCell (row, 1, "task completed [tags] [attributes] description...");
table.addCell (row, 1, "task completed [tags] [attrs] desc...");
table.addCell (row, 2, "Chronological listing of all completed tasks matching the specified criteria");
row = table.addRow ();
table.addCell (row, 1, "task ID [tags] [attributes] [description...]");
table.addCell (row, 1, "task ID [tags] [attrs] [desc...]");
table.addCell (row, 2, "Modifies the existing task with provided arguments");
row = table.addRow ();
table.addCell (row, 1, "task ID /from/to/");
table.addCell (row, 2, "Perform the substitution on the description, for fixing mistakes");
table.addCell (row, 2, "Perform the substitution on the desc, for fixing mistakes");
row = table.addRow ();
table.addCell (row, 1, "task delete ID");
@@ -143,6 +143,10 @@ void usage (Config& conf)
table.addCell (row, 1, "task export");
table.addCell (row, 2, "Exports all tasks as a CSV file");
row = table.addRow ();
table.addCell (row, 1, "task color");
table.addCell (row, 2, "Displays all possible colors");
row = table.addRow ();
table.addCell (row, 1, "task version");
table.addCell (row, 2, "Shows the task version number");
@@ -220,6 +224,7 @@ int main (int argc, char** argv)
else if (command == "info") handleInfo (tdb, task, conf);
else if (command == "long") handleLongList (tdb, task, conf);
else if (command == "ls") handleSmallList (tdb, task, conf);
else if (command == "colors") handleColor ( conf);
else if (command == "completed") handleCompleted (tdb, task, conf);
else if (command == "delete") handleDelete (tdb, task, conf);
else if (command == "start") handleStart (tdb, task, conf);
@@ -2353,34 +2358,38 @@ void handleDone (const TDB& tdb, T& task, Config& conf)
void handleExport (const TDB& tdb, T& task, Config& conf)
{
std::string file = trim (task.getDescription ());
std::ofstream out (file.c_str ());
if (out.good ())
if (file.length () > 0)
{
out << "'id',"
<< "'status',"
<< "'tags',"
<< "'entry',"
<< "'start',"
<< "'due',"
<< "'end',"
<< "'project',"
<< "'priority',"
<< "'fg',"
<< "'bg',"
<< "'description'"
<< "\n";
std::vector <T> all;
tdb.allT (all);
foreach (t, all)
std::ofstream out (file.c_str ());
if (out.good ())
{
out << t->composeCSV ().c_str ();
out << "'id',"
<< "'status',"
<< "'tags',"
<< "'entry',"
<< "'start',"
<< "'due',"
<< "'end',"
<< "'project',"
<< "'priority',"
<< "'fg',"
<< "'bg',"
<< "'description'"
<< "\n";
std::vector <T> all;
tdb.allT (all);
foreach (t, all)
{
out << t->composeCSV ().c_str ();
}
out.close ();
}
out.close ();
else
throw std::string ("Could not write to export file.");
}
else
throw std::string ("Could not write to export file.");
throw std::string ("You must specify a file to write to.");
}
////////////////////////////////////////////////////////////////////////////////
@@ -2473,6 +2482,83 @@ void handleModify (const TDB& tdb, T& task, Config& conf)
throw std::string ("Task not found.");
}
////////////////////////////////////////////////////////////////////////////////
void handleColor (Config& conf)
{
std::cout << std::endl << "Foreground" << std::endl
<< " "
<< Text::colorize (Text::bold, Text::nocolor, "bold") << " "
<< Text::colorize (Text::underline, Text::nocolor, "underline") << " "
<< Text::colorize (Text::bold_underline, Text::nocolor, "bold_underline") << std::endl
<< " " << Text::colorize (Text::black, Text::nocolor, "black") << " "
<< Text::colorize (Text::bold_black, Text::nocolor, "bold_black") << " "
<< Text::colorize (Text::underline_black, Text::nocolor, "underline_black") << " "
<< Text::colorize (Text::bold_underline_black, Text::nocolor, "bold_underline_black") << std::endl
<< " " << Text::colorize (Text::red, Text::nocolor, "red") << " "
<< Text::colorize (Text::bold_red, Text::nocolor, "bold_red") << " "
<< Text::colorize (Text::underline_red, Text::nocolor, "underline_red") << " "
<< Text::colorize (Text::bold_underline_red, Text::nocolor, "bold_underline_red") << std::endl
<< " " << Text::colorize (Text::green, Text::nocolor, "green") << " "
<< Text::colorize (Text::bold_green, Text::nocolor, "bold_green") << " "
<< Text::colorize (Text::underline_green, Text::nocolor, "underline_green") << " "
<< Text::colorize (Text::bold_underline_green, Text::nocolor, "bold_underline_green") << std::endl
<< " " << Text::colorize (Text::yellow, Text::nocolor, "yellow") << " "
<< Text::colorize (Text::bold_yellow, Text::nocolor, "bold_yellow") << " "
<< Text::colorize (Text::underline_yellow, Text::nocolor, "underline_yellow") << " "
<< Text::colorize (Text::bold_underline_yellow, Text::nocolor, "bold_underline_yellow") << std::endl
<< " " << Text::colorize (Text::blue, Text::nocolor, "blue") << " "
<< Text::colorize (Text::bold_blue, Text::nocolor, "bold_blue") << " "
<< Text::colorize (Text::underline_blue, Text::nocolor, "underline_blue") << " "
<< Text::colorize (Text::bold_underline_blue, Text::nocolor, "bold_underline_blue") << std::endl
<< " " << Text::colorize (Text::magenta, Text::nocolor, "magenta") << " "
<< Text::colorize (Text::bold_magenta, Text::nocolor, "bold_magenta") << " "
<< Text::colorize (Text::underline_magenta, Text::nocolor, "underline_magenta") << " "
<< Text::colorize (Text::bold_underline_magenta, Text::nocolor, "bold_underline_magenta") << std::endl
<< " " << Text::colorize (Text::cyan, Text::nocolor, "cyan") << " "
<< Text::colorize (Text::bold_cyan, Text::nocolor, "bold_cyan") << " "
<< Text::colorize (Text::underline_cyan, Text::nocolor, "underline_cyan") << " "
<< Text::colorize (Text::bold_underline_cyan, Text::nocolor, "bold_underline_cyan") << std::endl
<< " " << Text::colorize (Text::white, Text::nocolor, "white") << " "
<< Text::colorize (Text::bold_white, Text::nocolor, "bold_white") << " "
<< Text::colorize (Text::underline_white, Text::nocolor, "underline_white") << " "
<< Text::colorize (Text::bold_underline_white, Text::nocolor, "bold_underline_white") << std::endl
<< std::endl << "Background" << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_black, "on_black") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_black, "on_bright_black") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_red, "on_red") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_red, "on_bright_red") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_green, "on_green") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_green, "on_bright_green") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_yellow, "on_yellow") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_yellow, "on_bright_yellow") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_blue, "on_blue") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_blue, "on_bright_blue") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_magenta, "on_magenta") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_magenta, "on_bright_magenta") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_cyan, "on_cyan") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_cyan, "on_bright_cyan") << std::endl
<< " " << Text::colorize (Text::nocolor, Text::on_white, "on_white") << " "
<< Text::colorize (Text::nocolor, Text::on_bright_white, "on_bright_white") << std::endl
<< std::endl;
}
////////////////////////////////////////////////////////////////////////////////
void gatherNextTasks (
const TDB& tdb,

View File

@@ -47,6 +47,7 @@ void handleDelete (const TDB&, T&, Config&);
void handleStart (const TDB&, T&, Config&);
void handleDone (const TDB&, T&, Config&);
void handleModify (const TDB&, T&, Config&);
void handleColor (Config&);
void gatherNextTasks (const TDB&, T&, Config&, std::vector <T>&, std::vector <int>&);
void nag (const TDB&, T&, Config&);
@@ -56,9 +57,6 @@ void wrapText (std::vector <std::string>&, const std::string&, const int);
std::string trimLeft (const std::string& in, const std::string& t = " ");
std::string trimRight (const std::string& in, const std::string& t = " ");
std::string trim (const std::string& in, const std::string& t = " ");
std::wstring trimLeft (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
std::wstring trimRight (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
std::wstring trim (const std::wstring& in, const std::wstring& t = L" "); // UNICODE safe
void extractParagraphs (const std::string&, std::vector<std::string>&);
void extractLine (std::string&, std::string&, int);
void split (std::vector<std::string>&, const std::string&, const char);

View File

@@ -99,13 +99,6 @@ std::string trimLeft (const std::string& in, const std::string& t /*= " "*/)
return out.erase (0, in.find_first_not_of (t));
}
// UNICODE safe
std::wstring trimLeft (const std::wstring& in, const std::wstring& t /*= L" "*/)
{
std::wstring out = in;
return out.erase (0, in.find_first_not_of (t));
}
////////////////////////////////////////////////////////////////////////////////
std::string trimRight (const std::string& in, const std::string& t /*= " "*/)
{
@@ -113,13 +106,6 @@ std::string trimRight (const std::string& in, const std::string& t /*= " "*/)
return out.erase (out.find_last_not_of (t) + 1);
}
// UNICODE safe
std::wstring trimRight (const std::wstring& in, const std::wstring& t /*= L" "*/)
{
std::wstring out = in;
return out.erase (out.find_last_not_of (t) + 1);
}
////////////////////////////////////////////////////////////////////////////////
std::string trim (const std::string& in, const std::string& t /*= " "*/)
{
@@ -127,13 +113,6 @@ std::string trim (const std::string& in, const std::string& t /*= " "*/)
return trimLeft (trimRight (out, t), t);
}
// UNICODE safe
std::wstring trim (const std::wstring& in, const std::wstring& t /*= L" "*/)
{
std::wstring out = in;
return trimLeft (trimRight (out, t), t);
}
////////////////////////////////////////////////////////////////////////////////
// Remove enclosing balanced quotes. Assumes trimmed text.
void unquoteText (std::string& text)
@@ -183,8 +162,16 @@ void extractLine (std::string& text, std::string& line, int length)
// If no space was found, hyphenate.
else
{
line = text.substr (0, length - 1) + "-";
text = text.substr (length - 1, std::string::npos);
if (length > 1)
{
line = text.substr (0, length - 1) + "-";
text = text.substr (length - 1, std::string::npos);
}
else
{
line = text.substr (0, 1);
text = text.substr (length, std::string::npos);
}
}
}