func (fac FnAsArgCompleter) Complete(words []string, ed *Editor) ([]*candidate, error) { in, err := makeClosedStdin() if err != nil { return nil, err } ports := []*eval.Port{in, &eval.Port{File: os.Stdout}, &eval.Port{File: os.Stderr}} wordValues := make([]eval.Value, len(words)) for i, word := range words { wordValues[i] = eval.String(word) } // XXX There is no source to pass to NewTopEvalCtx. ec := eval.NewTopEvalCtx(ed.evaler, "[editor completer]", "", ports) values, err := ec.PCaptureOutput(fac.Fn, wordValues) if err != nil { ed.notify("completer error: %v", err) return nil, err } cands := make([]*candidate, len(values)) for i, v := range values { s := eval.ToString(v) cands[i] = &candidate{text: s} } return cands, nil }
func (hv History) IndexOne(idx eval.Value) eval.Value { hv.mutex.RLock() defer hv.mutex.RUnlock() slice, i, j := eval.ParseAndFixListIndex(eval.ToString(idx), hv.Len()) if slice { cmds, err := hv.st.Cmds(i+1, j+1) maybeThrow(err) vs := make([]eval.Value, len(cmds)) for i := range cmds { vs[i] = eval.String(cmds[i]) } return eval.NewList(vs...) } s, err := hv.st.Cmd(i + 1) maybeThrow(err) return eval.String(s) }
// callFnAsPrompt calls a Fn with closed input, captures its output and convert // the output to a slice of *styled's. func callFnForPrompt(ed *Editor, fn eval.Fn) []*styled { ports := []*eval.Port{eval.DevNullClosedChan, &eval.Port{File: os.Stdout}, &eval.Port{File: os.Stderr}} // XXX There is no source to pass to NewTopEvalCtx. ec := eval.NewTopEvalCtx(ed.evaler, "[editor prompt]", "", ports) values, err := ec.PCaptureOutput(fn, nil, eval.NoOpts) if err != nil { ed.Notify("prompt function error: %v", err) return nil } var ss []*styled for _, v := range values { if s, ok := v.(*styled); ok { ss = append(ss, s) } else { ss = append(ss, &styled{eval.ToString(v), ""}) } } return ss }