diff --git a/scripts/zsh/_task b/scripts/zsh/_task index dda39329b..3c78a84dc 100644 --- a/scripts/zsh/_task +++ b/scripts/zsh/_task @@ -31,6 +31,7 @@ typeset -g _task_cmds _task_projects _task_tags _task_config _task_modifiers _task_projects=($(task _projects)) _task_tags=($(task _tags)) _task_ids=($(task _ids)) +_task_zshids=( ${(f)"$(task _zshids)"} ) _task_config=($(task _config)) _task_modifiers=( 'before' \ @@ -47,17 +48,35 @@ _task_modifiers=( 'noword' ) _task_cmds=($(task _commands)) +_task_zshcmds=( ${(f)"$(task _zshcommands)"} ) + +# concat zshcmds and zshids +_task_cmds_ids=($_task_zshcmds $_task_zshids) + _task_idCmds=( - 'append' \ - 'prepend' \ - 'annotate' \ - 'denotate' \ - 'edit' \ - 'duplicate' \ - 'info' \ - 'start' \ - 'stop' \ - 'done' + 'append:Appends more description to an existing task.' \ + 'prepend:Prepends more description to an existing task.' \ + 'annotate:Adds an annotation to an existing task.' \ + 'denotate:Deletes an annotation of an existing task.' \ + 'edit:Launches an editor to let you modify a task directly.' \ + 'duplicate:Duplicates the specified task, and allows modifications.' \ + 'info:Shows all data, metadata for specified task.' \ + 'start:Marks specified task as started.' \ + 'stop:Removes the start time from a task.' \ + 'done:Marks the specified task as completed.' +) + +_task_idCmdsDesc=( + 'append:Appends more description to an existing task.' \ + 'prepend:Prepends more description to an existing task.' \ + 'annotate:Adds an annotation to an existing task.' \ + 'denotate:Deletes an annotation of an existing task.' \ + 'edit:Launches an editor to let you modify a task directly.' \ + 'duplicate:Duplicates the specified task, and allows modifications.' \ + 'info:Shows all data, metadata for specified task.' \ + 'start:Marks specified task as started.' \ + 'stop:Removes the start time from a task.' \ + 'done:Marks the specified task as completed.' ) _task() { @@ -190,7 +209,7 @@ _task_default() { (( $+functions[_task_id] )) || _task_id() { if (( CURRENT < 3 )); then - _describe -t ids 'task IDs' _task_ids + _describe -t ids 'task IDs' _task_zshids else _task_attributes "$@" fi @@ -205,7 +224,7 @@ _task_merge() { # modify (task [0-9]* ...) completion (( $+functions[_task_modify] )) || _task_modify() { - _describe -t commands 'task command' _task_idCmds + _describe -t commands 'task command' _task_idCmdsDesc _task_attributes "$@" } @@ -214,11 +233,11 @@ _task_modify() { _task_commands() { local cmd ret=1 if (( CURRENT == 1 )); then - # TODO add descriptions (assoz array) - _describe -t commands 'task command' _task_cmds + #TODO fix descriptions + + _describe -t commands 'task command' _task_cmds_ids # TODO match more than one ID - _describe -t ids 'task IDs' _task_ids - # TODO sorting + # TODO sorting (ids below commands) elif [[ $words[1] =~ ^[0-9]*$ ]] then _call_function ret _task_modify return ret diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 3db676500..e3da9f670 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -136,6 +136,8 @@ void Cmd::load () commands.push_back ("_version"); commands.push_back ("_urgency"); commands.push_back ("_query"); + commands.push_back ("_zshcommands"); + commands.push_back ("_zshids"); commands.push_back ("export.csv"); commands.push_back ("export.ical"); commands.push_back ("export.yaml"); @@ -243,6 +245,8 @@ bool Cmd::isReadOnlyCommand () command == "_version" || command == "_urgency" || command == "_query" || + command == "_zshcommands" || + command == "_zshids" || command == "export.csv" || command == "export.ical" || command == "export.yaml" || diff --git a/src/Context.cpp b/src/Context.cpp index 3a45bfdd8..9f2d359ec 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -260,6 +260,8 @@ int Context::dispatch (std::string &out) else if (cmd.command == "_version") { rc = handleCompletionVersion (out); } else if (cmd.command == "_urgency") { rc = handleUrgency (out); } else if (cmd.command == "_query") { rc = handleQuery (out); } + else if (cmd.command == "_zshcommands") { rc = handleZshCompletionCommands (out); } + else if (cmd.command == "_zshids") { rc = handleZshCompletionIDs (out); } else if (cmd.command == "" && sequence.size ()) { rc = handleModify (out); } diff --git a/src/command.cpp b/src/command.cpp index dc74a3653..2cf9a5d58 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -618,6 +618,199 @@ int handleCompletionIDs (std::string& outs) return 0; } +//////////////////////////////////////////////////////////////////////////////// +int handleZshCompletionIDs (std::string& outs) +{ + std::vector tasks; + context.tdb.lock (context.config.getBoolean ("locking")); + Filter filter; + context.tdb.loadPending (tasks, filter); + context.tdb.commit (); + context.tdb.unlock (); + + std::stringstream out; + foreach (task, tasks) { + if (task->getStatus () != Task::deleted && + task->getStatus () != Task::completed) { + out << task->id << ":" << task->get("description") << "\n"; + } + } + + outs = out.str (); + return 0; +} + + +//////////////////////////////////////////////////////////////////////////////// +int handleZshCompletionCommands (std::string& outs) +{ + // Get a list of all commands. + std::vector commands; + context.cmd.allCommands (commands); + + // Sort alphabetically. + std::sort (commands.begin (), commands.end ()); + + std::stringstream out; + foreach (command, commands) { + out << *command << ":"; + + if (*command == "add") { + out << "Adds a new task."; + } + else if (*command == "log") { + out << "Adds a new task that is already completed."; + } + else if (*command == "append") { + out << "Appends more description to an existing task."; + } + else if (*command == "prepend") { + out << "Prepends more description to an existing task."; + } + else if (*command == "annotate") { + out << "Adds an annotation to an existing task."; + } + else if (*command == "denotate") { + out << "Deletes an annotation of an existing task."; + } + else if (*command == "edit") { + out << "Launches an editor to let you modify a task directly."; + } + else if (*command == "undo") { + out << "Reverts the most recent action."; + } + else if (*command == "shell") { + out << "Launches an interactive shell."; + } + else if (*command == "duplicate") { + out << "Duplicates the specified task, and allows modifications."; + } + else if (*command == "delete") { + out << "Deletes the specified task."; + } + else if (*command == "info") { + out << "Shows all data, metadata for specified task."; + } + else if (*command == "start") { + out << "Marks specified task as started."; + } + else if (*command == "stop") { + out << "Removes the 'start' time from a task."; + } + else if (*command == "done") { + out << "Marks the specified task as completed."; + } + else if (*command == "projects") { + out << "Shows a list of all project names used."; + } + else if (*command == "tags") { + out << "Shows a list of all tags used."; + } + else if (*command == "summary") { + out << "Shows a report of task status by project."; + } + else if (*command == "timesheet") { + out << "Shows a weekly report of tasks completed and started."; + } + else if (*command == "history") { + out << "Alias to history.monthly."; + } + else if (*command == "history.monthly") { + out << "Shows a report of task history, by month."; + } + else if (*command == "history.annual") { + out << "Shows a report of task history, by year."; + } + else if (*command == "ghistory") { + out << "Alias to ghistory.monthly."; + } + else if (*command == "ghistory.monthly") { + out << "Shows a graphical report of task history, by month."; + } + else if (*command == "ghistory.annual") { + out << "Shows a graphical report of task history, by year."; + } + else if (*command == "burndown") { + out << "Alias to burndown.weekly."; + } + else if (*command == "burndown.daily") { + out << "Shows a graphical burndown chart, by day."; + } + else if (*command == "burndown.weekly") { + out << "Shows a graphical burndown chart, by week."; + } + else if (*command == "burndown.monthly") { + out << "Shows a graphical burndown chart, by month."; + } + else if (*command == "calendar") { + out << "Shows a calendar, with due tasks marked."; + } + else if (*command == "stats") { + out << "Shows task database statistics."; + } + else if (*command == "import") { + out << "Imports tasks from a variety of formats."; + } + else if (*command == "export") { + out << "Alias to export.csv."; + } + else if (*command == "export.csv") { + out << "Lists all tasks in CSV format."; + } + else if (*command == "export.ical") { + out << "Lists all tasks in iCalendar format."; + } + else if (*command == "export.vcalendar") { + out << "Lists all tasks in vCalendar format."; + } + else if (*command == "export.yaml") { + out << "Lists all tasks in YAML format."; + } + else if (*command == "merge") { + out << "Merges the specified database with the local database."; + } + else if (*command == "push") { + out << "Pushed the local database to the specified URI."; + } + else if (*command == "pull") { + out << "Overwrites the local database with that found at the URI."; + } + else if (*command == "colors") { + out << "Displays all possible colors or a named sample [legend | sample]."; + } + else if (*command == "count") { + out << "Shows only the number of matching tasks."; + } + else if (*command == "version") { + out << "Shows the task version number."; + } + else if (*command == "show") { + out << "Shows the entire task configuration variables."; + } + else if (*command == "config") { + out << "Add, modify and remove settings in the task configuration."; + } + else if (*command == "diagnostics") { + out << "Information needed when reporting a problem."; + } + else if (*command == "help") { + out << "Shows the long usage text."; + } + else if (*command == "rm") { + out << "Alias to delete."; + } + else { + // try to interpret this as custom report + out << context.config.get (std::string ("report." + *command + ".description")); + } + + out << "\n"; + } + + outs = out.str (); + return 0; +} + //////////////////////////////////////////////////////////////////////////////// void handleUndo () { @@ -2739,3 +2932,4 @@ int deltaSubstitutions (Task& task) } //////////////////////////////////////////////////////////////////////////////// +// vim: ts=2 sw=2 et diff --git a/src/main.h b/src/main.h index 7bbb34465..2ff0caacd 100644 --- a/src/main.h +++ b/src/main.h @@ -69,6 +69,8 @@ int handleCompletionConfig (std::string&); int handleCompletionVersion (std::string&); int handleUrgency (std::string&); int handleQuery (std::string&); +int handleZshCompletionCommands (std::string&); +int handleZshCompletionIDs (std::string&); int handleVersion (std::string&); int handleConfig (std::string&); int handleShow (std::string&);