Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18fd59a1ed | ||
|
|
4549af6b84 | ||
|
|
4825b37df5 | ||
|
|
148088c775 | ||
|
|
45a25ca47b | ||
|
|
ab0a57ec89 | ||
|
|
65c2fe438f | ||
|
|
37bdfe06da | ||
|
|
b54b07ef77 | ||
|
|
e3eb87aa74 | ||
|
|
b34cb90709 | ||
|
|
04da56193e | ||
|
|
3e1afc5777 |
7
AUTHORS
7
AUTHORS
@@ -0,0 +1,7 @@
|
|||||||
|
Principal Author
|
||||||
|
Paul Beckingham, paul@beckingham.net
|
||||||
|
|
||||||
|
Contributing Authors
|
||||||
|
|
||||||
|
Testers
|
||||||
|
|
||||||
|
|||||||
144
ChangeLog
144
ChangeLog
@@ -1,125 +1,129 @@
|
|||||||
|
|
||||||
1.0.0 - First official release ()
|
1.0.0 (?)
|
||||||
- Bug: assertion fails for task info n, where n is out of range
|
|
||||||
- Bug: assertion fails on mobile for t v
|
- Bug: assertion fails on mobile for t v
|
||||||
|
|
||||||
0.10.0 - Productization ()
|
0.9.9 (?)
|
||||||
~ Documentation complete
|
- Autoconf/autmake behaving properly.
|
||||||
~ Test suite
|
- All bugs fixed.
|
||||||
~ All known bugs fixed
|
|
||||||
|
|
||||||
------ reality -----------------------------------
|
------ reality -----------------------------------
|
||||||
|
|
||||||
0.9.7
|
0.9.8 (5/25/2008)
|
||||||
5/17/2008
|
+ Color command.
|
||||||
+ Task offers to create a sample ~/.taskrc file if one is not found.
|
+ Removed unnecessary files.
|
||||||
+ Task offers to create a ~/.task directory if one is not found.
|
+ Completed documentation.
|
||||||
|
|
||||||
0.9.6
|
0.9.7 (5/24/2008)
|
||||||
5/13/208
|
+ Migrated old compiler flags into Makefile.am
|
||||||
+ Replaced color management code.
|
+ Added ncurses endwin function check to configure.ac
|
||||||
+ Improved color rules code.
|
+ 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
|
0.9.6 (5/13/208)
|
||||||
5/12/2008
|
+ Corrected wrong include file in Table.cpp
|
||||||
+ Replaced Table storage with Grid.
|
+ Replaced color management code.
|
||||||
5/10/2008
|
+ Improved color rules code.
|
||||||
+ 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.4
|
0.9.5 (5/12/2008)
|
||||||
4/26/2008
|
+ Replaced Table storage with Grid.
|
||||||
+ Integrated new Grid object into build - not yet integrated into Table.
|
+ Added Grid.cpp to configure.ac
|
||||||
4/19/2008
|
+ Added Makefile to src/.gitignore
|
||||||
+ More .gitignore tweaks.
|
+ Makefile should not be part of the repository.
|
||||||
+ Added .gitignore
|
+ Added Grid.cpp
|
||||||
+ Added more missing files.
|
+ Added Grid::Cell::operator==
|
||||||
+ Added all source code.
|
+ ChangeLog file begun.
|
||||||
+ Generic OSS files added.
|
+ Bumped version to 0.9.5 for next release.
|
||||||
+ Initial commit.
|
|
||||||
|
|
||||||
0.9.3
|
0.9.4 (4/26/2008)
|
||||||
4/6/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
|
0.9.3 (4/6/2008)
|
||||||
4/3/2008
|
|
||||||
|
|
||||||
0.9.1
|
0.9.2 (4/3/2008)
|
||||||
4/1/2008
|
|
||||||
|
|
||||||
0.9.0
|
0.9.1 (4/1/2008)
|
||||||
3/23/2008
|
|
||||||
+ flat source directory
|
|
||||||
+ autoconf complete
|
|
||||||
+ "task next"
|
|
||||||
+ "task stats"
|
|
||||||
+ "task export"
|
|
||||||
+ Rule₋based colorization
|
|
||||||
|
|
||||||
0.8.16
|
0.9.0 (3/23/2008)
|
||||||
3/13/208
|
+ flat source directory
|
||||||
|
+ autoconf complete
|
||||||
|
+ "task next"
|
||||||
|
+ "task stats"
|
||||||
|
+ "task export"
|
||||||
|
+ Rules-based colorization
|
||||||
|
|
||||||
0.8.14
|
0.8.1 (1/28/2008) - 0.8.16 (3/13/2008)
|
||||||
2/20/2008
|
+ autoconf conversion (many builds)
|
||||||
|
|
||||||
0.8.13
|
0.8.0 Polish (1/25/2008)
|
||||||
2/2/2008
|
|
||||||
|
|
||||||
0.8.1
|
|
||||||
1/28/2008
|
|
||||||
|
|
||||||
0.8.0 - Polish (1/25/2008)
|
|
||||||
+ Code cleanup, reorganization
|
+ Code cleanup, reorganization
|
||||||
+ "task overdue"
|
+ "task overdue"
|
||||||
+ Add "age" column to list and long
|
+ Add "age" column to list and long
|
||||||
+ Use 'conf' for build, version tracking
|
+ Use 'conf' for build, version tracking
|
||||||
+ Add "/from/to/" description editing
|
+ 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
|
+ Clean, publishable API reimplementation
|
||||||
+ File locking
|
+ File locking
|
||||||
+ retain deleted tasks
|
+ retain deleted tasks
|
||||||
+ "task info ID" report showing all metadata
|
+ "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 history"
|
||||||
+ "task summary"
|
+ "task summary"
|
||||||
+ "task calendar"
|
+ "task calendar"
|
||||||
+ due: support
|
+ due support
|
||||||
+ Table sorting
|
+ Table sorting
|
||||||
|
|
||||||
0.5.0 - Multi-user support (12/10/2006)
|
0.5.0 Multi-user support (12/10/2006)
|
||||||
+ Command logging
|
+ Command logging
|
||||||
+ "task usage" report
|
+ "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 delete" complete
|
||||||
+ "task id ..." complete
|
+ "task id ..." complete
|
||||||
+ "task list ..." synonym for "task find ..."
|
+ "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 start" complete
|
||||||
+ "task done" complete
|
+ "task done" complete
|
||||||
+ completed.data support
|
+ completed.data support
|
||||||
|
|
||||||
0.2.0 - Neutral commands (12/2/2006)
|
0.2.0 Neutral commands (12/2/2006)
|
||||||
+ "task find" complete
|
+ "task find" complete
|
||||||
+ "task projects" complete
|
+ "task projects" complete
|
||||||
+ "task tags" complete
|
+ "task tags" complete
|
||||||
|
|
||||||
0.1.0 - Constructive commands (12/1/2006)
|
0.1.0 Constructive commands (12/1/2006)
|
||||||
+ "task add" complete
|
+ "task add" complete
|
||||||
+ completed.data support
|
+ completed.data support
|
||||||
+ ~/.taskrc support
|
+ ~/.taskrc support
|
||||||
|
|
||||||
0.0.1 - Basic infrastructure (11/29/2006)
|
0.0.1 Basic infrastructure (11/29/2006)
|
||||||
+ Command line parsing
|
+ Command line parsing
|
||||||
+ API layer
|
+ API layer
|
||||||
+ Usage
|
+ Usage
|
||||||
|
|
||||||
|
------ start -----------------------------------
|
||||||
|
|
||||||
|
|||||||
20
DEVELOPERS
Normal file
20
DEVELOPERS
Normal 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
|
||||||
|
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
SUBDIRS = src
|
SUBDIRS = src
|
||||||
EXTRA_DIST = TUTORIAL SAMPLE_taskrc
|
EXTRA_DIST = TUTORIAL DEVELOPERS
|
||||||
|
|
||||||
|
|||||||
20
NEWS
20
NEWS
@@ -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
63
README
@@ -1,47 +1,42 @@
|
|||||||
|
Thank you for taking a look at task. Task is a GTD utility featuring:
|
||||||
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:
|
|
||||||
|
|
||||||
- Robust C++ implementation
|
- Robust C++ implementation
|
||||||
- Tags
|
- Tags
|
||||||
- Colorful, tabular output
|
- Colorful, tabular output
|
||||||
- Reports
|
- Reports
|
||||||
- Low-level API
|
- Low-level API
|
||||||
- Auto-completion on all commands, options
|
- Abbreviations for all commands, options
|
||||||
- Multi-user file locking
|
- Multi-user file locking
|
||||||
- Clean architecture allowing quick addition of new features
|
- 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
|
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.
|
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!
|
||||||
|
|
||||||
|
|||||||
@@ -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
554
TUTORIAL
@@ -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
|
This guide shows how to quickly set up the task program, and become proficient
|
||||||
with it.
|
with it.
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
Quick Setup
|
||||||
|
Simple Usage
|
||||||
|
Advanced Usage
|
||||||
|
Interacting with the Shell
|
||||||
|
Configuring Task
|
||||||
|
Colors
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Quick Setup
|
Quick Setup
|
||||||
-----------
|
-----------
|
||||||
@@ -12,10 +21,10 @@ Build the task program according to the directions in the INSTALL file. This
|
|||||||
transcript illustrates a typical installation:
|
transcript illustrates a typical installation:
|
||||||
|
|
||||||
% ls
|
% ls
|
||||||
task-0.9.0.tar.gz
|
task-1.0.0.tar.gz
|
||||||
% gunzip task-0.9.0.tar.gz
|
% gunzip task-1.0.0.tar.gz
|
||||||
% tar xf task-0.9.0.tar
|
% tar xf task-1.0.0.tar
|
||||||
% cd task-0.9.0
|
% cd task-1.0.0
|
||||||
% ./configure
|
% ./configure
|
||||||
...
|
...
|
||||||
% make
|
% make
|
||||||
@@ -23,21 +32,24 @@ transcript illustrates a typical installation:
|
|||||||
% make install
|
% make install
|
||||||
|
|
||||||
You need to make sure that the installed task program is in your PATH
|
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
|
environment variable.
|
||||||
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:
|
|
||||||
|
|
||||||
% cp SAMPLE_taskrc ~/.taskrc
|
Task reads a configuration file - called .taskrc in your home directory - and
|
||||||
% mkdir ~/.task
|
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
|
The simplest way to get a configuration file and task directory is to run task.
|
||||||
belonging to user bob. Change this entry to point to your own home directory,
|
On startup, task will check to see if it can find the configuration file and
|
||||||
and the .task directory you just created. Your task program is now ready to
|
task directory, and if not found, will ask you whether it may create both.
|
||||||
use. Verify that task is properly installed with:
|
|
||||||
|
|
||||||
% task version
|
% 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
|
Simple Usage
|
||||||
@@ -70,14 +82,15 @@ task 2:
|
|||||||
Permanently delete task? (y/n) y
|
Permanently delete task? (y/n) y
|
||||||
|
|
||||||
Task wants you to confirm deletions. To remove the confirmation, edit your
|
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
|
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
|
While the use of projects and priorities are not essential to benefitting from
|
||||||
the list of tasks grows large. Let's assign a project to these tasks:
|
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 1 project:Wedding
|
||||||
% task 3 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
|
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
|
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
|
id numbers will remain valid until the next 'ls' command is run. You should
|
||||||
only use the ids from the most recent 'ls' command.
|
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
|
||||||
Now that projects are assigned, we can look at just the Wedding project tasks:
|
them correctly. Now that projects are assigned, we can look at just the Wedding
|
||||||
|
project tasks:
|
||||||
|
|
||||||
% task ls project:Wedding
|
% 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
|
that tasks have been prioritized, you can see that the tasks are being sorted
|
||||||
by priority, with the highest priority tasks at the top.
|
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'
|
The 'ls' command provides the least information for each task. The 'list'
|
||||||
command provides more:
|
command provides more:
|
||||||
|
|
||||||
% task list
|
% 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
|
3 Family H 4 mins Send John a birthday card
|
||||||
1 Wedding H 5 mins Book plane ticket
|
1 Wedding H 5 mins Book plane ticket
|
||||||
2 Wedding M 5 mins Reserve a rental car
|
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:
|
sorted by due date, then priority. Let's add due dates:
|
||||||
|
|
||||||
% task 3 due:3/25/2008
|
% task 3 due:6/25/2008
|
||||||
% task 1 due:5/31/2008
|
% task 1 due:7/31/2008
|
||||||
% task list
|
% task list
|
||||||
|
|
||||||
ID Project Pri Due Active Age Description
|
ID Project Pri Due Active Age Description
|
||||||
3 Family H 3/25/2008 6 mins Send John a birthday card
|
3 Family H 6/25/2008 6 mins Send John a birthday card
|
||||||
1 Wedding H 5/31/2008 7 mins Book plane ticket
|
1 Wedding H 7/31/2008 7 mins Book plane ticket
|
||||||
2 Wedding M 7 mins Reserve a rental car
|
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
|
yellow if your terminal supports color. To change this color, edit your
|
||||||
.taskrc file, and change the line to one of these alternatives:
|
.taskrc file, and change the line to one of these alternatives:
|
||||||
|
|
||||||
color.due=<foreground color> on <background color>
|
color.due=red
|
||||||
color.due=<foreground color>
|
color.due=on_blue
|
||||||
color.due=on <background color>
|
color.due=red on_blue
|
||||||
|
color.due=bold_red on_blue
|
||||||
|
|
||||||
Where color is one of:
|
Where color is one of the following:
|
||||||
|
|
||||||
black
|
black
|
||||||
blue
|
blue
|
||||||
@@ -178,38 +199,451 @@ Where color is one of:
|
|||||||
white
|
white
|
||||||
|
|
||||||
All colors are specified in this way. Take a look in .taskrc for all the other
|
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
|
Advanced Use
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Commands:
|
Here are the other commands, in some detail. Note that the command:
|
||||||
- task add
|
|
||||||
- task list
|
% task
|
||||||
- task long
|
|
||||||
- task ls
|
with no arguments will generate a help message that lists all these commands.
|
||||||
- task done
|
|
||||||
- task completed
|
|
||||||
- task delete
|
% task projects
|
||||||
- task start
|
---------------
|
||||||
- task summary
|
|
||||||
- task history
|
This report generates a list of all the different projects that you are using
|
||||||
- task next
|
along with a count of the pending tasks for each project. For example:
|
||||||
- task <modify>
|
|
||||||
- task /from/to/
|
% task projects
|
||||||
- task projects
|
|
||||||
- task tags
|
Project Tasks
|
||||||
- task info
|
Errands 1
|
||||||
- task active
|
Birthdays 3
|
||||||
- task overdue
|
Car 2
|
||||||
- task calendar
|
|
||||||
- task stats
|
|
||||||
- task usage
|
|
||||||
- task export
|
% task summary
|
||||||
- task version
|
--------------
|
||||||
|
|
||||||
|
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
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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, 0.9.7, bugs@beckingham.net)
|
AC_INIT(task, 0.9.8, 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])
|
||||||
@@ -16,6 +16,7 @@ AC_LANG(C++)
|
|||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
#AC_CHECK_LIB(ncurses, initscr, [LIBS="$LIBS -lncurses" AC_DEFINE([HAVE_NCURSES], [1], [Found ncurses])])
|
#AC_CHECK_LIB(ncurses, initscr, [LIBS="$LIBS -lncurses" AC_DEFINE([HAVE_NCURSES], [1], [Found ncurses])])
|
||||||
AC_CHECK_LIB(ncurses,initscr)
|
AC_CHECK_LIB(ncurses,initscr)
|
||||||
|
AC_CHECK_LIB(ncurses,endwin)
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ void Config::createDefault (const std::string& file)
|
|||||||
if (taskDir != "")
|
if (taskDir != "")
|
||||||
{
|
{
|
||||||
FILE* out;
|
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, "data.location=%s\n", taskDir.c_str ());
|
||||||
fprintf (out, "command.logging=off\n");
|
fprintf (out, "command.logging=off\n");
|
||||||
|
|||||||
@@ -399,6 +399,8 @@ bool Grid::Cell::operator== (const Grid::Cell& rhs) const
|
|||||||
case CELL_STRING: return mString == rhs.mString ? true : false;
|
case CELL_STRING: return mString == rhs.mString ? true : false;
|
||||||
default: break; // To prevent warnings.
|
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;
|
case CELL_STRING: return mString != rhs.mString ? true : false;
|
||||||
default: break; // To prevent warnings.
|
default: break; // To prevent warnings.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
bin_PROGRAMS = task
|
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
|
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
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ target_alias = @target_alias@
|
|||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
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
|
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
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|||||||
@@ -476,8 +476,16 @@ void Table::calculateColumnWidths ()
|
|||||||
mCalculatedWidth = ideal;
|
mCalculatedWidth = ideal;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// else
|
else
|
||||||
|
{
|
||||||
// std::cout << "# insufficient room, considering only flexible columns." << std::endl;
|
// 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.
|
// Try again, treating minimum columns as flexible.
|
||||||
|
|||||||
@@ -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
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
@@ -93,6 +93,7 @@ static char* commands[] =
|
|||||||
"active",
|
"active",
|
||||||
"add",
|
"add",
|
||||||
"calendar",
|
"calendar",
|
||||||
|
"colors",
|
||||||
"completed",
|
"completed",
|
||||||
"delete",
|
"delete",
|
||||||
"done",
|
"done",
|
||||||
|
|||||||
@@ -60,8 +60,7 @@ void initializeColorRules (Config& conf)
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void autoColorize (T& task, Text::color& fg, Text::color& bg)
|
void autoColorize (T& task, Text::color& fg, Text::color& bg)
|
||||||
{
|
{
|
||||||
fg = Text::nocolor;
|
// Note: fg, bg already contain colors specifically assigned via command.
|
||||||
bg = Text::nocolor;
|
|
||||||
|
|
||||||
// Colorization of the tagged.
|
// Colorization of the tagged.
|
||||||
if (gsFg["color.tagged"] != Text::nocolor ||
|
if (gsFg["color.tagged"] != Text::nocolor ||
|
||||||
|
|||||||
146
src/task.cpp
146
src/task.cpp
@@ -56,32 +56,32 @@ void usage (Config& conf)
|
|||||||
table.addCell (row, 1, "task");
|
table.addCell (row, 1, "task");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Adds a new task");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Lists all tasks matching the specified criteria");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Lists all task, all data, matching the specified criteria");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Minimal listing of all tasks matching the specified criteria");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Chronological listing of all completed tasks matching the specified criteria");
|
||||||
|
|
||||||
row = table.addRow ();
|
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");
|
table.addCell (row, 2, "Modifies the existing task with provided arguments");
|
||||||
|
|
||||||
row = table.addRow ();
|
row = table.addRow ();
|
||||||
table.addCell (row, 1, "task ID /from/to/");
|
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 ();
|
row = table.addRow ();
|
||||||
table.addCell (row, 1, "task delete ID");
|
table.addCell (row, 1, "task delete ID");
|
||||||
@@ -143,6 +143,10 @@ void usage (Config& conf)
|
|||||||
table.addCell (row, 1, "task export");
|
table.addCell (row, 1, "task export");
|
||||||
table.addCell (row, 2, "Exports all tasks as a CSV file");
|
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 ();
|
row = table.addRow ();
|
||||||
table.addCell (row, 1, "task version");
|
table.addCell (row, 1, "task version");
|
||||||
table.addCell (row, 2, "Shows the task version number");
|
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 == "info") handleInfo (tdb, task, conf);
|
||||||
else if (command == "long") handleLongList (tdb, task, conf);
|
else if (command == "long") handleLongList (tdb, task, conf);
|
||||||
else if (command == "ls") handleSmallList (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 == "completed") handleCompleted (tdb, task, conf);
|
||||||
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);
|
||||||
@@ -2353,34 +2358,38 @@ void handleDone (const TDB& tdb, T& task, Config& conf)
|
|||||||
void handleExport (const TDB& tdb, T& task, Config& conf)
|
void handleExport (const TDB& tdb, T& task, Config& conf)
|
||||||
{
|
{
|
||||||
std::string file = trim (task.getDescription ());
|
std::string file = trim (task.getDescription ());
|
||||||
|
if (file.length () > 0)
|
||||||
std::ofstream out (file.c_str ());
|
|
||||||
if (out.good ())
|
|
||||||
{
|
{
|
||||||
out << "'id',"
|
std::ofstream out (file.c_str ());
|
||||||
<< "'status',"
|
if (out.good ())
|
||||||
<< "'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 << "'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
|
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.");
|
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 (
|
void gatherNextTasks (
|
||||||
const TDB& tdb,
|
const TDB& tdb,
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ void handleDelete (const TDB&, T&, Config&);
|
|||||||
void handleStart (const TDB&, T&, Config&);
|
void handleStart (const TDB&, T&, Config&);
|
||||||
void handleDone (const TDB&, T&, Config&);
|
void handleDone (const TDB&, T&, Config&);
|
||||||
void handleModify (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 gatherNextTasks (const TDB&, T&, Config&, std::vector <T>&, std::vector <int>&);
|
||||||
void nag (const TDB&, T&, Config&);
|
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 trimLeft (const std::string& in, const std::string& t = " ");
|
||||||
std::string trimRight (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::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 extractParagraphs (const std::string&, std::vector<std::string>&);
|
||||||
void extractLine (std::string&, std::string&, int);
|
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 char);
|
||||||
|
|||||||
33
src/text.cpp
33
src/text.cpp
@@ -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));
|
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 /*= " "*/)
|
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);
|
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 /*= " "*/)
|
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);
|
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.
|
// Remove enclosing balanced quotes. Assumes trimmed text.
|
||||||
void unquoteText (std::string& 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.
|
// If no space was found, hyphenate.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
line = text.substr (0, length - 1) + "-";
|
if (length > 1)
|
||||||
text = text.substr (length - 1, std::string::npos);
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user