From e2ac04dbfdfc5851f721291398905d598cdeb666 Mon Sep 17 00:00:00 2001 From: ayntgl <90600421+ayntgl@users.noreply.github.com> Date: Mon, 24 Jan 2022 19:30:10 +0000 Subject: [PATCH] Add support for external editor to write messages (#118) --- config/mod.go | 4 ++++ ui/handlers.go | 50 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/config/mod.go b/config/mod.go index 69ef5f7..a09776c 100644 --- a/config/mod.go +++ b/config/mod.go @@ -21,6 +21,8 @@ type KeybindingsConfig struct { FocusMessageInputField string `json:"focusMessageInputField"` FocusMessageActionsList string `json:"focusMessageActionsList"` + OpenEditor string `json:"open_editor"` + SelectPreviousMessage string `json:"selectPreviousMessage"` SelectNextMessage string `json:"selectNextMessage"` SelectFirstMessage string `json:"selectFirstMessage"` @@ -79,6 +81,8 @@ func newDefaultConfig() Config { FocusMessageInputField: "Alt+Rune[i]", FocusMessageActionsList: "Alt+Rune[a]", + OpenEditor: "Alt+Rune[e]", + SelectPreviousMessage: "Up", SelectNextMessage: "Down", SelectFirstMessage: "Home", diff --git a/ui/handlers.go b/ui/handlers.go index 142b9ec..5249a11 100644 --- a/ui/handlers.go +++ b/ui/handlers.go @@ -1,6 +1,9 @@ package ui import ( + "io" + "os" + "os/exec" "sort" "strings" @@ -273,13 +276,8 @@ func onMessageActionsListSelected(app *App, mainText string, m *discordgo.Messag } func onMessageInputFieldInputCapture(app *App, e *tcell.EventKey) *tcell.EventKey { - // The default global navigation shortcut for guilds list is Alt+. - if e.Modifiers() == tcell.ModAlt { - return nil - } - - switch e.Key() { - case tcell.KeyEnter: + switch e.Name() { + case "Enter": if app.SelectedChannel == nil { return nil } @@ -314,18 +312,52 @@ func onMessageInputFieldInputCapture(app *App, e *tcell.EventKey) *tcell.EventKe app.MessageInputField.SetText("") return nil - case tcell.KeyCtrlV: + case "Ctrl+V": text, _ := clipboard.ReadAll() text = app.MessageInputField.GetText() + text app.MessageInputField.SetText(text) return nil - case tcell.KeyEscape: + case "Escape": app.MessageInputField.SetText("") app.MessageInputField.SetTitle("") app.SelectedMessage = -1 app.MessagesTextView.Highlight() return nil + case app.Config.Keybindings.OpenEditor: + e := os.Getenv("EDITOR") + if e == "" { + return nil + } + + f, err := os.CreateTemp(os.TempDir(), "discordo-*.md") + if err != nil { + return nil + } + defer os.Remove(f.Name()) + + cmd := exec.Command(e, f.Name()) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + + app.Suspend(func() { + err = cmd.Run() + if err != nil { + return + } + }) + + b, err := io.ReadAll(f) + if err != nil { + return nil + } + + app.MessageInputField.SetText(string(b)) + } + + // The default global navigation shortcuts include Alt as the mod key. + if e.Modifiers() == tcell.ModAlt { + return nil } return e