From bd66da130e2c2e3efb422fc969cdc293c91c9e87 Mon Sep 17 00:00:00 2001 From: Gu1llaum-3 Date: Thu, 9 Jul 2026 12:06:32 +0200 Subject: [PATCH] feat: focus search bar on startup by default The search input is now focused when the TUI opens, so filtering works immediately without an extra keystroke. This is especially helpful with many hosts. Removes the now-redundant -s/--search flag and updates the docs. --- README.md | 2 +- cmd/root.go | 6 +----- internal/ui/tui.go | 15 +++++++-------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 254bd73..aedf400 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ sshm - `f` - Port forwarding setup - `H` - Toggle hidden hosts visibility - `q` - Quit -- `/` - Search/filter hosts +- `/` - Focus the search bar (already focused at startup; press `Enter` to jump back to the host list) **Real-time Status Indicators:** - 🟢 **Online** - Host is reachable via SSH diff --git a/cmd/root.go b/cmd/root.go index 25fa3d1..2278c5a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -24,9 +24,6 @@ var configFile string // forceTTY forces pseudo-TTY allocation for remote commands var forceTTY bool -// searchMode enables the focus on search mode at startup -var searchMode bool - // noUpdateCheck disables the async update check in the TUI var noUpdateCheck bool @@ -145,7 +142,7 @@ func runInteractiveMode() { } // Run the interactive TUI - if err := ui.RunInteractiveMode(hosts, configFile, searchMode, AppVersion, noUpdateCheck); err != nil { + if err := ui.RunInteractiveMode(hosts, configFile, AppVersion, noUpdateCheck); err != nil { log.Fatalf("Error running interactive mode: %v", err) } } @@ -244,7 +241,6 @@ func Execute() { func init() { RootCmd.PersistentFlags().StringVarP(&configFile, "config", "c", "", "SSH config file to use (default: ~/.ssh/config)") RootCmd.Flags().BoolVarP(&forceTTY, "tty", "t", false, "Force pseudo-TTY allocation (useful for interactive remote commands)") - RootCmd.PersistentFlags().BoolVarP(&searchMode, "search", "s", false, "Focus on search input at startup") RootCmd.PersistentFlags().BoolVar(&noUpdateCheck, "no-update-check", false, "Disable automatic update check") RootCmd.SetVersionTemplate("{{.Name}} version {{.Version}}\n") diff --git a/internal/ui/tui.go b/internal/ui/tui.go index ed2b22d..e5fd3b6 100644 --- a/internal/ui/tui.go +++ b/internal/ui/tui.go @@ -15,8 +15,9 @@ import ( "github.com/charmbracelet/lipgloss" ) -// NewModel creates a new TUI model with the given SSH hosts -func NewModel(hosts []config.SSHHost, configFile string, searchMode bool, currentVersion string, noUpdateCheck bool) Model { +// NewModel creates a new TUI model with the given SSH hosts. +// The search input is focused at startup so users can filter hosts right away. +func NewModel(hosts []config.SSHHost, configFile string, currentVersion string, noUpdateCheck bool) Model { // Load application configuration appConfig, err := config.LoadAppConfig() if err != nil { @@ -60,7 +61,7 @@ func NewModel(hosts []config.SSHHost, configFile string, searchMode bool, curren height: 24, ready: false, viewMode: ViewList, - searchMode: searchMode, + searchMode: true, } // Apply visibility filter (showHidden is false by default) @@ -75,9 +76,7 @@ func NewModel(hosts []config.SSHHost, configFile string, searchMode bool, curren ti.Placeholder = "Search hosts or tags..." ti.CharLimit = 50 ti.Width = 25 - if searchMode { - ti.Focus() - } + ti.Focus() // Use dynamic column width calculation (will fallback to static if width not available) nameWidth, hostnameWidth, tagsWidth, lastLoginWidth := m.calculateDynamicColumnWidths(sortedHosts) @@ -161,8 +160,8 @@ func NewModel(hosts []config.SSHHost, configFile string, searchMode bool, curren } // RunInteractiveMode starts the interactive TUI interface -func RunInteractiveMode(hosts []config.SSHHost, configFile string, searchMode bool, currentVersion string, noUpdateCheck bool) error { - m := NewModel(hosts, configFile, searchMode, currentVersion, noUpdateCheck) +func RunInteractiveMode(hosts []config.SSHHost, configFile string, currentVersion string, noUpdateCheck bool) error { + m := NewModel(hosts, configFile, currentVersion, noUpdateCheck) // Start the application in alt screen mode for clean output p := tea.NewProgram(m, tea.WithAltScreen())