From dc1a6e83669dd22be4542833970d3251741ba1f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20B=C3=BCtow?= <1224732+snonux@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:39:56 +0300 Subject: Fix add task hotkey --- go.mod | 1 + go.sum | 2 ++ internal/task/task.go | 23 +++++++++++++++++++++-- internal/ui/table.go | 2 +- internal/ui/table_test.go | 4 ++-- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 9086482..d05118a 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/term v0.2.1 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect diff --git a/go.sum b/go.sum index c89ca1f..5375c80 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= diff --git a/internal/task/task.go b/internal/task/task.go index 603002d..b20eef0 100644 --- a/internal/task/task.go +++ b/internal/task/task.go @@ -12,6 +12,8 @@ import ( "strconv" "strings" "time" + + "github.com/google/shlex" ) // Task represents a taskwarrior task as returned by `task export`. @@ -54,7 +56,7 @@ func SetDebugLog(path string) error { // Add creates a new task with the given description and tags. func Add(description string, tags []string) error { - args := []string{"add"} + var args []string for _, t := range tags { if len(t) > 0 && t[0] != '+' { t = "+" + t @@ -62,11 +64,28 @@ func Add(description string, tags []string) error { args = append(args, t) } args = append(args, description) + return AddArgs(args) +} - cmd := exec.Command("task", args...) +// AddArgs runs "task add" with the provided arguments. Each element in args +// is passed as a separate command-line argument, allowing the caller to +// specify additional modifiers like due dates or tags. +func AddArgs(args []string) error { + cmd := exec.Command("task", append([]string{"add"}, args...)...) return cmd.Run() } +// AddLine splits the given line into shell words and runs "task add" with the +// resulting arguments. This allows users to pass raw Taskwarrior parameters +// such as "due:today" directly. +func AddLine(line string) error { + fields, err := shlex.Split(line) + if err != nil { + return err + } + return AddArgs(fields) +} + // Export retrieves all tasks using `task export rc.json.array=off` and parses // the JSON output into a slice of Task structs. // Export retrieves tasks using `task export rc.json.array=off` and parses diff --git a/internal/ui/table.go b/internal/ui/table.go index 482d89e..c3e1748 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -484,7 +484,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { for _, tsk := range m.tasks { oldIDs[tsk.ID] = struct{}{} } - task.Add(m.addInput.Value(), nil) + task.AddLine(m.addInput.Value()) m.addingTask = false m.addInput.Blur() m.reload() diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index f378973..365180c 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -476,7 +476,7 @@ func TestAddHotkey(t *testing.T) { mv, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'+'}}) m = mv.(Model) - for _, r := range "task" { + for _, r := range "foo due:today" { mv, _ = m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{r}}) m = mv.(Model) } @@ -488,7 +488,7 @@ func TestAddHotkey(t *testing.T) { t.Fatalf("read add: %v", err) } - if strings.TrimSpace(string(data)) != "add task" { + if strings.TrimSpace(string(data)) != "add foo due:today" { t.Fatalf("add not called: %q", data) } } -- cgit v1.2.3