Zsh completion

- added features #585 and #586
This commit is contained in:
Johannes Schlatow 2011-01-04 21:57:15 +01:00
parent 6a7e741b02
commit 2181c48eb7
5 changed files with 237 additions and 16 deletions

View file

@ -31,6 +31,7 @@ typeset -g _task_cmds _task_projects _task_tags _task_config _task_modifiers
_task_projects=($(task _projects)) _task_projects=($(task _projects))
_task_tags=($(task _tags)) _task_tags=($(task _tags))
_task_ids=($(task _ids)) _task_ids=($(task _ids))
_task_zshids=( ${(f)"$(task _zshids)"} )
_task_config=($(task _config)) _task_config=($(task _config))
_task_modifiers=( _task_modifiers=(
'before' \ 'before' \
@ -47,17 +48,35 @@ _task_modifiers=(
'noword' 'noword'
) )
_task_cmds=($(task _commands)) _task_cmds=($(task _commands))
_task_zshcmds=( ${(f)"$(task _zshcommands)"} )
# concat zshcmds and zshids
_task_cmds_ids=($_task_zshcmds $_task_zshids)
_task_idCmds=( _task_idCmds=(
'append' \ 'append:Appends more description to an existing task.' \
'prepend' \ 'prepend:Prepends more description to an existing task.' \
'annotate' \ 'annotate:Adds an annotation to an existing task.' \
'denotate' \ 'denotate:Deletes an annotation of an existing task.' \
'edit' \ 'edit:Launches an editor to let you modify a task directly.' \
'duplicate' \ 'duplicate:Duplicates the specified task, and allows modifications.' \
'info' \ 'info:Shows all data, metadata for specified task.' \
'start' \ 'start:Marks specified task as started.' \
'stop' \ 'stop:Removes the start time from a task.' \
'done' '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() { _task() {
@ -190,7 +209,7 @@ _task_default() {
(( $+functions[_task_id] )) || (( $+functions[_task_id] )) ||
_task_id() { _task_id() {
if (( CURRENT < 3 )); then if (( CURRENT < 3 )); then
_describe -t ids 'task IDs' _task_ids _describe -t ids 'task IDs' _task_zshids
else else
_task_attributes "$@" _task_attributes "$@"
fi fi
@ -205,7 +224,7 @@ _task_merge() {
# modify (task [0-9]* ...) completion # modify (task [0-9]* ...) completion
(( $+functions[_task_modify] )) || (( $+functions[_task_modify] )) ||
_task_modify() { _task_modify() {
_describe -t commands 'task command' _task_idCmds _describe -t commands 'task command' _task_idCmdsDesc
_task_attributes "$@" _task_attributes "$@"
} }
@ -214,11 +233,11 @@ _task_modify() {
_task_commands() { _task_commands() {
local cmd ret=1 local cmd ret=1
if (( CURRENT == 1 )); then if (( CURRENT == 1 )); then
# TODO add descriptions (assoz array) #TODO fix descriptions
_describe -t commands 'task command' _task_cmds
_describe -t commands 'task command' _task_cmds_ids
# TODO match more than one ID # TODO match more than one ID
_describe -t ids 'task IDs' _task_ids # TODO sorting (ids below commands)
# TODO sorting
elif [[ $words[1] =~ ^[0-9]*$ ]] then elif [[ $words[1] =~ ^[0-9]*$ ]] then
_call_function ret _task_modify _call_function ret _task_modify
return ret return ret

View file

@ -136,6 +136,8 @@ void Cmd::load ()
commands.push_back ("_version"); commands.push_back ("_version");
commands.push_back ("_urgency"); commands.push_back ("_urgency");
commands.push_back ("_query"); commands.push_back ("_query");
commands.push_back ("_zshcommands");
commands.push_back ("_zshids");
commands.push_back ("export.csv"); commands.push_back ("export.csv");
commands.push_back ("export.ical"); commands.push_back ("export.ical");
commands.push_back ("export.yaml"); commands.push_back ("export.yaml");
@ -243,6 +245,8 @@ bool Cmd::isReadOnlyCommand ()
command == "_version" || command == "_version" ||
command == "_urgency" || command == "_urgency" ||
command == "_query" || command == "_query" ||
command == "_zshcommands" ||
command == "_zshids" ||
command == "export.csv" || command == "export.csv" ||
command == "export.ical" || command == "export.ical" ||
command == "export.yaml" || command == "export.yaml" ||

View file

@ -260,6 +260,8 @@ int Context::dispatch (std::string &out)
else if (cmd.command == "_version") { rc = handleCompletionVersion (out); } else if (cmd.command == "_version") { rc = handleCompletionVersion (out); }
else if (cmd.command == "_urgency") { rc = handleUrgency (out); } else if (cmd.command == "_urgency") { rc = handleUrgency (out); }
else if (cmd.command == "_query") { rc = handleQuery (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 == "" && else if (cmd.command == "" &&
sequence.size ()) { rc = handleModify (out); } sequence.size ()) { rc = handleModify (out); }

View file

@ -618,6 +618,199 @@ int handleCompletionIDs (std::string& outs)
return 0; return 0;
} }
////////////////////////////////////////////////////////////////////////////////
int handleZshCompletionIDs (std::string& outs)
{
std::vector <Task> 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 <std::string> 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 () void handleUndo ()
{ {
@ -2739,3 +2932,4 @@ int deltaSubstitutions (Task& task)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// vim: ts=2 sw=2 et

View file

@ -69,6 +69,8 @@ int handleCompletionConfig (std::string&);
int handleCompletionVersion (std::string&); int handleCompletionVersion (std::string&);
int handleUrgency (std::string&); int handleUrgency (std::string&);
int handleQuery (std::string&); int handleQuery (std::string&);
int handleZshCompletionCommands (std::string&);
int handleZshCompletionIDs (std::string&);
int handleVersion (std::string&); int handleVersion (std::string&);
int handleConfig (std::string&); int handleConfig (std::string&);
int handleShow (std::string&); int handleShow (std::string&);