diff --git a/internal/backend/backend.go b/internal/backend/backend.go index 661861a..c6e3efc 100644 --- a/internal/backend/backend.go +++ b/internal/backend/backend.go @@ -132,9 +132,10 @@ func (b Backend) DownloadItem(feedName string, index int) tea.Cmd { // Close closes the backend and saves its components. func (b Backend) Close() error { - if err := b.Rss.Save(); err != nil { - return fmt.Errorf("backend.Close: %w", err) - } + // Can't do in nix + // if err := b.Rss.Save(); err != nil { + // return fmt.Errorf("backend.Close: %w", err) + // } if err := b.Cache.Save(); err != nil { return fmt.Errorf("backend.Close: %w", err) diff --git a/internal/ui/browser/browser.go b/internal/ui/browser/browser.go index 437e6e7..d2682b6 100644 --- a/internal/ui/browser/browser.go +++ b/internal/ui/browser/browser.go @@ -33,20 +33,20 @@ type Keymap struct { // DefaultKeymap contains the default key bindings for the browser var DefaultKeymap = Keymap{ CloseTab: key.NewBinding( - key.WithKeys("c", "ctrl+w"), - key.WithHelp("c", "Close tab"), + key.WithKeys("x", "ctrl+w", "q"), + key.WithHelp("x", "Close tab"), ), NextTab: key.NewBinding( key.WithKeys("tab"), key.WithHelp("Tab", "Next tab"), ), PrevTab: key.NewBinding( - key.WithKeys("shift+tab"), + key.WithKeys("shift+tab", "h"), key.WithHelp("Shift+Tab", "Previous tab"), ), ShowHelp: key.NewBinding( - key.WithKeys("h", "ctrl+h"), - key.WithHelp("h", "Help"), + key.WithKeys("?", "ctrl+h"), + key.WithHelp("?", "Help"), ), ToggleOfflineMode: key.NewBinding( key.WithKeys("o", "ctrl+o"), diff --git a/internal/ui/simplelist/list.go b/internal/ui/simplelist/list.go index 476ad90..9ddb272 100644 --- a/internal/ui/simplelist/list.go +++ b/internal/ui/simplelist/list.go @@ -135,11 +135,11 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { m.page++ } - case "shift+up", "K": + case "shift+up", "gg": m.selected = 0 m.page = 0 - case "shift+down", "J": + case "shift+down", "shift+g": m.selected = len(m.items) - 1 m.page = len(m.items) / m.itemsPerPage } diff --git a/internal/ui/tab/feed/feed.go b/internal/ui/tab/feed/feed.go index ad2b95f..1e918bb 100644 --- a/internal/ui/tab/feed/feed.go +++ b/internal/ui/tab/feed/feed.go @@ -210,6 +210,12 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.viewport.SetContent(m.selector.cycle()) return m, nil + case key.Matches(msg, m.keymap.CycleSelectionBack): + if !m.viewportFocused { + return m, nil + } + + m.viewport.SetContent(m.selector.cycle_back()) } default: diff --git a/internal/ui/tab/feed/keymap.go b/internal/ui/tab/feed/keymap.go index 6f4dd7f..cd5170e 100644 --- a/internal/ui/tab/feed/keymap.go +++ b/internal/ui/tab/feed/keymap.go @@ -4,13 +4,14 @@ import "github.com/charmbracelet/bubbles/key" // Keymap contains the key bindings for this tab type Keymap struct { - Open key.Binding - ToggleFocus key.Binding - RefreshArticles key.Binding - SaveArticle key.Binding - DeleteFromSaved key.Binding - CycleSelection key.Binding - MarkAsUnread key.Binding + Open key.Binding + ToggleFocus key.Binding + RefreshArticles key.Binding + SaveArticle key.Binding + DeleteFromSaved key.Binding + CycleSelection key.Binding + CycleSelectionBack key.Binding + MarkAsUnread key.Binding } // DefaultKeymap contains the default key bindings for this tab @@ -36,8 +37,12 @@ var DefaultKeymap = Keymap{ key.WithHelp("d/ctrl+d", "Delete from saved"), ), CycleSelection: key.NewBinding( - key.WithKeys("g"), - key.WithHelp("g", "Cycle selection"), + key.WithKeys("n"), + key.WithHelp("n", "Cycle selection"), + ), + CycleSelectionBack: key.NewBinding( + key.WithKeys("shift+n"), + key.WithHelp("shift+n", "Cycle selection"), ), MarkAsUnread: key.NewBinding( key.WithKeys("u"), @@ -53,5 +58,6 @@ func (m *Keymap) SetEnabled(enabled bool) { m.SaveArticle.SetEnabled(enabled) m.DeleteFromSaved.SetEnabled(enabled) m.CycleSelection.SetEnabled(enabled) + m.CycleSelectionBack.SetEnabled(enabled) m.MarkAsUnread.SetEnabled(enabled) } diff --git a/internal/ui/tab/feed/selector.go b/internal/ui/tab/feed/selector.go index fb2ef72..a0b138a 100644 --- a/internal/ui/tab/feed/selector.go +++ b/internal/ui/tab/feed/selector.go @@ -120,6 +120,35 @@ func (s *selector) cycle() string { return b.String() } +func (s *selector) cycle_back() string { + var b strings.Builder + + s.selection-- + if !s.active || s.selection < 0 { + s.selection = len(s.urls) - 1 + s.active = true + } + + start, end := s.indices[s.selection][0], s.indices[s.selection][1] + b.WriteString((*s.article)[:start]) + linkText := (*s.article)[start:end] + + // This is tricky + if strings.ContainsRune(linkText, '\n') { + newLine := strings.IndexRune(linkText, '\n') + lastSpace := strings.LastIndex(linkText, " ") + + b.WriteString(s.linkStyle.Render(strings.TrimSpace(linkText[:lastSpace]))) + b.WriteString(linkText[newLine:lastSpace]) + b.WriteString(s.linkStyle.Render(linkText[lastSpace:])) + } else { + b.WriteString(s.linkStyle.Render(linkText)) + } + + b.WriteString((*s.article)[end:]) + return b.String() +} + // open opens the URL in the browser func (s *selector) open() error { switch runtime.GOOS {