// Interpret command and apply changes to editor. func execCommand(e *editor.Editor, command string) error { fields := strings.Fields(command) // prevent a crash if no commands are given if len(fields) == 0 { return nil } cmd, args := fields[0], fields[1:] switch cmd { case "q": // TODO if more than one split, close active one only. e.Quit() case "w": b := e.ActiveView().Buffer() switch len(args) { case 0: b.Save() case 1: b.SaveAs(args[0]) default: return fmt.Errorf("too many arguments to :w") } case "e": var filename string switch len(args) { case 0: return fmt.Errorf("TODO re-read current file, if any") case 1: filename = args[0] default: return fmt.Errorf("too many arguments for :e") } // TODO: Don't replace the current buffer if it has been modified buffer, err := e.NewBufferFromFile(filename) if err != nil { return err } e.ActiveView().Attach(buffer) case "sp", "split": e.SplitHorizontally() // TODO file argument | shell command argument case "vsp", "vsplit": e.SplitVertically() case "nohls": e.ActiveView().ShowHighlights(false) case "hls": e.ActiveView().ShowHighlights(true) } if lineNum, err := strconv.Atoi(cmd); err == nil { // cmd is a number, we should move to that line e.ActiveView().MoveCursorToLine(lineNum) } return nil }