From 0dbe115864ad9b3bd11bce641ede46c47d52b052 Mon Sep 17 00:00:00 2001 From: Ayyan Date: Sun, 25 Jan 2026 21:03:03 -0500 Subject: [PATCH] refactor(config)!: rename keys table to keybinds (#725) --- internal/app/app.go | 2 +- internal/config/config.go | 4 +- internal/config/config.toml | 38 ++++++------ internal/config/keybinds.go | 89 +++++++++++++++++++++++++++++ internal/config/keys.go | 87 ---------------------------- internal/ui/chat/channels_picker.go | 12 ++-- internal/ui/chat/guilds_tree.go | 16 +++--- internal/ui/chat/message_input.go | 20 +++---- internal/ui/chat/messages_list.go | 48 ++++++++-------- internal/ui/chat/view.go | 16 +++--- 10 files changed, 167 insertions(+), 165 deletions(-) create mode 100644 internal/config/keybinds.go delete mode 100644 internal/config/keys.go diff --git a/internal/app/app.go b/internal/app/app.go index 4af58ef..75442ec 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -101,7 +101,7 @@ func (a *App) quit() { func (a *App) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case a.cfg.Keys.Quit: + case a.cfg.Keybinds.Quit: a.quit() return nil case "Ctrl+C": diff --git a/internal/config/config.go b/internal/config/config.go index 26e7c49..28ce225 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -78,8 +78,8 @@ type ( Icons Icons `toml:"icons"` - Keys Keys `toml:"keys"` - Theme Theme `toml:"theme"` + Keybinds Keybinds `toml:"keybinds"` + Theme Theme `toml:"theme"` } ) diff --git a/internal/config/config.toml b/internal/config/config.toml index 7aeb0ad..1acb756 100644 --- a/internal/config/config.toml +++ b/internal/config/config.toml @@ -4,7 +4,7 @@ auto_focus = true # Whether to enable mouse or not. mouse = true -# The program to open when the `keys.message_input.editor` keymap is pressed. Set the value to `"default"` to use `$EDITOR`. +# The program to open when the `message_input.editor` keybind is pressed. Set the value to `"default"` to use `$EDITOR`. editor = "default" # "default" (unknown), "online", "dnd", "idle", "invisible", "offline" @@ -59,7 +59,7 @@ guild_store = "s-" # Global shortcuts # Esc: Reset message selection or close the channel selection popup. -[keys] +[keybinds] focus_guilds_tree = "Ctrl+G" focus_messages_list = "Ctrl+T" focus_message_input = "Ctrl+I" @@ -73,7 +73,7 @@ quit = "Ctrl+C" # Requires re-login upon restart. logout = "Ctrl+D" -[keys.picker] +[keybinds.picker] toggle = "Ctrl+K" cancel = "Esc" up = "Ctrl+P" @@ -83,11 +83,11 @@ bottom = "End" select = "Enter" # Only while focusing on the guilds tree -[keys.guilds_tree] -select_previous = "Rune[k]" -select_next = "Rune[j]" -select_first = "Rune[g]" -select_last = "Rune[G]" +[keybinds.guilds_tree] +up = "Rune[k]" +down = "Rune[j]" +top = "Rune[g]" +bottom = "Rune[G]" # Select the currently highlighted text-based channel or expand a guild or channel. select_current = "Enter" yank_id = "Rune[i]" @@ -95,11 +95,11 @@ collapse_parent_node = "Rune[-]" move_to_parent_node = "Rune[p]" # Only while focusing on sent messages -[keys.messages_list] -select_previous = "Rune[k]" -select_next = "Rune[j]" -select_first = "Rune[g]" -select_last = "Rune[G]" +[keybinds.messages_list] +select_up = "Rune[k]" +select_down = "Rune[j]" +select_top = "Rune[g]" +select_bottom = "Rune[G]" # Scroll the messages list without changing the selection. scroll_up = "Rune[K]" scroll_down = "Rune[J]" @@ -125,7 +125,7 @@ yank_id = "Rune[i]" # Only while typing a message # Alt+Enter: Insert a new line to the current text. -[keys.message_input] +[keybinds.message_input] # paste from clipboard (supports both text and images) paste = "Ctrl+V" send = "Enter" @@ -137,11 +137,11 @@ tab_complete = "Tab" open_editor = "Ctrl+E" open_file_picker = "Ctrl+Rune[\\]" -[keys.mentions_list] -select_previous = "Ctrl+P" -select_next = "Ctrl+N" -select_first = "Home" -select_last = "End" +[keybinds.mentions_list] +up = "Ctrl+P" +down = "Ctrl+N" +top = "Home" +bottom = "End" # style = { foreground = "", background = "", attributes = "" or [""] } [theme.title] diff --git a/internal/config/keybinds.go b/internal/config/keybinds.go new file mode 100644 index 0000000..0a27806 --- /dev/null +++ b/internal/config/keybinds.go @@ -0,0 +1,89 @@ +package config + +type NavigationKeybinds struct { + Up string `toml:"up"` + Down string `toml:"down"` + Top string `toml:"top"` + Bottom string `toml:"bottom"` +} + +type ScrollKeybinds struct { + ScrollUp string `toml:"scroll_up"` + ScrollDown string `toml:"scroll_down"` + ScrollTop string `toml:"scroll_top"` + ScrollBottom string `toml:"scroll_bottom"` +} + +type SelectionKeybinds struct { + SelectUp string `toml:"select_up"` + SelectDown string `toml:"select_down"` + SelectTop string `toml:"select_top"` + SelectBottom string `toml:"select_bottom"` +} + +type PickerKeybinds struct { + NavigationKeybinds + Toggle string `toml:"toggle"` + Cancel string `toml:"cancel"` + Select string `toml:"select"` +} + +type GuildsTreeKeybinds struct { + NavigationKeybinds + SelectCurrent string `toml:"select_current"` + YankID string `toml:"yank_id"` + + CollapseParentNode string `toml:"collapse_parent_node"` + MoveToParentNode string `toml:"move_to_parent_node"` +} + +type MessagesListKeybinds struct { + SelectionKeybinds + ScrollKeybinds + + SelectReply string `toml:"select_reply"` + Reply string `toml:"reply"` + ReplyMention string `toml:"reply_mention"` + + Cancel string `toml:"cancel"` + Edit string `toml:"edit"` + Delete string `toml:"delete"` + DeleteConfirm string `toml:"delete_confirm"` + Open string `toml:"open"` + + YankContent string `toml:"yank_content"` + YankURL string `toml:"yank_url"` + YankID string `toml:"yank_id"` +} + +type MessageInputKeybinds struct { + Paste string `toml:"paste"` + Send string `toml:"send"` + Cancel string `toml:"cancel"` + TabComplete string `toml:"tab_complete"` + + OpenEditor string `toml:"open_editor"` + OpenFilePicker string `toml:"open_file_picker"` +} + +type MentionsListKeybinds struct { + NavigationKeybinds +} + +type Keybinds struct { + FocusGuildsTree string `toml:"focus_guilds_tree"` + FocusMessagesList string `toml:"focus_messages_list"` + FocusMessageInput string `toml:"focus_message_input"` + FocusPrevious string `toml:"focus_previous"` + FocusNext string `toml:"focus_next"` + ToggleGuildsTree string `toml:"toggle_guilds_tree"` + + Picker PickerKeybinds `toml:"picker"` + GuildsTree GuildsTreeKeybinds `toml:"guilds_tree"` + MessagesList MessagesListKeybinds `toml:"messages_list"` + MessageInput MessageInputKeybinds `toml:"message_input"` + MentionsList MentionsListKeybinds `toml:"mentions_list"` + + Logout string `toml:"logout"` + Quit string `toml:"quit"` +} diff --git a/internal/config/keys.go b/internal/config/keys.go deleted file mode 100644 index 4c1e586..0000000 --- a/internal/config/keys.go +++ /dev/null @@ -1,87 +0,0 @@ -package config - -type ( - SelectionKeys struct { - SelectPrevious string `toml:"select_previous"` - SelectNext string `toml:"select_next"` - SelectFirst string `toml:"select_first"` - SelectLast string `toml:"select_last"` - } - - GuildsTreeKeys struct { - SelectionKeys - SelectCurrent string `toml:"select_current"` - YankID string `toml:"yank_id"` - - CollapseParentNode string `toml:"collapse_parent_node"` - MoveToParentNode string `toml:"move_to_parent_node"` - } - - MessagesListKeys struct { - SelectionKeys - ScrollUp string `toml:"scroll_up"` - ScrollDown string `toml:"scroll_down"` - ScrollTop string `toml:"scroll_top"` - ScrollBottom string `toml:"scroll_bottom"` - - SelectReply string `toml:"select_reply"` - Reply string `toml:"reply"` - ReplyMention string `toml:"reply_mention"` - - Cancel string `toml:"cancel"` - Edit string `toml:"edit"` - Delete string `toml:"delete"` - DeleteConfirm string `toml:"delete_confirm"` - Open string `toml:"open"` - - YankContent string `toml:"yank_content"` - YankURL string `toml:"yank_url"` - YankID string `toml:"yank_id"` - } - - MessageInputKeys struct { - Paste string `toml:"paste"` - Send string `toml:"send"` - Cancel string `toml:"cancel"` - TabComplete string `toml:"tab_complete"` - - OpenEditor string `toml:"open_editor"` - OpenFilePicker string `toml:"open_file_picker"` - } - - MentionsListKeys struct { - SelectionKeys - } - - NavigationKeys struct { - Up string `toml:"up"` - Down string `toml:"down"` - Top string `toml:"top"` - Bottom string `toml:"bottom"` - } - - PickerKeys struct { - Toggle string `toml:"toggle"` - Cancel string `toml:"cancel"` - NavigationKeys - Select string `toml:"select"` - } - - Keys struct { - FocusGuildsTree string `toml:"focus_guilds_tree"` - FocusMessagesList string `toml:"focus_messages_list"` - FocusMessageInput string `toml:"focus_message_input"` - FocusPrevious string `toml:"focus_previous"` - FocusNext string `toml:"focus_next"` - ToggleGuildsTree string `toml:"toggle_guilds_tree"` - - Picker PickerKeys `toml:"picker"` - GuildsTree GuildsTreeKeys `toml:"guilds_tree"` - MessagesList MessagesListKeys `toml:"messages_list"` - MessageInput MessageInputKeys `toml:"message_input"` - MentionsList MentionsListKeys `toml:"mentions_list"` - - Logout string `toml:"logout"` - Quit string `toml:"quit"` - } -) diff --git a/internal/ui/chat/channels_picker.go b/internal/ui/chat/channels_picker.go index a249e9b..d25cbe0 100644 --- a/internal/ui/chat/channels_picker.go +++ b/internal/ui/chat/channels_picker.go @@ -31,12 +31,12 @@ func newChannelsPicker(cfg *config.Config, chatView *View) *channelsPicker { cp.SetSelectedFunc(cp.onSelected) cp.SetTitle("Channels") cp.SetKeyMap(&picker.KeyMap{ - Cancel: cfg.Keys.Picker.Cancel, - Up: cfg.Keys.Picker.Up, - Down: cfg.Keys.Picker.Down, - Top: cfg.Keys.Picker.Top, - Bottom: cfg.Keys.Picker.Bottom, - Select: cfg.Keys.Picker.Select, + Cancel: cfg.Keybinds.Picker.Cancel, + Up: cfg.Keybinds.Picker.Up, + Down: cfg.Keybinds.Picker.Down, + Top: cfg.Keybinds.Picker.Top, + Bottom: cfg.Keybinds.Picker.Bottom, + Select: cfg.Keybinds.Picker.Select, }) return cp } diff --git a/internal/ui/chat/guilds_tree.go b/internal/ui/chat/guilds_tree.go index 95269ff..bc6f555 100644 --- a/internal/ui/chat/guilds_tree.go +++ b/internal/ui/chat/guilds_tree.go @@ -256,27 +256,27 @@ func (gt *guildsTree) collapseParentNode(node *tview.TreeNode) { func (gt *guildsTree) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case gt.cfg.Keys.GuildsTree.CollapseParentNode: + case gt.cfg.Keybinds.GuildsTree.CollapseParentNode: gt.collapseParentNode(gt.GetCurrentNode()) return nil - case gt.cfg.Keys.GuildsTree.MoveToParentNode: + case gt.cfg.Keybinds.GuildsTree.MoveToParentNode: return tcell.NewEventKey(tcell.KeyRune, "K", tcell.ModNone) - case gt.cfg.Keys.GuildsTree.SelectPrevious: + case gt.cfg.Keybinds.GuildsTree.Up: return tcell.NewEventKey(tcell.KeyUp, "", tcell.ModNone) - case gt.cfg.Keys.GuildsTree.SelectNext: + case gt.cfg.Keybinds.GuildsTree.Down: return tcell.NewEventKey(tcell.KeyDown, "", tcell.ModNone) - case gt.cfg.Keys.GuildsTree.SelectFirst: + case gt.cfg.Keybinds.GuildsTree.Top: gt.Move(gt.GetRowCount() * -1) // return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone) - case gt.cfg.Keys.GuildsTree.SelectLast: + case gt.cfg.Keybinds.GuildsTree.Bottom: gt.Move(gt.GetRowCount()) // return tcell.NewEventKey(tcell.KeyEnd, 0, tcell.ModNone) - case gt.cfg.Keys.GuildsTree.SelectCurrent: + case gt.cfg.Keybinds.GuildsTree.SelectCurrent: return tcell.NewEventKey(tcell.KeyEnter, "", tcell.ModNone) - case gt.cfg.Keys.GuildsTree.YankID: + case gt.cfg.Keybinds.GuildsTree.YankID: gt.yankID() } diff --git a/internal/ui/chat/message_input.go b/internal/ui/chat/message_input.go index 79625e6..8a47277 100644 --- a/internal/ui/chat/message_input.go +++ b/internal/ui/chat/message_input.go @@ -102,11 +102,11 @@ func (mi *messageInput) stopTypingTimer() { func (mi *messageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case mi.cfg.Keys.MessageInput.Paste: + case mi.cfg.Keybinds.MessageInput.Paste: mi.paste() return tcell.NewEventKey(tcell.KeyCtrlV, "", tcell.ModNone) - case mi.cfg.Keys.MessageInput.Send: + case mi.cfg.Keybinds.MessageInput.Send: if mi.chatView.GetVisibile(mentionsListPageName) { mi.tabComplete() return nil @@ -114,15 +114,15 @@ func (mi *messageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey { mi.send() return nil - case mi.cfg.Keys.MessageInput.OpenEditor: + case mi.cfg.Keybinds.MessageInput.OpenEditor: mi.stopTabCompletion() mi.editor() return nil - case mi.cfg.Keys.MessageInput.OpenFilePicker: + case mi.cfg.Keybinds.MessageInput.OpenFilePicker: mi.stopTabCompletion() mi.openFilePicker() return nil - case mi.cfg.Keys.MessageInput.Cancel: + case mi.cfg.Keybinds.MessageInput.Cancel: if mi.chatView.GetVisibile(mentionsListPageName) { mi.stopTabCompletion() } else { @@ -130,7 +130,7 @@ func (mi *messageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey { } return nil - case mi.cfg.Keys.MessageInput.TabComplete: + case mi.cfg.Keybinds.MessageInput.TabComplete: go mi.chatView.app.QueueUpdateDraw(func() { mi.tabComplete() }) return nil default: @@ -151,16 +151,16 @@ func (mi *messageInput) onInputCapture(event *tcell.EventKey) *tcell.EventKey { if mi.chatView.GetVisibile(mentionsListPageName) { handler := mi.mentionsList.InputHandler() switch event.Name() { - case mi.cfg.Keys.MentionsList.SelectPrevious: + case mi.cfg.Keybinds.MentionsList.Up: handler(tcell.NewEventKey(tcell.KeyUp, "", tcell.ModNone), nil) return nil - case mi.cfg.Keys.MentionsList.SelectNext: + case mi.cfg.Keybinds.MentionsList.Down: handler(tcell.NewEventKey(tcell.KeyDown, "", tcell.ModNone), nil) return nil - case mi.cfg.Keys.MentionsList.SelectFirst: + case mi.cfg.Keybinds.MentionsList.Top: handler(tcell.NewEventKey(tcell.KeyHome, "", tcell.ModNone), nil) return nil - case mi.cfg.Keys.MentionsList.SelectLast: + case mi.cfg.Keybinds.MentionsList.Bottom: handler(tcell.NewEventKey(tcell.KeyEnd, "", tcell.ModNone), nil) return nil } diff --git a/internal/ui/chat/messages_list.go b/internal/ui/chat/messages_list.go index d6a6080..038d4bd 100644 --- a/internal/ui/chat/messages_list.go +++ b/internal/ui/chat/messages_list.go @@ -288,51 +288,51 @@ func (ml *messagesList) selectedMessage() (*discord.Message, error) { func (ml *messagesList) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case ml.cfg.Keys.MessagesList.ScrollUp: + case ml.cfg.Keybinds.MessagesList.ScrollUp: ml.ScrollUp() return nil - case ml.cfg.Keys.MessagesList.ScrollDown: + case ml.cfg.Keybinds.MessagesList.ScrollDown: ml.ScrollDown() return nil - case ml.cfg.Keys.MessagesList.ScrollTop: + case ml.cfg.Keybinds.MessagesList.ScrollTop: ml.ScrollToStart() return nil - case ml.cfg.Keys.MessagesList.ScrollBottom: + case ml.cfg.Keybinds.MessagesList.ScrollBottom: ml.ScrollToEnd() return nil - case ml.cfg.Keys.MessagesList.Cancel: + case ml.cfg.Keybinds.MessagesList.Cancel: ml.clearSelection() return nil - case ml.cfg.Keys.MessagesList.SelectPrevious, ml.cfg.Keys.MessagesList.SelectNext, ml.cfg.Keys.MessagesList.SelectFirst, ml.cfg.Keys.MessagesList.SelectLast, ml.cfg.Keys.MessagesList.SelectReply: + case ml.cfg.Keybinds.MessagesList.SelectUp, ml.cfg.Keybinds.MessagesList.SelectDown, ml.cfg.Keybinds.MessagesList.SelectTop, ml.cfg.Keybinds.MessagesList.SelectBottom, ml.cfg.Keybinds.MessagesList.SelectReply: ml._select(event.Name()) return nil - case ml.cfg.Keys.MessagesList.YankID: + case ml.cfg.Keybinds.MessagesList.YankID: ml.yankID() return nil - case ml.cfg.Keys.MessagesList.YankContent: + case ml.cfg.Keybinds.MessagesList.YankContent: ml.yankContent() return nil - case ml.cfg.Keys.MessagesList.YankURL: + case ml.cfg.Keybinds.MessagesList.YankURL: ml.yankURL() return nil - case ml.cfg.Keys.MessagesList.Open: + case ml.cfg.Keybinds.MessagesList.Open: ml.open() return nil - case ml.cfg.Keys.MessagesList.Reply: + case ml.cfg.Keybinds.MessagesList.Reply: ml.reply(false) return nil - case ml.cfg.Keys.MessagesList.ReplyMention: + case ml.cfg.Keybinds.MessagesList.ReplyMention: ml.reply(true) return nil - case ml.cfg.Keys.MessagesList.Edit: + case ml.cfg.Keybinds.MessagesList.Edit: ml.edit() return nil - case ml.cfg.Keys.MessagesList.Delete: + case ml.cfg.Keybinds.MessagesList.Delete: ml.delete() return nil - case ml.cfg.Keys.MessagesList.DeleteConfirm: + case ml.cfg.Keybinds.MessagesList.DeleteConfirm: ml.confirmDelete() return nil } @@ -349,7 +349,7 @@ func (ml *messagesList) _select(name string) { cursor := ml.Cursor() switch name { - case ml.cfg.Keys.MessagesList.SelectPrevious: + case ml.cfg.Keybinds.MessagesList.SelectUp: switch { case cursor == -1: cursor = len(messages) - 1 @@ -383,18 +383,18 @@ func (ml *messagesList) _select(name string) { ml.messages = slices.Concat(older, ml.messages) cursor = len(messages) - 1 } - case ml.cfg.Keys.MessagesList.SelectNext: + case ml.cfg.Keybinds.MessagesList.SelectDown: switch { case cursor == -1: cursor = len(messages) - 1 case cursor < len(messages)-1: cursor++ } - case ml.cfg.Keys.MessagesList.SelectFirst: + case ml.cfg.Keybinds.MessagesList.SelectTop: cursor = 0 - case ml.cfg.Keys.MessagesList.SelectLast: + case ml.cfg.Keybinds.MessagesList.SelectBottom: cursor = len(messages) - 1 - case ml.cfg.Keys.MessagesList.SelectReply: + case ml.cfg.Keybinds.MessagesList.SelectReply: if cursor == -1 || cursor >= len(messages) { return } @@ -509,13 +509,13 @@ func (ml *messagesList) showAttachmentsList(urls []string, attachments []discord list. SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case ml.cfg.Keys.MessagesList.SelectPrevious: + case ml.cfg.Keybinds.MessagesList.SelectUp: return tcell.NewEventKey(tcell.KeyUp, "", tcell.ModNone) - case ml.cfg.Keys.MessagesList.SelectNext: + case ml.cfg.Keybinds.MessagesList.SelectDown: return tcell.NewEventKey(tcell.KeyDown, "", tcell.ModNone) - case ml.cfg.Keys.MessagesList.SelectFirst: + case ml.cfg.Keybinds.MessagesList.SelectTop: return tcell.NewEventKey(tcell.KeyHome, "", tcell.ModNone) - case ml.cfg.Keys.MessagesList.SelectLast: + case ml.cfg.Keybinds.MessagesList.SelectBottom: return tcell.NewEventKey(tcell.KeyEnd, "", tcell.ModNone) } diff --git a/internal/ui/chat/view.go b/internal/ui/chat/view.go index 5bd478d..b91728b 100644 --- a/internal/ui/chat/view.go +++ b/internal/ui/chat/view.go @@ -181,24 +181,24 @@ func (v *View) focusNext() { func (v *View) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case v.cfg.Keys.FocusGuildsTree: + case v.cfg.Keybinds.FocusGuildsTree: v.messageInput.removeMentionsList() v.focusGuildsTree() return nil - case v.cfg.Keys.FocusMessagesList: + case v.cfg.Keybinds.FocusMessagesList: v.messageInput.removeMentionsList() v.app.SetFocus(v.messagesList) return nil - case v.cfg.Keys.FocusMessageInput: + case v.cfg.Keybinds.FocusMessageInput: v.focusMessageInput() return nil - case v.cfg.Keys.FocusPrevious: + case v.cfg.Keybinds.FocusPrevious: v.focusPrevious() return nil - case v.cfg.Keys.FocusNext: + case v.cfg.Keybinds.FocusNext: v.focusNext() return nil - case v.cfg.Keys.Logout: + case v.cfg.Keybinds.Logout: if v.onLogout != nil { v.onLogout() } @@ -209,10 +209,10 @@ func (v *View) onInputCapture(event *tcell.EventKey) *tcell.EventKey { } return nil - case v.cfg.Keys.ToggleGuildsTree: + case v.cfg.Keybinds.ToggleGuildsTree: v.toggleGuildsTree() return nil - case v.cfg.Keys.Picker.Toggle: + case v.cfg.Keybinds.Picker.Toggle: v.togglePicker() return nil }