From 6762af8ffd8f71696f79f506caa7e35652b27358 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 10 May 2009 16:26:48 -0400 Subject: [PATCH] Enhancement - Edit command - Added more fields to the edit command. - Added a more useful slurp implementation. - Updated advanced.html with directions on use. --- html/advanced.html | 16 +++++++++++++ src/command.cpp | 58 +++++++++++++++++++++++++++------------------- src/task.h | 1 + src/util.cpp | 25 ++++++++++++++++++++ 4 files changed, 76 insertions(+), 24 deletions(-) diff --git a/html/advanced.html b/html/advanced.html index 976dcd2d6..2d9ac14d7 100644 --- a/html/advanced.html +++ b/html/advanced.html @@ -426,6 +426,22 @@ ID Project Pri Description command.

+ % task <id> edit +

+ 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. +

+

+ 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. +

+ % task <id> fg:... bg:...

Not strictly a command, the setting of the fg and bg (foreground diff --git a/src/command.cpp b/src/command.cpp index a8e3a03a7..cd4fa07ae 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -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 << >>. " - << "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; + before << "# Edit only the items within the marks " + << leftDelim << " " << rightDelim << "." + << "All other edits will be ignored." << std::endl + << "ID: " << seq->getId () << 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 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); diff --git a/src/task.h b/src/task.h index bb727ad15..803aac0e6 100644 --- a/src/task.h +++ b/src/task.h @@ -152,6 +152,7 @@ std::string expandPath (const std::string&); #endif bool slurp (const std::string&, std::vector &, bool trimLines = false); +bool slurp (const std::string&, std::string&, bool trimLines = false); void spit (const std::string&, const std::string&); // rules.cpp diff --git a/src/util.cpp b/src/util.cpp index 87d0368f7..cafd50d17 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -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) {