closes #67 So I made an auto-exec confg `auto-exec = true` (e32c0ba6ed69f3c764353e58b8fbacf160f37d5a) which means: - If you want your command in the prompt to be executed right away, you can set this = false (for example, you are typing `nvim ~/.conf` but IRIS is suggesting `nvim ~/.config`, it will ignore the suggestion and exec what you are typing, this is current default behavior) - If you want to auto execute full command which is being suggested, you can set this = true (this is the opposite of above, when you are typing `nvim ~/.conf` but IRIS is suggesting `nvim ~/.config`, it will auto exec `nvim ~/.config` instead, but sometime you want to exec what you are typing instead of the suggestion right?, just press esc or shift tab to hide the menu and it will) --- Select keybinding to replace tab (0dc01cba8c610e8d6fd8c50f6a71bdcc061a098f) `select = "ctrl+y"` Some users may love nvim keybinding or emacs, so I bring navigation keybinding to be configurable (0dc01cba8c610e8d6fd8c50f6a71bdcc061a098f) ``` navigate-up = "ctrl+k" navigate-down = "ctrl+j" ``` --- I also added a option for UI width (dfa3b810a7be406fe4652b3886020f37bb166811) `max-width = 80` - If you configure `max-width` to be larger than the actual width of the current terminal, Iris will automatically "compress" the window to match the terminal's width (meaning it will never overflow and break the interface) - If you configure `max-width` too small (e.g 10), the interface will have cramped text, making it look very bad. So, I've set a minimum safe min limit of 40. If the configured value is smaller than this, Iris will automatically use 40 Small note: If you set `max-width = 0` (or leave it blank), it will automatically use Iris's default standard size of 76. SO you can confidently customize it without fear of breaking the UI (I hope so lmao) --- Added a fallback to ensure Iris never crashes or loses shortcuts if the user accidentally deletes keybinding configuration lines or intentionally assigns empty strings " " (f682c9bf623f3ed46ad0763221145604dbd91b07) Fix typo `toggle_mode` to `toggle-mode` (b39be6673e552735fa65a6c9807510c83b4d9cdd) if you have a better config design, please tell me, I always listen to your idea
79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package config
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// MatchKey matches a sequence of terminal bytes against a configured key string.
|
|
// Key strings can be e.g. "ctrl+r", "tab", "shift+tab", "right".
|
|
// Returns matched=true if the byte sequence matches the configured key, and consumed=number of bytes to consume.
|
|
func MatchKey(input []byte, expected string) (matched bool, consumed int) {
|
|
if len(input) == 0 {
|
|
return false, 0
|
|
}
|
|
|
|
expected = strings.ToLower(strings.TrimSpace(expected))
|
|
expected = strings.TrimPrefix(expected, "<")
|
|
expected = strings.TrimSuffix(expected, ">")
|
|
|
|
if strings.HasPrefix(expected, "ctrl+") && len(expected) == 6 {
|
|
char := expected[5]
|
|
if char >= 'a' && char <= 'z' {
|
|
targetByte := char - 'a' + 1
|
|
if input[0] == targetByte {
|
|
return true, 1
|
|
}
|
|
}
|
|
}
|
|
|
|
switch expected {
|
|
case "ctrl+space":
|
|
if input[0] == 0x00 {
|
|
return true, 1
|
|
}
|
|
case "tab":
|
|
if input[0] == 0x09 {
|
|
return true, 1
|
|
}
|
|
case "shift+tab":
|
|
// typically \033[Z
|
|
if len(input) >= 3 && input[0] == 0x1b && input[1] == '[' && input[2] == 'Z' {
|
|
return true, 3
|
|
}
|
|
case "up":
|
|
if len(input) >= 3 && input[0] == 0x1b && (input[1] == '[' || input[1] == 'O') && input[2] == 'A' {
|
|
return true, 3
|
|
}
|
|
case "down":
|
|
if len(input) >= 3 && input[0] == 0x1b && (input[1] == '[' || input[1] == 'O') && input[2] == 'B' {
|
|
return true, 3
|
|
}
|
|
case "right":
|
|
// typically \033[C or \033OC
|
|
if len(input) >= 3 && input[0] == 0x1b && (input[1] == '[' || input[1] == 'O') && input[2] == 'C' {
|
|
return true, 3
|
|
}
|
|
case "left":
|
|
if len(input) >= 3 && input[0] == 0x1b && (input[1] == '[' || input[1] == 'O') && input[2] == 'D' {
|
|
return true, 3
|
|
}
|
|
case "enter", "cr", "return":
|
|
if input[0] == 0x0d || input[0] == 0x0a {
|
|
return true, 1
|
|
}
|
|
}
|
|
|
|
return false, 0
|
|
}
|
|
|
|
// FormatKeyName takes a config key string like "ctrl+r" and formats it for UI display, e.g. "<Ctrl+R>".
|
|
func FormatKeyName(key string) string {
|
|
parts := strings.Split(key, "+")
|
|
for i, p := range parts {
|
|
if len(p) > 0 {
|
|
parts[i] = strings.ToUpper(p[:1]) + strings.ToLower(p[1:])
|
|
}
|
|
}
|
|
return "<" + strings.Join(parts, "+") + ">"
|
|
}
|