package cmd import ( "context" "flag" "os" "os/exec" "github.com/AlecAivazis/survey/v2" "github.com/peterbourgon/ff/v3/ffcli" ) func (h *Handler) IDE() *ffcli.Command { fs := flag.NewFlagSet("ide", flag.ContinueOnError) guiFlag := fs.Bool("gui", false, "Prefer GUI editor") fs.BoolVar(guiFlag, "g", *guiFlag, "--gui") return &ffcli.Command{ Name: "ide", FlagSet: fs, ShortUsage: "ide ", ShortHelp: "ide starts an IDE for `branch`", Exec: func(ctx context.Context, args []string) error { if err := h.checkInit(); err != nil { return err } var branch string if len(args) > 0 { branch = args[0] } else { opts, err := h.Config.Branches() if err != nil { return err } if err := survey.AskOne(&survey.Select{ Message: "Branch to open", Options: opts, }, &branch); err != nil { return err } } path := h.Config.WorkspaceBranch(branch) cmd := exec.Command(getIDE(*guiFlag), path) cmd.Dir = path cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() }, } } func getIDE(preferGUI bool) string { term := []string{ "hx", "nvim", } gui := []string{ "lapce", "goland", } def := []string{ "vi", } ides := append(term, gui...) if preferGUI { ides = append(gui, term...) } for _, ide := range append(ides, def...) { if i, err := exec.LookPath(ide); err == nil { return i } } return os.Getenv("EDITOR") }