package main import ( "strings" "github.com/jroimartin/gocui" ) func editor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) { //state.HideHelp = true //if state.Mode == modeEscape { // escEditor(v, key, ch, mod) // return //} if ch != 0 && mod == 0 { v.EditWrite(ch) } switch key { case gocui.KeyEsc: //state.Mode = modeEscape //state.KeepAutoscrolling = true // Space, backspace, Del case gocui.KeySpace: v.EditWrite(' ') case gocui.KeyBackspace, gocui.KeyBackspace2: v.EditDelete(true) moveAhead(v) case gocui.KeyDelete: v.EditDelete(false) // Cursor movement case gocui.KeyArrowLeft: v.MoveCursor(-1, 0, false) moveAhead(v) case gocui.KeyArrowRight: x, _ := v.Cursor() x2, _ := v.Origin() x += x2 buf := v.Buffer() // I don't know really how this works, this was mostly obtained through trial // and error. Anyway, this system impedes going on a newline by moving right. // This is usually possible because once you write something to the buffer // it automatically adds " \n", which is two characters. Sooo yeah. if buf != "" && len(buf) > (x+2) { v.MoveCursor(1, 0, false) } case gocui.KeyEnter: buf := v.Buffer() v.Clear() v.SetCursor(0, 0) if buf != "" { buf = buf[:len(buf)-1] } if strings.TrimSpace(buf) != "" { //state.PushAction(buf) //state.ActionIndex = -1 } enterActionConnect(buf) } } func setText(v *gocui.View, text string) { v.Clear() // Why are we doing this? Because normally when you write a line // gocui adds " \n" at the end of it. Whe clearing and adding, though, // the space isn't added back. v.Write([]byte(text + " ")) v.SetCursor(len(text), 0) } // moveAhead displays the next 10 characters when moving backwards, // in order to see where we're moving or what we're deleting. func moveAhead(v *gocui.View) { cX, _ := v.Cursor() oX, _ := v.Origin() if cX < 10 && oX > 0 { newOX := oX - 10 forward := 10 if newOX < 0 { forward += newOX newOX = 0 } v.SetOrigin(newOX, 0) v.MoveCursor(forward, 0, false) } } func enterActionConnect(buf string) { //log.Printf("Connecting: %s",buf) connect(buf) } func moveDown(v *gocui.View) { _, yPos := v.Cursor() if _, err := v.Line(yPos + 1); err == nil { v.MoveCursor(0, 1, false) } }