4 Commits

Author SHA1 Message Date
049998c235 docs: update README.md and remove CONFIG.md 2025-10-04 17:02:21 +02:00
Guillaume Archambault
5986659048 Merge pull request #11 from qingfengzxr/main
feat: add configurable key bindings with ESC quit disable option
2025-10-04 17:00:56 +02:00
Guillaume Archambault
abbda54125 Merge pull request #12 from ldreux/support-subsearch
feat: support multiple words search
2025-10-04 16:24:06 +02:00
Loïc Dreux
986017a552 feat: support multiple words search 2025-10-01 12:07:05 +02:00
3 changed files with 65 additions and 72 deletions

View File

@@ -1,66 +0,0 @@
# SSHM Configuration
SSHM supports configurable key bindings through a configuration file located at:
- Linux/macOS: `~/.config/sshm/config.json`
- Windows: `%APPDATA%\sshm\config.json`
## Configuration Options
### Key Bindings
The key bindings section allows you to customize how you exit the application.
#### Example Configuration
```json
{
"key_bindings": {
"quit_keys": ["q", "ctrl+c"],
"disable_esc_quit": true
}
}
```
#### Options
- **quit_keys**: Array of keys that will quit the application. Default: `["q", "ctrl+c"]`
- **disable_esc_quit**: Boolean flag to disable ESC key from quitting the application. Default: `false`
## For Vim Users
If you're a vim user and frequently press ESC accidentally causing the application to quit, set `disable_esc_quit` to `true`:
```json
{
"key_bindings": {
"quit_keys": ["q", "ctrl+c"],
"disable_esc_quit": true
}
}
```
With this configuration:
- ESC will no longer quit the application
- You can still quit using 'q' or Ctrl+C
- All other functionality remains the same
## Default Configuration
If no configuration file exists, SSHM will create one with these defaults:
```json
{
"key_bindings": {
"quit_keys": ["q", "ctrl+c"],
"disable_esc_quit": false
}
}
```
This ensures backward compatibility - ESC will continue to work as a quit key by default.
## Configuration Location
The configuration file will be automatically created when you first run SSHM. You can manually edit it to customize the key bindings to your preference.
If you encounter any issues with the configuration file, you can delete it and SSHM will recreate it with default settings on the next run.

View File

@@ -553,6 +553,34 @@ This will be automatically converted to:
StrictHostKeyChecking no StrictHostKeyChecking no
``` ```
### Custom Key Bindings
SSHM supports customizable key bindings through a configuration file. This is particularly useful for users who want to modify the default quit behavior.
**Configuration File Location:**
- **Linux/macOS**: `~/.config/sshm/config.json`
- **Windows**: `%APPDATA%\sshm\config.json`
**Example Configuration:**
```json
{
"key_bindings": {
"quit_keys": ["q", "ctrl+c"],
"disable_esc_quit": true
}
}
```
**Available Options:**
- **quit_keys**: Array of keys that will quit the application. Default: `["q", "ctrl+c"]`
- **disable_esc_quit**: Boolean flag to disable ESC key from quitting the application. Default: `false`
**For Vim Users:**
If you frequently press ESC accidentally causing the application to quit, set `disable_esc_quit` to `true`. This will disable ESC as a quit key while preserving all other functionality.
**Default Configuration:**
If no configuration file exists, SSHM will automatically create one with default settings that maintain backward compatibility.
## 🛠️ Development ## 🛠️ Development
### Prerequisites ### Prerequisites
@@ -669,6 +697,8 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
- [Charm](https://charm.sh/) for the amazing TUI libraries - [Charm](https://charm.sh/) for the amazing TUI libraries
- [Cobra](https://cobra.dev/) for the excellent CLI framework - [Cobra](https://cobra.dev/) for the excellent CLI framework
- [@yimeng](https://github.com/yimeng) for contributing SSH Include directive support - [@yimeng](https://github.com/yimeng) for contributing SSH Include directive support
- [@ldreux](https://github.com/ldreux) for contributing multi-word search functionality
- [@qingfengzxr](https://github.com/qingfengzxr) for contributing custom key bindings support
- The Go community for building such fantastic tools - The Go community for building such fantastic tools
--- ---

View File

@@ -37,35 +37,64 @@ func sortHostsByName(hosts []config.SSHHost) []config.SSHHost {
// filterHosts filters hosts according to the search query (name or tags) // filterHosts filters hosts according to the search query (name or tags)
func (m Model) filterHosts(query string) []config.SSHHost { func (m Model) filterHosts(query string) []config.SSHHost {
subqueries := strings.Split(query, " ")
subqueriesLength := len(subqueries)
subfilteredHosts := make([][]config.SSHHost, subqueriesLength)
for i, subquery := range subqueries {
subfilteredHosts[i] = m.filterHostsByWord(subquery)
}
// return the intersection of search results
result := make([]config.SSHHost, 0)
tempMap := map[string]int{}
for _, hosts := range subfilteredHosts {
for _, host := range hosts {
if _, ok := tempMap[host.Name]; !ok {
tempMap[host.Name] = 1
} else {
tempMap[host.Name] = tempMap[host.Name] + 1
}
if tempMap[host.Name] == subqueriesLength {
result = append(result, host)
}
}
}
return result
}
// filterHostsByWord filters hosts according to a single word
func (m Model) filterHostsByWord(word string) []config.SSHHost {
var filtered []config.SSHHost var filtered []config.SSHHost
if query == "" { if word == "" {
filtered = m.hosts filtered = m.hosts
} else { } else {
query = strings.ToLower(query) word = strings.ToLower(word)
for _, host := range m.hosts { for _, host := range m.hosts {
// Check the hostname // Check the hostname
if strings.Contains(strings.ToLower(host.Name), query) { if strings.Contains(strings.ToLower(host.Name), word) {
filtered = append(filtered, host) filtered = append(filtered, host)
continue continue
} }
// Check the hostname // Check the hostname
if strings.Contains(strings.ToLower(host.Hostname), query) { if strings.Contains(strings.ToLower(host.Hostname), word) {
filtered = append(filtered, host) filtered = append(filtered, host)
continue continue
} }
// Check the user // Check the user
if strings.Contains(strings.ToLower(host.User), query) { if strings.Contains(strings.ToLower(host.User), word) {
filtered = append(filtered, host) filtered = append(filtered, host)
continue continue
} }
// Check the tags // Check the tags
for _, tag := range host.Tags { for _, tag := range host.Tags {
if strings.Contains(strings.ToLower(tag), query) { if strings.Contains(strings.ToLower(tag), word) {
filtered = append(filtered, host) filtered = append(filtered, host)
break break
} }