package main import ( "os" "os/exec" ) // InputFromEditor retrieves user input by opening an editor on a temporary // file. Once the editor closes, the contents of the temporary file are // returned. If the contents exactly match the placeholder (no edits to the // file were made), then an empty string is returned. // Example patten: message.*.md func InputFromEditor(placeholder string, pattern string) (string, error) { msgFile, _ := os.CreateTemp("/tmp", pattern) defer os.Remove(msgFile.Name()) os.WriteFile(msgFile.Name(), []byte(placeholder), os.ModeAppend) editor := os.Getenv("EDITOR") if editor == "" { editor = "vim" // default to vim if no EDITOR env variable } execCmd := exec.Command(editor, msgFile.Name()) execCmd.Stdin = os.Stdin execCmd.Stdout = os.Stdout execCmd.Stderr = os.Stderr if err := execCmd.Run(); err != nil { return "", err } bytes, _ := os.ReadFile(msgFile.Name()) content := string(bytes) if content == placeholder { return "", nil } return content, nil }