Enhancement - Edit command

- Added more fields to the edit command.
- Added a more useful slurp implementation.
- Updated advanced.html with directions on use.
This commit is contained in:
Paul Beckingham 2009-05-10 16:26:48 -04:00
parent 407ef39c54
commit 6762af8ffd
4 changed files with 76 additions and 24 deletions

View file

@ -426,6 +426,22 @@ ID Project Pri Description
command.
</p>
<strong>% task &lt;id&gt; edit</strong>
<p>
This command allows you to use your text editor to edit all aspects
of a task. The specified task will be written to a file, and your
text editor will be invoked. If you modify the task in the text
editor, task will update accordingly.
</p>
<p>
Task will first check to see if you have defined a text editor
in the TASK_EDITOR environment variable. If not, task will
check to see if you defined a text editor in the VISUAL
environment variable. If not task will check to see if you
defined a text editor in the EDITOR environment variable.
If all those fail, task launches vi.
</p>
<strong>% task &lt;id&gt; fg:... bg:...</strong>
<p>
Not strictly a command, the setting of the fg and bg (foreground

View file

@ -860,6 +860,18 @@ std::string handleDuplicate (TDB& tdb, T& task, Config& conf)
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
static const char* leftDelim = "<<";
static const char* rightDelim = ">>";
static std::string findValue (const std::string& text, const std::string& name)
{
// Look for /^\s+name:\s+<<(.*)>>/
// Extract
// Trim
// Join
return "";
}
////////////////////////////////////////////////////////////////////////////////
// Introducing the Silver Bullet. This feature is the catch-all fixative for
// various other ills. This is like opening up the hood and going in with a
@ -878,47 +890,45 @@ std::string handleEdit (TDB& tdb, T& task, Config& conf)
if (access (dataLocation.c_str (), X_OK))
throw std::string ("Your data.location directory is not writable.");
// TODO Create a temp file name in data.location.
// Create a temp file name in data.location.
std::stringstream pattern;
pattern << dataLocation
<< "/task."
<< seq->getId ()
<< ".XXXXXX";
std::cout << "# pattern=" << pattern << std::endl;
pattern << dataLocation << "/task." << seq->getId () << ".XXXXXX";
char cpattern [PATH_MAX];
strcpy (cpattern, pattern.str ().c_str ());
char* file = mktemp (cpattern);
std::cout << "# file=" << file << std::endl;
// TODO Format the contents, T -> text.
std::stringstream before;
before << "# Edit only the items within the chevrons << >>. "
before << "# Edit only the items within the marks "
<< leftDelim << " " << rightDelim << "."
<< "All other edits will be ignored." << std::endl
<< "ID: " << seq->getId () << std::endl
<< "Project: <<" << seq->getAttribute ("project") << ">>" << std::endl
<< "Priority: <<" << seq->getAttribute ("priority") << ">>" << std::endl
<< "Description: <<" << seq->getDescription () << ">>" << std::endl;
<< "Project: " << leftDelim << seq->getAttribute ("project") << rightDelim << std::endl
<< "Priority: " << leftDelim << seq->getAttribute ("priority") << rightDelim << std::endl
<< "Description: " << leftDelim << seq->getDescription () << rightDelim << std::endl;
// Write to file.
spit (file, before.str ());
// TODO Determine correct editor: $EDITOR > $VISUAL > vi
std::string editor = "/usr/bin/vi";
// Determine correct editor: $TASK_EDITOR > $VISUAL > $EDITOR > vi
const char* editor = getenv ("TASK_EDITOR");
if (!editor) editor = getenv ("VISUAL");
if (!editor) editor = getenv ("EDITOR");
if (!editor) editor = "vi";
// system ("$EDITOR $file");
std::string command = editor + " " + file;
// Launch the editor.
std::string command = editor;
command += " ";
command += file;
system (command.c_str ());
// Slurp file.
std::vector <std::string> after;
std::string after;
slurp (file, after, true);
// TODO Parse file, text -> T.
foreach (line, after)
{
// TODO Handle each type of line.
}
seq->setAttribute ("Project", findValue (after, "Project"));
seq->setAttribute ("Priority", findValue (after, "Priority"));
seq->setDescription ( findValue (after, "Description"));
// Modify task.
tdb.modifyT (*seq);

View file

@ -152,6 +152,7 @@ std::string expandPath (const std::string&);
#endif
bool slurp (const std::string&, std::vector <std::string>&, bool trimLines = false);
bool slurp (const std::string&, std::string&, bool trimLines = false);
void spit (const std::string&, const std::string&);
// rules.cpp

View file

@ -429,6 +429,31 @@ bool slurp (
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool slurp (
const std::string& file,
std::string& contents,
bool trimLines /* = false */)
{
contents = "";
std::ifstream in (file.c_str ());
if (in.good ())
{
std::string line;
while (getline (in, line))
{
if (trimLines) line = trim (line);
contents += line;
}
in.close ();
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
void spit (const std::string& file, const std::string& contents)
{