func newEvalerAndStore() (*eval.Evaler, *store.Store) { dataDir, err := store.EnsureDataDir() if err != nil { fmt.Fprintln(os.Stderr, "Warning: cannot create data dir ~/.elvish") } var st *store.Store if err == nil { st, err = store.NewStore(dataDir) if err != nil { fmt.Fprintln(os.Stderr, "Warning: cannot connect to store:", err) } } return eval.NewEvaler(st, dataDir), st }
// TODO(xiaq): Currently only the editor deals with signals. func interact() { ev, st := newEvalerAndStore() datadir, err := store.EnsureDataDir() printError(err) if err == nil { // XXX vs, err := ev.Source(datadir + "/rc.elv") if err != nil && !os.IsNotExist(err) { printError(err) } eval.PrintExituses(vs) } cmdNum := 0 username := "******" user, err := user.Current() if err == nil { username = user.Username } hostname, err := os.Hostname() if err != nil { hostname = "???" } rpromptStr := username + "@" + hostname sigch := make(chan os.Signal, sigchSize) signal.Notify(sigch) defer signal.Stop(sigch) ed := edit.NewEditor(os.Stdin, sigch, st) for { cmdNum++ name := fmt.Sprintf("<tty %d>", cmdNum) prompt := func() string { return sysutil.Getwd() + "> " } rprompt := func() string { return rpromptStr } lr := ed.ReadLine(prompt, rprompt) if lr.EOF { break } else if lr.Err != nil { fmt.Println("Editor error:", lr.Err) fmt.Println("My pid is", os.Getpid()) } n, err := parse.Parse(name, lr.Line) printError(err) if err == nil { vs, err := ev.Eval(name, lr.Line, ".", n) printError(err) eval.PrintExituses(vs) } } }