From 4bca49f807544bd948a5f5f78e3787411252650f Mon Sep 17 00:00:00 2001 From: Petter Rodhelind Date: Thu, 22 Feb 2018 23:15:13 +0100 Subject: first commit --- commands.go | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 commands.go (limited to 'commands.go') diff --git a/commands.go b/commands.go new file mode 100644 index 0000000..023a112 --- /dev/null +++ b/commands.go @@ -0,0 +1,124 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "strings" +) + +type CommandFunc func(args string) + +var poecmds map[string]CommandFunc + +func InitCommands() { + poecmds = map[string]CommandFunc{ + "Exit": CmdExit, + "New": CmdNew, + "Del": CmdDel, + "Edit": CmdEdit, + "Newcol": CmdNewcol, + } +} + +func RunCommand(input string) { + if input == "" { + return + } + + input = strings.Trim(input, "\t\n ") + + // check poe default commands + cmd := strings.Split(string(input), " ") + if fn, ok := poecmds[cmd[0]]; ok { + fn(strings.TrimPrefix(input, cmd[0])) + return + } + + // Edit shortcuts for external commands and piping + switch input[0] { + case '!': + fallthrough + case '<': + fallthrough + case '>': + fallthrough + case '|': + CmdEdit(input) + } +} + +func CmdExit(args string) { + ok := true + for _, win := range AllWindows() { + if !win.CanClose() { + ok = false + } + } + if ok { + quit <- true + } +} + +func CmdNewcol(args string) { + screen.Clear() + screen.Sync() + workspace.AddCol() + CmdNew("") +} + +func CmdNew(args string) { + screen.Clear() + win := NewWindow(FnEmptyWin) + workspace.LastCol().AddWindow(win) +} + +func CmdOpen(fn string) { + screen.Clear() + var win *Window + win = FindWindow(fn) + if win == nil { // only load windows that do no already exists + win := NewWindow(fn) + workspace.LastCol().AddWindow(win) + win.LoadBuffer() + } +} + +func CmdDel(args string) { + CurWin.Close() +} + +func CmdEdit(args string) { + if len(args) < 2 { + return + } + + switch args[0] { + case 'f': + var names []string + for _, win := range AllWindows() { + names = append(names, fmt.Sprintf(" %3s %s", win.Flags(), win.Name())) + } + printMsg("buffers:\n%s\n", strings.Join(names, "\n")) + case '!': + os.Chdir(CurWin.Dir()) + cmd := strings.Split(string(args[1:]), " ") + path, err := exec.LookPath(cmd[0]) + if err != nil { // path not found, break with silence + //printMsg("path not found: %s\n", cmd[0]) + break + } + out, err := exec.Command(path, cmd[1:]...).Output() + if err != nil { + printMsg("error: %s\n", err) + break + } + // if command produced output, print it + outstr := string(out) + if outstr != "" { + printMsg("%s\n", outstr) + } + default: + printMsg("?\n") + } +} -- cgit v1.2.3