fix: use line numbers to prevent deleting all duplicate SSH hosts when removing one

This commit is contained in:
2026-01-04 21:34:09 +01:00
parent def2b4fa8d
commit 8f780e288c
4 changed files with 71 additions and 25 deletions

View File

@@ -74,14 +74,14 @@ type Model struct {
filteredHosts []config.SSHHost
searchMode bool
deleteMode bool
deleteHost string
deleteHost *config.SSHHost // Host to be deleted (with line number for precise targeting)
historyManager *history.HistoryManager
pingManager *connectivity.PingManager
sortMode SortMode
configFile string // Path to the SSH config file
// Application configuration
appConfig *config.AppConfig
appConfig *config.AppConfig
// Version update information
updateInfo *version.UpdateInfo

View File

@@ -452,7 +452,7 @@ func (m Model) handleListViewKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
if m.deleteMode {
// Exit delete mode
m.deleteMode = false
m.deleteHost = ""
m.deleteHost = nil
m.table.Focus()
return m, nil
}
@@ -508,15 +508,13 @@ func (m Model) handleListViewKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
} else if m.deleteMode {
// Confirm deletion
var err error
if m.configFile != "" {
err = config.DeleteSSHHostFromFile(m.deleteHost, m.configFile)
} else {
err = config.DeleteSSHHost(m.deleteHost)
if m.deleteHost != nil {
err = config.DeleteSSHHostWithLine(*m.deleteHost)
}
if err != nil {
// Could display an error message here
m.deleteMode = false
m.deleteHost = ""
m.deleteHost = nil
m.table.Focus()
return m, nil
}
@@ -533,7 +531,7 @@ func (m Model) handleListViewKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
if parseErr != nil {
// Could display an error message here
m.deleteMode = false
m.deleteHost = ""
m.deleteHost = nil
m.table.Focus()
return m, nil
}
@@ -548,7 +546,7 @@ func (m Model) handleListViewKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
m.updateTableRows()
m.deleteMode = false
m.deleteHost = ""
m.deleteHost = nil
m.table.Focus()
return m, nil
} else {
@@ -673,11 +671,13 @@ func (m Model) handleListViewKeys(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
case "d":
if !m.searchMode && !m.deleteMode {
// Delete the selected host
selected := m.table.SelectedRow()
if len(selected) > 0 {
hostName := extractHostNameFromTableRow(selected[0]) // Extract hostname from first column
cursor := m.table.Cursor()
if cursor >= 0 && cursor < len(m.filteredHosts) {
// Get the host at the cursor position (which corresponds to filteredHosts index)
targetHost := &m.filteredHosts[cursor]
m.deleteMode = true
m.deleteHost = hostName
m.deleteHost = targetHost
m.table.Blur()
return m, nil
}

View File

@@ -144,7 +144,11 @@ func (m Model) renderListView() string {
func (m Model) renderDeleteConfirmation() string {
// Remove emojis (uncertain width depending on terminal) to stabilize the frame
title := "DELETE SSH HOST"
question := fmt.Sprintf("Are you sure you want to delete host '%s'?", m.deleteHost)
hostName := ""
if m.deleteHost != nil {
hostName = m.deleteHost.Name
}
question := fmt.Sprintf("Are you sure you want to delete host '%s'?", hostName)
action := "This action cannot be undone."
help := "Enter: confirm • Esc: cancel"