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())