mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 23:28:02 +00:00
75 lines
2.1 KiB
Markdown
75 lines
2.1 KiB
Markdown
# Create Interactive Picker For Set Of Subtasks
|
||
|
||
For [my TIL repo](https://github.com/jbranchaud/til), I have a `Taskfile.yml`
|
||
that defines a set of `notes:*` tasks for interacting with a `NOTES.md` file
|
||
that lives in a private Git submodule.
|
||
|
||
I wanted to make it easier on myself to not have to remember all the different
|
||
`notes` subtasks, so I created a helper task to make it easy to see the options
|
||
and run one.
|
||
|
||
A summary of the Taskfile is shown below including the entirety of the `notes`
|
||
task. That task will parse a listing of the available tasks (via `task --list`
|
||
and some `sed` commands) and pass those to `fzf` to provide an interactive
|
||
picker of the available subtasks.
|
||
|
||
```yaml
|
||
tasks:
|
||
notes:
|
||
desc: Interactive picker for notes tasks
|
||
cmds:
|
||
- |
|
||
TASK=$(task --list | grep "^\* notes:" | sed 's/^\* notes://' | sed 's/\s\+/ - /' | fzf --prompt="Select notes task: " --height=40% --reverse) || true
|
||
if [ -n "$TASK" ]; then
|
||
TASK_NAME=$(echo "$TASK" | awk '{print $1}' | sed 's/:$//')
|
||
task notes:$TASK_NAME
|
||
fi
|
||
interactive: true
|
||
silent: true
|
||
|
||
notes:edit:
|
||
...
|
||
|
||
notes:sync:
|
||
...
|
||
|
||
notes:open:
|
||
...
|
||
|
||
notes:push:
|
||
...
|
||
|
||
notes:status:
|
||
...
|
||
|
||
notes:pull:
|
||
...
|
||
|
||
notes:diff:
|
||
...
|
||
|
||
notes:log:
|
||
...
|
||
```
|
||
|
||
Now I can run the `notes` task to get a summary and interactive picker that
|
||
looks like the following:
|
||
|
||
```sh
|
||
❯ task notes
|
||
Select notes task:
|
||
9/9
|
||
> │ Interactive picker for notes tasks
|
||
diff: Show uncommitted changes in notes
|
||
edit: All-in-one edit, commit, and push notes
|
||
log: Show recent commit history for notes
|
||
open: Opens NOTES.md (syncs latest changes first) in default editor
|
||
pull: Pull latest changes (alias for sync)
|
||
push: Commit and push changes to notes submodule
|
||
status: Check status of notes submodule
|
||
sync: Sync latest changes from the notes submodule
|
||
```
|
||
|
||
It pulls in the subtask name and description. I can then use `fzf`'s navigation
|
||
and filtering to narrow down and select the task I want to run.
|