Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .diffium/keybindings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"quit": ["ctrl+c", "q"],
"help": ["h"],
"commit": ["c"],
"uncommit": ["u"],
"branch_switch": ["b"],
"pull": ["p"],
"reset": ["R"],
"search": ["/"],
"refresh": ["r"],
"side_by_side": ["s"],
"toggle_wrap": ["w"],
"toggle_diff_mode": ["t"],
"navigate_up": ["k", "up"],
"navigate_down": ["j", "down"],
"navigate_page_up": ["K", "pgup"],
"navigate_page_down": ["J", "pgdown"]
}
94 changes: 94 additions & 0 deletions internal/config/keybindings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package config

import (
"encoding/json"
"fmt"
"os"
"path/filepath"
)

// KeyBindings stores all customizable key bindings
type KeyBindings struct {
Quit []string `json:"quit"`
Help []string `json:"help"`
Commit []string `json:"commit"`
Uncommit []string `json:"uncommit"`
BranchSwitch []string `json:"branch_switch"`
Pull []string `json:"pull"`
Reset []string `json:"reset"`
Search []string `json:"search"`
Refresh []string `json:"refresh"`
SideBySide []string `json:"side_by_side"`
ToggleWrap []string `json:"toggle_wrap"`
ToggleDiffMode []string `json:"toggle_diff_mode"`
NavigateUp []string `json:"navigate_up"`
NavigateDown []string `json:"navigate_down"`
NavigatePageUp []string `json:"navigate_page_up"`
NavigatePageDown []string `json:"navigate_page_down"`
}

// DefaultKeyBindings returns the default key bindings
func DefaultKeyBindings() KeyBindings {
return KeyBindings{
Quit: []string{"ctrl+c", "q"},
Help: []string{"h"},
Commit: []string{"c"},
Uncommit: []string{"u"},
BranchSwitch: []string{"b"},
Pull: []string{"p"},
Reset: []string{"R"},
Search: []string{"/"},
Refresh: []string{"r"},
SideBySide: []string{"s"},
ToggleWrap: []string{"w"},
ToggleDiffMode: []string{"t"},
NavigateUp: []string{"k", "up"},
NavigateDown: []string{"j", "down"},
NavigatePageUp: []string{"K", "pgup"},
NavigatePageDown: []string{"J", "pgdown"},
}
}

// LoadKeyBindings loads key bindings
func LoadKeyBindings(configDir string) (KeyBindings, error) {
configPath := filepath.Join(configDir, "keybindings.json")

if _, err := os.Stat(configPath); os.IsNotExist(err) {
kb := DefaultKeyBindings()
if err := SaveKeyBindings(configDir, kb); err != nil {
return kb, fmt.Errorf("failed to save default config: %w", err)
}
return kb, nil
}

data, err := os.ReadFile(configPath)
if err != nil {
return DefaultKeyBindings(), fmt.Errorf("failed to read config: %w", err)
}

var kb KeyBindings
if err := json.Unmarshal(data, &kb); err != nil {
return DefaultKeyBindings(), fmt.Errorf("failed to parse config: %w", err)
}

return kb, nil
}

// SaveKeyBindings
func SaveKeyBindings(configDir string, kb KeyBindings) error {
if err := os.MkdirAll(configDir, 0755); err != nil {
return fmt.Errorf("failed to create config directory: %w", err)
}

data, err := json.MarshalIndent(kb, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal config: %w", err)
}

configPath := filepath.Join(configDir, "keybindings.json")
if err := os.WriteFile(configPath, data, 0644); err != nil {
return fmt.Errorf("failed to write config: %w", err)
}

return nil
}
11 changes: 11 additions & 0 deletions internal/prefs/prefs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package prefs

import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
)
Expand All @@ -17,6 +19,15 @@ type Prefs struct {
LeftSet bool
}

// GetConfigDir returns the path to the diffium config directory
func GetConfigDir() (string, error) {
configDir, err := os.UserConfigDir()
if err != nil {
return "", fmt.Errorf("failed to get config directory: %w", err)
}
return filepath.Join(configDir, "diffium"), nil
}

const (
keyWrap = "diffium.wrap"
keySideBySide = "diffium.sideBySide"
Expand Down
11 changes: 11 additions & 0 deletions internal/tui/keys.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package tui

// contains checks if a key string is in a slice of key bindings
func contains(keys []string, key string) bool {
for _, k := range keys {
if k == key {
return true
}
}
return false
}
Loading
Loading