From c1e31290accc5b4c57c766b810f757e6758c8bbf Mon Sep 17 00:00:00 2001 From: Robin Tuszik Date: Wed, 3 Sep 2025 09:22:58 +0200 Subject: [PATCH] feat: add 'j' and 'k' as keybindings for navigation (#9) --- README.md | 32 ++++++++++++++++---------------- internal/adapters/ui/handlers.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 69d15e6..3517768 100644 --- a/README.md +++ b/README.md @@ -138,22 +138,22 @@ make run ## ⌨️ Key Bindings -| Key | Action | -|---|---| -| / | Toggle search bar | -| ↑/↓ | Navigate servers | -| Enter | SSH into selected server | -| c | Copy SSH command to clipboard | -| g | Ping selected server | -| r | Refresh background data | -| a | Add server | -| e | Edit server | -| t | Edit tags | -| d | Delete server | -| p | Pin/Unpin server | -| s | Toggle sort field | -| S | Reverse sort order | -| q | Quit | +| Key | Action | +| ----- | ----------------------------- | +| / | Toggle search bar | +| ↑↓/jk | Navigate servers | +| Enter | SSH into selected server | +| c | Copy SSH command to clipboard | +| g | Ping selected server | +| r | Refresh background data | +| a | Add server | +| e | Edit server | +| t | Edit tags | +| d | Delete server | +| p | Pin/Unpin server | +| s | Toggle sort field | +| S | Reverse sort order | +| q | Quit | Tip: The hint bar at the top of the list shows the most useful shortcuts. diff --git a/internal/adapters/ui/handlers.go b/internal/adapters/ui/handlers.go index 830a9d3..bfce7b2 100644 --- a/internal/adapters/ui/handlers.go +++ b/internal/adapters/ui/handlers.go @@ -72,6 +72,12 @@ func (t *tui) handleGlobalKeys(event *tcell.EventKey) *tcell.EventKey { case 't': t.handleTagsEdit() return nil + case 'j': + t.handleNavigateDown() + return nil + case 'k': + t.handleNavigateUp() + return nil } if event.Key() == tcell.KeyEnter { @@ -125,6 +131,29 @@ func (t *tui) handleTagsEdit() { } } +func (t *tui) handleNavigateDown() { + if t.app.GetFocus() == t.serverList { + currentIdx := t.serverList.GetCurrentItem() + itemCount := t.serverList.GetItemCount() + if currentIdx < itemCount-1 { + t.serverList.SetCurrentItem(currentIdx + 1) + } else { + t.serverList.SetCurrentItem(0) + } + } +} + +func (t *tui) handleNavigateUp() { + if t.app.GetFocus() == t.serverList { + currentIdx := t.serverList.GetCurrentItem() + if currentIdx > 0 { + t.serverList.SetCurrentItem(currentIdx - 1) + } else { + t.serverList.SetCurrentItem(t.serverList.GetItemCount() - 1) + } + } +} + func (t *tui) handleSearchInput(query string) { filtered, _ := t.serverService.ListServers(query) sortServersForUI(filtered, t.sortMode)