From 945f8821e510360b4022ac66fece18f3e31bea16 Mon Sep 17 00:00:00 2001 From: c4lliope Date: Sat, 10 May 2025 14:56:02 -0400 Subject: [PATCH] [keybind][pend] `e` opens post body in editor. --- internal/commands/commands.go | 32 ++++++++++++++++++++++++++++++++ internal/commands/key.go | 14 ++++++++++++-- internal/commands/list.go | 14 ++++++++++++++ internal/commands/viewport.go | 10 ++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/internal/commands/commands.go b/internal/commands/commands.go index cf7e794..02a48ca 100644 --- a/internal/commands/commands.go +++ b/internal/commands/commands.go @@ -41,6 +41,38 @@ func convertItems(its []store.Item) []list.Item { return items } +func (c Commands) OpenBody(url string) tea.Cmd { + // for _, o := range c.config.Openers { + // match, err := regexp.MatchString(o.Regex, url) + // if err != nil { + // return tea.Quit + // } + + // if match { + // c := fmt.Sprintf(o.Cmd, url) + // parts := strings.Fields(c) + // cmd := exec.Command(parts[0], parts[1:]...) + + // if o.Takeover { + // return tea.ExecProcess(cmd, func(err error) tea.Msg { + // log.Println("OpenLink: takeover exec:", err) + // return nil + // }) + // } else { + // if err := cmd.Run(); err != nil { + // log.Println("OpenLink: exec: ", err) + // return tea.Quit + // } + // return nil + // } + // } + // } + + // c.OpenInBrowser(url) + + return nil +} + func (c Commands) OpenLink(url string) tea.Cmd { for _, o := range c.config.Openers { match, err := regexp.MatchString(o.Regex, url) diff --git a/internal/commands/key.go b/internal/commands/key.go index 6d8468d..440f789 100644 --- a/internal/commands/key.go +++ b/internal/commands/key.go @@ -15,6 +15,7 @@ type ListKeyMapT struct { MarkAllRead key.Binding ToggleFavourites key.Binding Refresh key.Binding + OpenInEditor key.Binding OpenInBrowser key.Binding Sort key.Binding oQuit key.Binding @@ -31,6 +32,7 @@ type ListKeyMapT struct { type ViewportKeyMapT struct { Quit key.Binding Escape key.Binding + OpenInEditor key.Binding OpenInBrowser key.Binding Favourite key.Binding Read key.Binding @@ -73,6 +75,10 @@ var ListKeyMap = ListKeyMapT{ key.WithKeys("r"), key.WithHelp("r", "refresh"), ), + OpenInEditor: key.NewBinding( + key.WithKeys("e"), + key.WithHelp("e", "open in $EDITOR"), + ), OpenInBrowser: key.NewBinding( key.WithKeys("o"), key.WithHelp("o", "open in browser"), @@ -138,6 +144,10 @@ var ViewportKeyMap = ViewportKeyMapT{ key.WithKeys("ctrl+z"), key.WithHelp("ctrl+z", "suspend"), ), + OpenInEditor: key.NewBinding( + key.WithKeys("e"), + key.WithHelp("e", "open in $EDITOR"), + ), OpenInBrowser: key.NewBinding( key.WithKeys("o"), key.WithHelp("o", "open in browser"), @@ -174,7 +184,7 @@ func (k ViewportKeyMapT) FullHelp() [][]key.Binding { return [][]key.Binding{ {v.Up, v.Down, v.HalfPageUp, v.HalfPageDown}, {k.GotoStart, k.GotoEnd, v.PageUp, v.PageDown}, - {k.Next, k.Prev, k.OpenInBrowser, k.Favourite, k.Read}, + {k.Next, k.Prev, k.OpenInEditor, k.OpenInBrowser, k.Favourite, k.Read}, {k.Escape, k.Quit, k.CloseFullHelp}, } } @@ -191,7 +201,7 @@ func (k ViewportKeyMapT) ShortHelp() []key.Binding { func (k ListKeyMapT) FullHelp() []key.Binding { return []key.Binding{ k.Open, k.Read, k.Favourite, k.Refresh, - k.OpenInBrowser, k.Sort, k.ToggleFavourites, k.ToggleReads, + k.OpenInEditor, k.OpenInBrowser, k.Sort, k.ToggleFavourites, k.ToggleReads, k.MarkAllRead, k.EditConfig, } } diff --git a/internal/commands/list.go b/internal/commands/list.go index 967e7c3..cc86dfb 100644 --- a/internal/commands/list.go +++ b/internal/commands/list.go @@ -252,6 +252,20 @@ func updateList(msg tea.Msg, m model) (tea.Model, tea.Cmd) { m.commands.config.ToggleShowFavourites() cmds = append(cmds, m.UpdateList()) + case key.Matches(msg, ViewportKeyMap.OpenInEditor): + if m.list.SettingFilter() { + break + } + + item := m.list.SelectedItem() + if item == nil { + return m, m.list.NewStatusMessage("No link selected.") + } + + current := item.(TUIItem) + cmd = m.commands.OpenBody(current.URL) + cmds = append(cmds, cmd) + case key.Matches(msg, ViewportKeyMap.OpenInBrowser): if m.list.SettingFilter() { break diff --git a/internal/commands/viewport.go b/internal/commands/viewport.go index 3e6e045..dc46378 100644 --- a/internal/commands/viewport.go +++ b/internal/commands/viewport.go @@ -39,6 +39,16 @@ func updateViewport(msg tea.Msg, m model) (tea.Model, tea.Cmd) { m.selectedArticle = nil cmds = append(cmds, m.UpdateList()) + case key.Matches(msg, ViewportKeyMap.OpenInEditor): + current, err := m.commands.store.GetItemByID(*m.selectedArticle) + if err != nil { + return m, nil + } + + it := ItemToTUIItem(current) + cmd = m.commands.OpenBody(it.URL) + cmds = append(cmds, cmd) + case key.Matches(msg, ViewportKeyMap.OpenInBrowser): current, err := m.commands.store.GetItemByID(*m.selectedArticle) if err != nil {