Przeglądaj źródła

feat: Improve editor detection with auto-discovery and better error messages (#3155)

Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: rekram1-node <[email protected]>
Affaan Mustafa 4 miesięcy temu
rodzic
commit
8db5951287

+ 4 - 5
packages/tui/internal/tui/tui.go

@@ -1158,9 +1158,9 @@ func (a Model) executeCommand(command commands.Command) (tea.Model, tea.Cmd) {
 			// status.Warn("Agent is working, please wait...")
 			return a, nil
 		}
-		editor := os.Getenv("EDITOR")
+		editor := util.GetEditor()
 		if editor == "" {
-			return a, toast.NewErrorToast("No EDITOR set, can't open editor")
+			return a, toast.NewErrorToast("No editor found. Set EDITOR environment variable (e.g., export EDITOR=vim)")
 		}
 
 		value := a.editor.Value()
@@ -1404,10 +1404,9 @@ func (a Model) executeCommand(command commands.Command) (tea.Model, tea.Cmd) {
 		// Format to Markdown
 		markdownContent := formatConversationToMarkdown(messages)
 
-		// Check if EDITOR is set
-		editor := os.Getenv("EDITOR")
+		editor := util.GetEditor()
 		if editor == "" {
-			return a, toast.NewErrorToast("No EDITOR set, can't open editor")
+			return a, toast.NewErrorToast("No editor found. Set EDITOR environment variable (e.g., export EDITOR=vim)")
 		}
 
 		// Create and write to temp file

+ 24 - 0
packages/tui/internal/util/util.go

@@ -3,6 +3,8 @@ package util
 import (
 	"log/slog"
 	"os"
+	"os/exec"
+	"runtime"
 	"strings"
 	"time"
 
@@ -45,3 +47,25 @@ func Measure(tag string) func(...any) {
 		slog.Debug(tag, args...)
 	}
 }
+
+func GetEditor() string {
+	if editor := os.Getenv("VISUAL"); editor != "" {
+		return editor
+	}
+	if editor := os.Getenv("EDITOR"); editor != "" {
+		return editor
+	}
+
+	commonEditors := []string{"vim", "nvim", "zed", "code", "cursor", "vi", "nano"}
+	if runtime.GOOS == "windows" {
+		commonEditors = []string{"vim", "nvim", "zed", "code.cmd", "cursor.cmd", "notepad.exe", "vi", "nano"}
+	}
+
+	for _, editor := range commonEditors {
+		if _, err := exec.LookPath(editor); err == nil {
+			return editor
+		}
+	}
+
+	return ""
+}